[project @ 2004-08-22 15:50:39 by panne]
[ghc-hetmet.git] / ghc / rts / Stable.c
index 72b3a98..815bac7 100644 (file)
@@ -1,5 +1,5 @@
 /* -----------------------------------------------------------------------------
- * $Id: Stable.c,v 1.25 2003/03/31 19:19:34 sof Exp $
+ * $Id: Stable.c,v 1.29 2004/08/22 15:50:42 panne Exp $
  *
  * (c) The GHC Team, 1998-2002
  *
@@ -13,7 +13,6 @@
 #include "PosixSource.h"
 #include "Rts.h"
 #include "Hash.h"
-#include "StablePriv.h"
 #include "RtsUtils.h"
 #include "Storage.h"
 #include "RtsAPI.h"
   There may be additional functions on the C side to allow evaluation,
   application, etc of a stable pointer.
 
-  When Haskell calls C, it normally just passes over primitive integers,
-  floats, bools, strings, etc.  This doesn't cause any problems at all
-  for garbage collection because the act of passing them makes a copy
-  from the heap, stack or wherever they are onto the C-world stack.
-  However, if we were to pass a heap object such as a (Haskell) @String@
-  and a garbage collection occured before we finished using it, we'd run
-  into problems since the heap object might have been moved or even
-  deleted.
-
-  So, if a C call is able to cause a garbage collection or we want to
-  store a pointer to a heap object between C calls, we must be careful
-  when passing heap objects. Our solution is to keep a table of all
-  objects we've given to the C-world and to make sure that the garbage
-  collector collects these objects --- updating the table as required to
-  make sure we can still find the object.
 */
 
 snEntry *stable_ptr_table = NULL;
@@ -132,7 +116,7 @@ static HashTable *addrToStableHash = NULL;
 
 #define INIT_SPT_SIZE 64
 
-static inline void
+STATIC_INLINE void
 initFreeList(snEntry *table, nat n, snEntry *free)
 {
   snEntry *p;
@@ -180,6 +164,7 @@ StgWord
 lookupStableName(StgPtr p)
 {
   StgWord sn;
+  void* sn_tmp;
 
   if (stable_ptr_free == NULL) {
     enlargeStablePtrTable();
@@ -190,7 +175,8 @@ lookupStableName(StgPtr p)
    */
   p = (StgPtr)removeIndirections((StgClosure*)p);
 
-  (void *)sn = lookupHashTable(addrToStableHash,(W_)p);
+  sn_tmp = lookupHashTable(addrToStableHash,(W_)p);
+  sn = (StgWord)sn_tmp;
   
   if (sn != 0) {
     ASSERT(stable_ptr_table[sn].addr == p);
@@ -198,7 +184,7 @@ lookupStableName(StgPtr p)
     return sn;
   } else {
     sn = stable_ptr_free - stable_ptr_table;
-    (P_)stable_ptr_free  = stable_ptr_free->addr;
+    stable_ptr_free  = (snEntry*)(stable_ptr_free->addr);
     stable_ptr_table[sn].ref = 0;
     stable_ptr_table[sn].addr = p;
     stable_ptr_table[sn].sn_obj = NULL;
@@ -212,7 +198,7 @@ lookupStableName(StgPtr p)
   }
 }
 
-static inline void
+STATIC_INLINE void
 freeStableName(snEntry *sn)
 {
   ASSERT(sn->sn_obj == NULL);
@@ -393,7 +379,7 @@ gcStablePtrTable( void )
                    continue;
                    
                } else {
-                   (StgClosure *)p->addr = isAlive((StgClosure *)p->addr);
+                 p->addr = (StgPtr)isAlive((StgClosure *)p->addr);
                    IF_DEBUG(stable, fprintf(stderr,"Stable name %d still alive at %p, ref %d\n", p - stable_ptr_table, p->addr, p->ref));
                }
            }