[commit: ghc] master: Stable.c: minor refactoring, add/update some comments (acb7361)

git at git.haskell.org git at git.haskell.org
Wed Apr 25 17:43:36 UTC 2018


Repository : ssh://git@git.haskell.org/ghc

On branch  : master
Link       : http://ghc.haskell.org/trac/ghc/changeset/acb73617abb23a16c2195459d8cefbf3febe26f3/ghc

>---------------------------------------------------------------

commit acb73617abb23a16c2195459d8cefbf3febe26f3
Author: Ömer Sinan Ağacan <omeragacan at gmail.com>
Date:   Wed Apr 25 20:42:26 2018 +0300

    Stable.c: minor refactoring, add/update some comments
    
    Test Plan: Passes validate
    
    Reviewers: simonmar, bgamari, erikd
    
    Subscribers: thomie, carter
    
    GHC Trac Issues: #10296
    
    Differential Revision: https://phabricator.haskell.org/D4627


>---------------------------------------------------------------

acb73617abb23a16c2195459d8cefbf3febe26f3
 includes/rts/Stable.h | 16 ++++++++++++----
 rts/Stable.c          | 49 ++++++++++++++++++++-----------------------------
 2 files changed, 32 insertions(+), 33 deletions(-)

diff --git a/includes/rts/Stable.h b/includes/rts/Stable.h
index 75fcf4f..4550ad6 100644
--- a/includes/rts/Stable.h
+++ b/includes/rts/Stable.h
@@ -21,13 +21,21 @@ StgStablePtr getStablePtr  (StgPtr p);
    -------------------------------------------------------------------------- */
 
 typedef struct {
-    StgPtr  addr;                       /* Haskell object, free list, or NULL */
-    StgPtr  old;                        /* old Haskell object, used during GC */
-    StgClosure *sn_obj;         /* the StableName object (or NULL) */
+    StgPtr  addr;        // Haskell object when entry is in use, next free
+                         // entry (NULL when this is the last free entry)
+                         // otherwise. May be NULL temporarily during GC (when
+                         // pointee dies).
+
+    StgPtr  old;         // Old Haskell object, used during GC
+
+    StgClosure *sn_obj;  // The StableName object, or NULL when the entry is
+                         // free
 } snEntry;
 
 typedef struct {
-    StgPtr addr;
+    StgPtr addr;         // Haskell object when entry is in use, next free
+                         // entry (NULL when this is the last free entry)
+                         // otherwise.
 } spEntry;
 
 extern DLL_IMPORT_RTS snEntry *stable_name_table;
