From e8e76b5d8f13994fa3b7d9ff9e0582a217f05f6b Mon Sep 17 00:00:00 2001 From: Ivan Maidanski Date: Thu, 21 Jun 2018 13:38:56 +0300 Subject: [PATCH] Add GC_reachable_here after GC_END_STUBBORN_CHANGE in cords (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 | 14 ++++++++++---- cord/cordxtra.c | 2 +- cord/tests/de.c | 23 +++++++++++++++-------- 3 files changed, 26 insertions(+), 13 deletions(-) diff --git a/cord/cordbscs.c b/cord/cordbscs.c index 864eef9..7979ff7 100644 --- a/cord/cordbscs.c +++ b/cord/cordbscs.c @@ -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; diff --git a/cord/cordxtra.c b/cord/cordxtra.c index 62b1f83..b1694c2 100644 --- a/cord/cordxtra.c +++ b/cord/cordxtra.c @@ -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)]); diff --git a/cord/tests/de.c b/cord/tests/de.c index adfd0e3..522da91 100644 --- a/cord/tests/de.c +++ b/cord/tests/de.c @@ -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(); } -- 2.7.4