[Gd-chatter] r11434 - trunk/fundev/sources/dfmc/c-run-time
hannes at gwydiondylan.org
hannes at gwydiondylan.org
Thu Aug 2 08:48:05 CEST 2007
Author: hannes
Date: Thu Aug 2 08:48:05 2007
New Revision: 11434
Modified:
trunk/fundev/sources/dfmc/c-run-time/run-time.c
trunk/fundev/sources/dfmc/c-run-time/run-time.h
Log:
Job: fd
updated patch for finalization.
This patch was submitted by Thomas Christian Chust
on gd-hackers@, 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 Thu Aug 2 08:48:05 2007
@@ -98,37 +98,34 @@
static struct _mps_finalization_queue {
D first;
struct _mps_finalization_queue *rest;
-} * mps_finalization_queue = NULL;
+} *mps_finalization_queue = NULL;
-/* XXX: [by bruce hoult via mail on 30 July 2007]
-> this does a GC_NEW() from within the finalizer, which is called
-> from within the GC. Therefore the GC is entered recursively. This is
-> very very bad and will bite you one day and you won't know why.
-*/
-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;
+static void mps_finalization_proc(D obj, struct _mps_finalization_queue *cons) {
+ cons->first = obj;
do {
- new_finalization_queue->rest = mps_finalization_queue;
- } while (!CONDITIONAL_UPDATE(mps_finalization_queue,
- new_finalization_queue,
- new_finalization_queue->rest));
+ cons->rest = mps_finalization_queue;
+ } while (!CONDITIONAL_UPDATE(mps_finalization_queue, cons, cons->rest));
}
-void primitive_mps_finalize(void *obj) {
- GC_register_finalizer(obj, mps_finalization_proc, NULL, NULL, NULL);
+void primitive_mps_finalize(D obj) {
+ GC_register_finalizer(obj,
+ (GC_finalization_proc)mps_finalization_proc,
+ GC_NEW(struct _mps_finalization_queue),
+ 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);
+D primitive_mps_finalization_queue_first() {
+ struct _mps_finalization_queue *queue;
+
+ RETRY:
+ if ((queue = mps_finalization_queue)) {
+ if (!CONDITIONAL_UPDATE(mps_finalization_queue, queue->rest, queue))
+ goto RETRY;
+
+ return(queue->first);
}
- else
- return(NULL);
+
+ return(NULL);
}
void primitive_mps_collect (DBOOL ignored) {
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 Thu Aug 2 08:48:05 2007
@@ -1045,7 +1045,7 @@
#define primitive_pin_object(x) (x)
extern void primitive_unpin_object(D);
extern void primitive_mps_finalize(D);
-extern void* primitive_mps_finalization_queue_first();
+extern D primitive_mps_finalization_queue_first();
#define primitive_mps_park()
#define primitive_mps_clamp()
#define primitive_mps_release()
More information about the chatter
mailing list