[Gd-chatter] r11426 - trunk/fundev/sources/dfmc/c-run-time
hannes at gwydiondylan.org
hannes at gwydiondylan.org
Sun Jul 29 21:26:32 CEST 2007
Author: hannes
Date: Sun Jul 29 21:26:31 2007
New Revision: 11426
Modified:
trunk/fundev/sources/dfmc/c-run-time/run-time.c
trunk/fundev/sources/dfmc/c-run-time/run-time.h
Log:
Job: fd
Implementing finalization with boehm-gc used by the c-back-end.
This patch was submitted by Thomas Christian Chust, thanks.
Modified: trunk/fundev/sources/dfmc/c-run-time/run-time.c
==============================================================================
--- trunk/fundev/sources/dfmc/c-run-time/run-time.c (original)
+++ trunk/fundev/sources/dfmc/c-run-time/run-time.c Sun Jul 29 21:26:31 2007
@@ -95,6 +95,37 @@
return(header);
}
+static struct _mps_finalization_queue {
+ D first;
+ struct _mps_finalization_queue *rest;
+} * mps_finalization_queue = NULL;
+
+static void mps_finalization_proc(D obj, void *data) {
+ struct _mps_finalization_queue *new_finalization_queue =
+ GC_NEW(struct _mps_finalization_queue);
+
+ new_finalization_queue->first = obj;
+ do {
+ new_finalization_queue->rest = mps_finalization_queue;
+ } while (!CONDITIONAL_UPDATE(mps_finalization_queue,
+ new_finalization_queue,
+ new_finalization_queue->rest));
+}
+
+void primitive_mps_finalize(void *obj) {
+ GC_register_finalizer(obj, mps_finalization_proc, NULL, NULL, NULL);
+}
+
+void* primitive_mps_finalization_queue_first() {
+ if (mps_finalization_queue) {
+ D obj = mps_finalization_queue->first;
+ mps_finalization_queue = mps_finalization_queue->rest;
+ return(obj);
+ }
+ else
+ return(NULL);
+}
+
void primitive_mps_collect (DBOOL ignored) {
ignore(ignored);
GC_gcollect();
Modified: trunk/fundev/sources/dfmc/c-run-time/run-time.h
==============================================================================
--- trunk/fundev/sources/dfmc/c-run-time/run-time.h (original)
+++ trunk/fundev/sources/dfmc/c-run-time/run-time.h Sun Jul 29 21:26:31 2007
@@ -1044,8 +1044,8 @@
#define primitive_gc_state() (I(0)) /* !@#$ DUMMY DEFN */
#define primitive_pin_object(x) (x)
extern void primitive_unpin_object(D);
-#define primitive_mps_finalize(x) { }
-#define primitive_mps_finalization_queue_first() ((D)0)
+extern void primitive_mps_finalize(D);
+extern void* primitive_mps_finalization_queue_first();
#define primitive_mps_park()
#define primitive_mps_clamp()
#define primitive_mps_release()
More information about the chatter
mailing list