rts: Shrink size of STACK's dirty and marking fields
authorBen Gamari <ben@smart-cactus.org>
Fri, 18 Oct 2019 20:21:19 +0000 (16:21 -0400)
committerBen Gamari <ben@smart-cactus.org>
Mon, 21 Oct 2019 01:15:52 +0000 (21:15 -0400)
includes/rts/storage/TSO.h
includes/stg/SMP.h
rts/sm/NonMovingMark.c

index d56ae8a..070ecbe 100644 (file)
@@ -240,8 +240,8 @@ typedef struct StgTSO_ {
 typedef struct StgStack_ {
     StgHeader  header;
     StgWord32  stack_size;     // stack size in *words*
-    StgWord    dirty;          // non-zero => dirty
-    StgWord    marking;        // non-zero => someone is currently marking the stack
+    StgWord8   dirty;          // non-zero => dirty
+    StgWord8   marking;        // non-zero => someone is currently marking the stack
     StgPtr     sp;             // current stack pointer
     StgWord    stack[];
 } StgStack;
index 4be11d1..260a916 100644 (file)
@@ -49,6 +49,7 @@ EXTERN_INLINE StgWord xchg(StgPtr p, StgWord w);
  * }
  */
 EXTERN_INLINE StgWord cas(StgVolatilePtr p, StgWord o, StgWord n);
+EXTERN_INLINE StgWord8 cas_word8(StgWord8 *volatile p, StgWord8 o, StgWord8 n);
 
 /*
  * Atomic addition by the provided quantity
@@ -283,6 +284,12 @@ cas(StgVolatilePtr p, StgWord o, StgWord n)
     return __sync_val_compare_and_swap(p, o, n);
 }
 
+EXTERN_INLINE StgWord8
+cas_word8(StgWord8 *volatile p, StgWord8 o, StgWord8 n)
+{
+    return __sync_val_compare_and_swap(p, o, n);
+}
+
 // RRN: Generalized to arbitrary increments to enable fetch-and-add in
 // Haskell code (fetchAddIntArray#).
 // PT: add-and-fetch, returns new value
@@ -428,6 +435,18 @@ cas(StgVolatilePtr p, StgWord o, StgWord n)
     return result;
 }
 
+EXTERN_INLINE StgWord8 cas_word8(StgWord8 *volatile p, StgWord8 o, StgWord8 n);
+EXTERN_INLINE StgWord8
+cas_word8(StgWord8 *volatile p, StgWord8 o, StgWord8 n)
+{
+    StgWord8 result;
+    result = *p;
+    if (result == o) {
+        *p = n;
+    }
+    return result;
+}
+
 EXTERN_INLINE StgWord atomic_inc(StgVolatilePtr p, StgWord incr);
 EXTERN_INLINE StgWord
 atomic_inc(StgVolatilePtr p, StgWord incr)
index b273b09..9d046ce 100644 (file)
@@ -595,9 +595,9 @@ void updateRemembSetPushStack(Capability *cap, StgStack *stack)
 {
     // N.B. caller responsible for checking nonmoving_write_barrier_enabled
     if (needs_upd_rem_set_mark((StgClosure *) stack)) {
-        StgWord marking = stack->marking;
+        StgWord8 marking = stack->marking;
         // See Note [StgStack dirtiness flags and concurrent marking]
-        if (cas(&stack->marking, marking, nonmovingMarkEpoch)
+        if (cas_word8(&stack->marking, marking, nonmovingMarkEpoch)
               != nonmovingMarkEpoch) {
             // We have claimed the right to mark the stack.
             debugTrace(DEBUG_nonmoving_gc, "upd_rem_set: STACK %p", stack->sp);
@@ -1341,11 +1341,11 @@ mark_closure (MarkQueue *queue, StgClosure *p, StgClosure **origin)
     case STACK: {
         // See Note [StgStack dirtiness flags and concurrent marking]
         StgStack *stack = (StgStack *) p;
-        StgWord marking = stack->marking;
+        StgWord8 marking = stack->marking;
 
         // N.B. stack->marking must be != nonmovingMarkEpoch unless
         // someone has already marked it.
-        if (cas(&stack->marking, marking, nonmovingMarkEpoch)
+        if (cas_word8(&stack->marking, marking, nonmovingMarkEpoch)
               != nonmovingMarkEpoch) {
             // We have claimed the right to mark the stack.
             mark_stack(queue, stack);