summaryrefslogtreecommitdiff
path: root/cord
diff options
context:
space:
mode:
authorIvan Maidanski <ivmai@mail.ru>2018-06-21 13:38:56 +0300
committerIvan Maidanski <ivmai@mail.ru>2018-06-21 13:38:56 +0300
commite8e76b5d8f13994fa3b7d9ff9e0582a217f05f6b (patch)
tree5b7ef7ce517fb9d82fc906c704e505922fa5e845 /cord
parent4f2b34fc6de104b91bef324c2569302a12bc18f4 (diff)
downloadbdwgc-e8e76b5d8f13994fa3b7d9ff9e0582a217f05f6b.tar.gz
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).
Diffstat (limited to 'cord')
-rw-r--r--cord/cordbscs.c14
-rw-r--r--cord/cordxtra.c2
-rw-r--r--cord/tests/de.c23
3 files changed, 26 insertions, 13 deletions
diff --git a/cord/cordbscs.c b/cord/cordbscs.c
index 864eef91..7979ff74 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 62b1f830..b1694c26 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 adfd0e38..522da919 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();
}