Add GC_reachable_here after GC_END_STUBBORN_CHANGE in cords
authorIvan Maidanski <ivmai@mail.ru>
Thu, 21 Jun 2018 10:38:56 +0000 (13:38 +0300)
committerIvan Maidanski <ivmai@mail.ru>
Thu, 21 Jun 2018 10:38:56 +0000 (13:38 +0300)
(fix of commit e12e820f3)

* cord/cordbscs.c (CORD_cat_char_star, CORD_cat, CORD_from_fn_inner,
CORD_substr_closure): Call GC_END_STUBBORN_CHANGE() instead of
GC_end_stubborn_change().
* cord/cordxtra.c (refill_cache): Likewise.
* cord/tests/de.c (prune_map, add_map, add_hist, replace_line,
generic_init): Likewise.
* cord/cordbscs.c (CORD_cat_char_star, CORD_cat): Mark x and y as
reachable after GC_END_STUBBORN_CHANGE(result).
* cord/cordbscs.c (CORD_from_fn_inner): Mark client_data as reachable
after GC_END_STUBBORN_CHANGE(result).
* cord/cordbscs.c (CORD_substr_closure): Mark x as reachable after
GC_END_STUBBORN_CHANGE(sa).
* cord/tests/de.c (prune_map): Mark saved map->previous->previous as
reachable after GC_END_STUBBORN_CHANGE(map).
* cord/tests/de.c (add_map): Mark saved current_map as reachable after
GC_END_STUBBORN_CHANGE(new_map).
* cord/tests/de.c (replace_line): Mark s as reachable after
GC_END_STUBBORN_CHANGE(screen+i).

cord/cordbscs.c
cord/cordxtra.c
cord/tests/de.c

index 864eef9..7979ff7 100644 (file)
@@ -232,7 +232,9 @@ CORD CORD_cat_char_star(CORD x, const char * y, size_t leny)
         result->len = (word)result_len;
         result->left = x;
         result->right = y;
-        GC_end_stubborn_change(result);
+        GC_END_STUBBORN_CHANGE(result);
+        GC_reachable_here(x);
+        GC_reachable_here(y);
         if (depth >= MAX_DEPTH) {
             return(CORD_balance((CORD)result));
         } else {
@@ -274,7 +276,9 @@ CORD CORD_cat(CORD x, CORD y)
         result->len = (word)result_len;
         result->left = x;
         result->right = y;
-        GC_end_stubborn_change(result);
+        GC_END_STUBBORN_CHANGE(result);
+        GC_reachable_here(x);
+        GC_reachable_here(y);
         if (depth >= MAX_DEPTH) {
             return(CORD_balance((CORD)result));
         } else {
@@ -315,7 +319,8 @@ static CordRep *CORD_from_fn_inner(CORD_fn fn, void * client_data, size_t len)
         result->len = (word)len;
         result->fn = fn;
         result->client_data = client_data;
-        GC_end_stubborn_change(result);
+        GC_END_STUBBORN_CHANGE(result);
+        GC_reachable_here(client_data);
         return (CordRep *)result;
     }
 }
@@ -366,7 +371,8 @@ CORD CORD_substr_closure(CORD x, size_t i, size_t n, CORD_fn f)
     if (sa == 0) OUT_OF_MEMORY;
     sa->sa_cord = (CordRep *)x;
     sa->sa_index = i;
-    GC_end_stubborn_change(sa);
+    GC_END_STUBBORN_CHANGE(sa);
+    GC_reachable_here(x);
     result = CORD_from_fn_inner(f, (void *)sa, n);
     if ((CORD)result != CORD_EMPTY && 0 == result -> function.null)
         result -> function.header = SUBSTR_HDR;
index 62b1f83..b1694c2 100644 (file)
@@ -547,7 +547,7 @@ static void * GC_CALLBACK refill_cache(void * client_data)
     new_cache -> tag = DIV_LINE_SZ(file_pos);
     /* Store barrier goes here. */
     ATOMIC_WRITE(state -> lf_cache[line_no], new_cache);
-    GC_end_stubborn_change((/* no volatile */ void *)(state -> lf_cache
+    GC_END_STUBBORN_CHANGE((/* no volatile */ void *)(state -> lf_cache
                                                       + line_no));
     state -> lf_current = line_start + LINE_SZ;
     return (void *)((GC_word)new_cache->data[MOD_LINE_SZ(file_pos)]);
index adfd0e3..522da91 100644 (file)
@@ -137,8 +137,11 @@ void prune_map(void)
     do {
         current_map_size++;
         if (map -> line < start_line - LINES && map -> previous != 0) {
-            map -> previous = map -> previous -> previous;
-            GC_end_stubborn_change(map);
+            line_map pred = map -> previous -> previous;
+
+            map -> previous = pred;
+            GC_END_STUBBORN_CHANGE(map);
+            GC_reachable_here(pred);
         }
         map = map -> previous;
     } while (map != 0);
@@ -148,13 +151,16 @@ void prune_map(void)
 void add_map(int line_arg, size_t pos)
 {
     line_map new_map = GC_NEW(struct LineMapRep);
+    line_map cur_map;
 
     if (NULL == new_map) OUT_OF_MEMORY;
     if (current_map_size >= MAX_MAP_SIZE) prune_map();
     new_map -> line = line_arg;
     new_map -> pos = pos;
-    new_map -> previous = current_map;
-    GC_end_stubborn_change(new_map);
+    cur_map = current_map;
+    new_map -> previous = cur_map;
+    GC_END_STUBBORN_CHANGE(new_map);
+    GC_reachable_here(cur_map);
     current_map = new_map;
     current_map_size++;
 }
@@ -200,10 +206,10 @@ void add_hist(CORD s)
     new_file -> file_contents = current = s;
     current_len = CORD_len(s);
     new_file -> previous = now;
-    GC_end_stubborn_change(new_file);
+    GC_END_STUBBORN_CHANGE(new_file);
     if (now != NULL) {
         now -> map = current_map;
-        GC_end_stubborn_change(now);
+        GC_END_STUBBORN_CHANGE(now);
     }
     now = new_file;
 }
@@ -255,7 +261,8 @@ void replace_line(int i, CORD s)
             }
         }
         screen[i] = s;
-        GC_end_stubborn_change(screen + i);
+        GC_END_STUBBORN_CHANGE(screen + i);
+        GC_reachable_here(s);
     }
 }
 #else
@@ -577,7 +584,7 @@ void generic_init(void)
     add_hist(initial);
     now -> map = current_map;
     now -> previous = now;  /* Can't back up further: beginning of the world */
-    GC_end_stubborn_change(now);
+    GC_END_STUBBORN_CHANGE(now);
     need_redisplay = ALL;
     fix_cursor();
 }