diff --git a/rts/Stable.c b/rts/Stable.c
index ecf216a..71eaf1a 100644
--- a/rts/Stable.c
+++ b/rts/Stable.c
@@ -181,7 +181,7 @@ initStableTables(void)
 {
     if (SNT_size > 0) return;
     SNT_size = INIT_SNT_SIZE;
-    stable_name_table = stgMallocBytes(SNT_size * sizeof *stable_name_table,
+    stable_name_table = stgMallocBytes(SNT_size * sizeof(snEntry),
                                        "initStableNameTable");
     /* we don't use index 0 in the stable name table, because that
      * would conflict with the hash table lookup operations which
@@ -192,7 +192,7 @@ initStableTables(void)
 
     if (SPT_size > 0) return;
     SPT_size = INIT_SPT_SIZE;
-    stable_ptr_table = stgMallocBytes(SPT_size * sizeof *stable_ptr_table,
+    stable_ptr_table = stgMallocBytes(SPT_size * sizeof(spEntry),
                                       "initStablePtrTable");
     initSpEntryFreeList(stable_ptr_table,INIT_SPT_SIZE,NULL);
 
@@ -214,12 +214,13 @@ enlargeStableNameTable(void)
     SNT_size *= 2;
     stable_name_table =
         stgReallocBytes(stable_name_table,
-                        SNT_size * sizeof *stable_name_table,
+                        SNT_size * sizeof(snEntry),
                         "enlargeStableNameTable");
 
     initSnEntryFreeList(stable_name_table + old_SNT_size, old_SNT_size, NULL);
 }
 
+// Must be holding stable_mutex
 static void
 enlargeStablePtrTable(void)
 {
@@ -233,11 +234,11 @@ enlargeStablePtrTable(void)
      * [Enlarging the stable pointer table].
      */
     new_stable_ptr_table =
-        stgMallocBytes(SPT_size * sizeof *stable_ptr_table,
+        stgMallocBytes(SPT_size * sizeof(spEntry),
                        "enlargeStablePtrTable");
     memcpy(new_stable_ptr_table,
            stable_ptr_table,
-           old_SPT_size * sizeof *stable_ptr_table);
+           old_SPT_size * sizeof(spEntry));
     ASSERT(n_old_SPTs < MAX_N_OLD_SPTS);
     old_SPTs[n_old_SPTs++] = stable_ptr_table;
 
@@ -376,9 +377,6 @@ removeIndirections (StgClosure* p)
 StgWord
 lookupStableName (StgPtr p)
 {
-  StgWord sn;
-  const void* sn_tmp;
-
   stableLock();
 
   if (stable_name_free == NULL) {
@@ -393,8 +391,7 @@ lookupStableName (StgPtr p)
   // register the untagged pointer.  This just makes things simpler.
   p = (StgPtr)UNTAG_CLOSURE((StgClosure*)p);
 
-  sn_tmp = lookupHashTable(addrToStableHash,(W_)p);
-  sn = (StgWord)sn_tmp;
+  StgWord sn = (StgWord)lookupHashTable(addrToStableHash,(W_)p);
 
   if (sn != 0) {
     ASSERT(stable_name_table[sn].addr == p);
@@ -531,7 +528,7 @@ threadStableTables( evac_fn evac, void *user )
 }
 
 /* -----------------------------------------------------------------------------
- * Garbage collect any dead entries in the stable pointer table.
+ * Garbage collect any dead entries in the stable name table.
  *
  * A dead entry has:
  *
@@ -549,32 +546,26 @@ gcStableTables( void )
 {
     FOR_EACH_STABLE_NAME(
         p, {
-            // Update the pointer to the StableName object, if there is one
+            // FOR_EACH_STABLE_NAME traverses free entries too, so
+            // check sn_obj
             if (p->sn_obj != NULL) {
+                // Update the pointer to the StableName object, if there is one
                 p->sn_obj = isAlive(p->sn_obj);
-                if(p->sn_obj == NULL) {
+                if (p->sn_obj == NULL) {
                     // StableName object died
                     debugTrace(DEBUG_stable, "GC'd StableName %ld (addr=%p)",
                                (long)(p - stable_name_table), p->addr);
                     freeSnEntry(p);
-                    /* Can't "continue", so use goto */
-                    goto next_stable_name;
-                }
-            }
-            /* If sn_obj became NULL, the object died, and addr is now
-             * invalid. But if sn_obj was null, then the StableName
-             * object may not have been created yet, while the pointee
-             * already exists and must be updated to new location. */
-            if (p->addr != NULL) {
-                p->addr = (StgPtr)isAlive((StgClosure *)p->addr);
-                if(p->addr == NULL) {
-                    // StableName pointee died
-                    debugTrace(DEBUG_stable, "GC'd pointee %ld",
-                               (long)(p - stable_name_table));
+                } else if (p->addr != NULL) {
+                    // sn_obj is alive, update pointee
+                    p->addr = (StgPtr)isAlive((StgClosure *)p->addr);
+                    if (p->addr == NULL) {
+                        // Pointee died
+                        debugTrace(DEBUG_stable, "GC'd pointee %ld",
+                                   (long)(p - stable_name_table));
+                    }
                 }
             }
-    next_stable_name:
-            if (0) {}
         });
 }
 



More information about the ghc-commits mailing list