Skip to content

Commit

Permalink
Also check finalizer_list_marked list in jl_finalize. Fix #13986
Browse files Browse the repository at this point in the history
(cherry picked from commit 820601f)
ref #13988
  • Loading branch information
yuyichao authored and tkelman committed Nov 29, 2015
1 parent 5b48286 commit 11cb849
Showing 1 changed file with 15 additions and 12 deletions.
27 changes: 15 additions & 12 deletions src/gc.c
Original file line number Diff line number Diff line change
Expand Up @@ -333,26 +333,26 @@ static void run_finalizer(jl_value_t *o, jl_value_t *ff)
}
}

static int finalize_object(jl_value_t *o)
static void finalize_object(arraylist_t *list, jl_value_t *o)
{
int success = 0;
/* int success = 0; */
jl_value_t *f = NULL;
JL_GC_PUSH1(&f);
for(int i = 0; i < finalizer_list.len; i+=2) {
if (o == (jl_value_t*)finalizer_list.items[i]) {
f = (jl_value_t*)finalizer_list.items[i+1];
if (i < finalizer_list.len - 2) {
finalizer_list.items[i] = finalizer_list.items[finalizer_list.len-2];
finalizer_list.items[i+1] = finalizer_list.items[finalizer_list.len-1];
for(int i = 0; i < list->len; i+=2) {
if (o == (jl_value_t*)list->items[i]) {
f = (jl_value_t*)list->items[i+1];
if (i < list->len - 2) {
list->items[i] = list->items[list->len-2];
list->items[i+1] = list->items[list->len-1];
i -= 2;
}
finalizer_list.len -= 2;
list->len -= 2;
run_finalizer(o, f);
success = 1;
/* success = 1; */
}
}
JL_GC_POP();
return success;
/* return success; */
}

static void run_finalizers(void)
Expand Down Expand Up @@ -404,7 +404,10 @@ DLLEXPORT void jl_gc_add_finalizer(jl_value_t *v, jl_function_t *f)

void jl_finalize(jl_value_t *o)
{
(void)finalize_object(o);
// No need to check the to_finalize list since the user is apparently
// still holding a reference to the object
finalize_object(&finalizer_list, o);
finalize_object(&finalizer_list_marked, o);
}

static region_t *find_region(void *ptr, int maybe)
Expand Down

0 comments on commit 11cb849

Please sign in to comment.