[project @ 2002-05-14 08:25:46 by matthewc]
[ghc-hetmet.git] / ghc / rts / Weak.c
index c80cf8c..fabe792 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Weak.c,v 1.19 2001/11/22 14:25:13 simonmar Exp $
+ * $Id: Weak.c,v 1.23 2002/04/26 22:31:31 sof Exp $
  *
  * (c) The GHC Team, 1998-1999
  *
@@ -8,13 +8,14 @@
  * ---------------------------------------------------------------------------*/
 
 #include "PosixSource.h"
+#define COMPILING_RTS_MAIN
 #include "Rts.h"
-#include "RtsAPI.h"
 #include "SchedAPI.h"
 #include "RtsFlags.h"
 #include "Weak.h"
 #include "Storage.h"
 #include "Prelude.h"
+#include "RtsAPI.h"
 
 StgWeak *weak_ptr_list;
 
@@ -36,19 +37,10 @@ finalizeWeakPointersNow(void)
   while ((w = weak_ptr_list)) {
     weak_ptr_list = w->link;
     if (w->header.info != &stg_DEAD_WEAK_info) {
-        // @LDV profiling
-        // Even thought the info type of w changes, we DO NOT perform any
-        // LDV profiling because at this moment, LDV profiling must already
-        // have been terminated. See the comments in shutdownHaskell().
-        // At any rate, there is no need to call LDV_recordDead() because
-        // weak pointers are inherently used.
-#ifdef PROFILING
-        ASSERT(ldvTime == 0);   // LDV profiling is turned off.
-#endif
        w->header.info = &stg_DEAD_WEAK_info;
        IF_DEBUG(weak,fprintf(stderr,"Finalising weak pointer at %p -> %p\n", w, w->key));
        if (w->finalizer != &stg_NO_FINALIZER_closure) {
-           rts_evalIO(w->finalizer,NULL);
+           rts_mainEvalIO(w->finalizer,NULL);
        }
     }
   }
@@ -65,6 +57,8 @@ finalizeWeakPointersNow(void)
  * The weak pointer object itself may not be alive - i.e. we may be
  * looking at either an object in from-space or one in to-space.  It
  * doesn't really matter either way.
+ *
+ * Pre-condition: sched_mutex _not_ held.
  */
 
 void
@@ -77,7 +71,8 @@ scheduleFinalizers(StgWeak *list)
 
     /* count number of finalizers first... */
     for (n = 0, w = list; w; w = w->link) { 
-       if (w->finalizer != &stg_NO_FINALIZER_closure)
+       if (w->header.info != &stg_DEAD_WEAK_info &&
+           w->finalizer != &stg_NO_FINALIZER_closure)
            n++;
     }
        
@@ -90,7 +85,8 @@ scheduleFinalizers(StgWeak *list)
     arr->ptrs = n;
 
     for (n = 0, w = list; w; w = w->link) {
-       if (w->finalizer != &stg_NO_FINALIZER_closure) {
+       if (w->header.info != &stg_DEAD_WEAK_info &&
+           w->finalizer != &stg_NO_FINALIZER_closure) {
            arr->payload[n] = w->finalizer;
            n++;
        }