Skip to content

Commit 2b153c6

Browse files
authored
Use Julia's finalizer implementation (#78)
This PR updates to mmtk/julia#22. * Remove code about registering and running finalizers (we use whatever Julia does). * Add code for finalizer scanning in Rust.
1 parent ee0b3c3 commit 2b153c6

File tree

10 files changed

+321
-212
lines changed

10 files changed

+321
-212
lines changed

.gitignore

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,4 @@
11
.idea/
22
julia/*.o
3-
.vscode
3+
julia/*.dbj.obj
4+
.vscode

julia/mmtk_julia.c

Lines changed: 29 additions & 46 deletions
Original file line numberDiff line numberDiff line change
@@ -346,61 +346,39 @@ size_t get_so_size(void* obj_raw)
346346
return 0;
347347
}
348348

349-
void run_finalizer_function(void *o_raw, void *ff_raw, bool is_ptr)
350-
{
351-
jl_value_t *o = (jl_value_t*) o_raw;
352-
jl_value_t *ff = (jl_value_t*) ff_raw;
353-
if (is_ptr) {
354-
run_finalizer(jl_current_task, (jl_value_t *)(((uintptr_t)o) | 1), (jl_value_t *)ff);
355-
} else {
356-
run_finalizer(jl_current_task, (jl_value_t *) o, (jl_value_t *)ff);
349+
extern void run_finalizers(jl_task_t *ct);
350+
351+
// Called after GC to run finalizers
352+
void mmtk_jl_run_finalizers(void* ptls_raw) {
353+
jl_ptls_t ptls = (jl_ptls_t) ptls_raw;
354+
if (!ptls->finalizers_inhibited && ptls->locks.len == 0) {
355+
JL_TIMING(GC, GC_Finalizers);
356+
run_finalizers(jl_current_task);
357357
}
358358
}
359359

360+
// We implement finalization in the binding side. These functions
361+
// returns some pointers so MMTk can manipulate finalizer lists.
362+
363+
extern jl_mutex_t finalizers_lock;
364+
extern arraylist_t to_finalize;
365+
extern arraylist_t finalizer_list_marked;
360366

361-
static inline void mmtk_jl_run_finalizers_in_list(bool at_exit) {
362-
jl_task_t* ct = jl_current_task;
363-
uint8_t sticky = ct->sticky;
364-
mmtk_run_finalizers(at_exit);
365-
ct->sticky = sticky;
367+
void* get_thread_finalizer_list(void* ptls_raw) {
368+
jl_ptls_t ptls = (jl_ptls_t) ptls_raw;
369+
return (void*)&ptls->finalizers;
366370
}
367371

368-
void mmtk_jl_run_pending_finalizers(void* ptls) {
369-
if (!((jl_ptls_t)ptls)->in_finalizer && !((jl_ptls_t)ptls)->finalizers_inhibited && ((jl_ptls_t)ptls)->locks.len == 0) {
370-
jl_task_t *ct = jl_current_task;
371-
((jl_ptls_t)ptls)->in_finalizer = 1;
372-
uint64_t save_rngState[JL_RNG_SIZE];
373-
memcpy(&save_rngState[0], &ct->rngState[0], sizeof(save_rngState));
374-
jl_rng_split(ct->rngState, finalizer_rngState);
375-
jl_atomic_store_relaxed(&jl_gc_have_pending_finalizers, 0);
376-
mmtk_jl_run_finalizers_in_list(false);
377-
memcpy(&ct->rngState[0], &save_rngState[0], sizeof(save_rngState));
378-
((jl_ptls_t)ptls)->in_finalizer = 0;
379-
}
372+
void* get_to_finalize_list(void) {
373+
return (void*)&to_finalize;
380374
}
381375

382-
void mmtk_jl_run_finalizers(void* ptls) {
383-
// Only disable finalizers on current thread
384-
// Doing this on all threads is racy (it's impossible to check
385-
// or wait for finalizers on other threads without dead lock).
386-
if (!((jl_ptls_t)ptls)->finalizers_inhibited && ((jl_ptls_t)ptls)->locks.len == 0) {
387-
jl_task_t *ct = jl_current_task;
388-
int8_t was_in_finalizer = ((jl_ptls_t)ptls)->in_finalizer;
389-
((jl_ptls_t)ptls)->in_finalizer = 1;
390-
uint64_t save_rngState[JL_RNG_SIZE];
391-
memcpy(&save_rngState[0], &ct->rngState[0], sizeof(save_rngState));
392-
jl_rng_split(ct->rngState, finalizer_rngState);
393-
jl_atomic_store_relaxed(&jl_gc_have_pending_finalizers, 0);
394-
mmtk_jl_run_finalizers_in_list(false);
395-
memcpy(&ct->rngState[0], &save_rngState[0], sizeof(save_rngState));
396-
((jl_ptls_t)ptls)->in_finalizer = was_in_finalizer;
397-
} else {
398-
jl_atomic_store_relaxed(&jl_gc_have_pending_finalizers, 1);
399-
}
376+
void* get_marked_finalizers_list(void) {
377+
return (void*)&finalizer_list_marked;
400378
}
401379

402-
void mmtk_jl_gc_run_all_finalizers(void) {
403-
mmtk_jl_run_finalizers_in_list(true);
380+
int* get_jl_gc_have_pending_finalizers(void) {
381+
return (int*)&jl_gc_have_pending_finalizers;
404382
}
405383

406384
// add the initial root set to mmtk roots
@@ -928,7 +906,7 @@ Julia_Upcalls mmtk_upcalls = (Julia_Upcalls) {
928906
.scan_julia_exc_obj = scan_julia_exc_obj,
929907
.get_stackbase = get_stackbase,
930908
.calculate_roots = calculate_roots,
931-
.run_finalizer_function = run_finalizer_function,
909+
// .run_finalizer_function = run_finalizer_function,
932910
.get_jl_last_err = get_jl_last_err,
933911
.set_jl_last_err = set_jl_last_err,
934912
.get_lo_size = get_lo_size,
@@ -946,4 +924,9 @@ Julia_Upcalls mmtk_upcalls = (Julia_Upcalls) {
946924
.jl_hrtime = jl_hrtime,
947925
.update_gc_time = update_gc_time,
948926
.get_abi_structs_checksum_c = get_abi_structs_checksum_c,
927+
.get_thread_finalizer_list = get_thread_finalizer_list,
928+
.get_to_finalize_list = get_to_finalize_list,
929+
.get_marked_finalizers_list = get_marked_finalizers_list,
930+
.arraylist_grow = (void (*)(void*, long unsigned int))arraylist_grow,
931+
.get_jl_gc_have_pending_finalizers = get_jl_gc_have_pending_finalizers,
949932
};

mmtk/Cargo.lock

Lines changed: 25 additions & 25 deletions
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

mmtk/Cargo.toml

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,15 +10,17 @@ edition = "2018"
1010
[package.metadata.julia]
1111
# Our CI matches the following line and extract mmtk/julia. If this line is updated, please check ci yaml files and make sure it works.
1212
julia_repo = "https://github.com/mmtk/julia.git"
13-
julia_version = "81bda9cc0c936ba1ec7bbfee5e6a05bee7b45b2d"
13+
julia_version = "f690aa3a5621bfa1d6a07f911818f203d3f8d650"
1414

1515
[lib]
16-
crate-type = ["staticlib", "rlib", "dylib"]
16+
crate-type = ["cdylib"]
1717

1818
[build-dependencies]
1919
cc = "*"
2020
built = "*"
2121

22+
[profile.release]
23+
lto = true
2224

2325
[dependencies]
2426
libc = "0.2"

mmtk/api/mmtk.h

Lines changed: 5 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -72,7 +72,6 @@ typedef struct {
7272
void (* scan_julia_exc_obj) (void* obj, closure_pointer closure, ProcessEdgeFn process_edge);
7373
void* (* get_stackbase) (int16_t tid);
7474
void (* calculate_roots) (void* tls);
75-
void (* run_finalizer_function) (void* obj, void* function, bool is_ptr);
7675
int (* get_jl_last_err) (void);
7776
void (* set_jl_last_err) (int e);
7877
size_t (* get_lo_size) (void* obj);
@@ -90,6 +89,11 @@ typedef struct {
9089
uint64_t (* jl_hrtime) (void);
9190
void (* update_gc_time) (uint64_t);
9291
uintptr_t (* get_abi_structs_checksum_c) (void);
92+
void* (* get_thread_finalizer_list) (void* tls);
93+
void* (* get_to_finalize_list)(void);
94+
void* (* get_marked_finalizers_list)(void);
95+
void (*arraylist_grow)(void* a, size_t n);
96+
int* (*get_jl_gc_have_pending_finalizers)(void);
9397
} Julia_Upcalls;
9498

9599
/**

0 commit comments

Comments
 (0)