rts/StableName: Expose FOR_EACH_STABLE_NAME, freeSnEntry, SNT_size
authorÖmer Sinan Ağacan <omer@well-typed.com>
Tue, 5 Feb 2019 05:40:27 +0000 (00:40 -0500)
committerBen Gamari <ben@smart-cactus.org>
Wed, 19 Jun 2019 00:33:55 +0000 (20:33 -0400)
These will be needed when we implement sweeping in the nonmoving
collector.

rts/StableName.c
rts/StableName.h

index 757eb59..383d87e 100644 (file)
@@ -21,7 +21,7 @@
 
 snEntry *stable_name_table = NULL;
 static snEntry *stable_name_free = NULL;
-static unsigned int SNT_size = 0;
+unsigned int SNT_size = 0;
 #define INIT_SNT_SIZE 64
 
 #if defined(THREADED_RTS)
@@ -128,7 +128,7 @@ exitStableNameTable(void)
 #endif
 }
 
-STATIC_INLINE void
+void
 freeSnEntry(snEntry *sn)
 {
   ASSERT(sn->sn_obj == NULL);
@@ -218,27 +218,6 @@ lookupStableName (StgPtr p)
  * Remember old stable name addresses
  * -------------------------------------------------------------------------- */
 
-#define FOR_EACH_STABLE_NAME(p, CODE)                                   \
-    do {                                                                \
-        snEntry *p;                                                     \
-        snEntry *__end_ptr = &stable_name_table[SNT_size];              \
-        for (p = stable_name_table + 1; p < __end_ptr; p++) {           \
-            /* Internal pointers are free slots.  */                    \
-            /* If p->addr == NULL, it's a */                            \
-            /* stable name where the object has been GC'd, but the */   \
-            /* StableName object (sn_obj) is still alive. */            \
-            if ((p->addr < (P_)stable_name_table ||                     \
-                 p->addr >= (P_)__end_ptr))                             \
-            {                                                           \
-                /* NOTE: There is an ambiguity here if p->addr == NULL */ \
-                /* it is either the last item in the free list or it */ \
-                /* is a stable name whose pointee died. sn_obj == NULL */ \
-                /* disambiguates as last free list item. */             \
-                do { CODE } while(0);                                   \
-            }                                                           \
-        }                                                               \
-    } while(0)
-
 void
 rememberOldStableNameAddresses(void)
 {
index 6b5e551..e5903bb 100644 (file)
@@ -11,7 +11,8 @@
 #include "BeginPrivate.h"
 
 void    initStableNameTable   ( void );
-void    exitStableNameTable      ( void );
+void    freeSnEntry           ( snEntry *sn );
+void    exitStableNameTable   ( void );
 StgWord lookupStableName      ( StgPtr p );
 
 void    rememberOldStableNameAddresses ( void );
@@ -23,6 +24,29 @@ void    updateStableNameTable ( bool full );
 void    stableNameLock            ( void );
 void    stableNameUnlock          ( void );
 
+extern unsigned int SNT_size;
+
+#define FOR_EACH_STABLE_NAME(p, CODE)                                   \
+    do {                                                                \
+        snEntry *p;                                                     \
+        snEntry *__end_ptr = &stable_name_table[SNT_size];              \
+        for (p = stable_name_table + 1; p < __end_ptr; p++) {           \
+            /* Internal pointers are free slots.  */                    \
+            /* If p->addr == NULL, it's a */                            \
+            /* stable name where the object has been GC'd, but the */   \
+            /* StableName object (sn_obj) is still alive. */            \
+            if ((p->addr < (P_)stable_name_table ||                     \
+                 p->addr >= (P_)__end_ptr))                             \
+            {                                                           \
+                /* NOTE: There is an ambiguity here if p->addr == NULL */ \
+                /* it is either the last item in the free list or it */ \
+                /* is a stable name whose pointee died. sn_obj == NULL */ \
+                /* disambiguates as last free list item. */             \
+                do { CODE } while(0);                                   \
+            }                                                           \
+        }                                                               \
+    } while(0)
+
 #if defined(THREADED_RTS)
 // needed by Schedule.c:forkProcess()
 extern Mutex stable_name_mutex;