Skip to content

Commit 822ccb5

Browse files
committed
Cleanup
1 parent 7af171b commit 822ccb5

File tree

7 files changed

+43
-53
lines changed

7 files changed

+43
-53
lines changed

julia/mmtk_julia.c

Lines changed: 8 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -348,6 +348,7 @@ size_t get_so_size(void* obj_raw)
348348

349349
extern void run_finalizers(jl_task_t *ct);
350350

351+
// Called after GC to run finalizers
351352
void mmtk_jl_run_finalizers(void* ptls_raw) {
352353
jl_ptls_t ptls = (jl_ptls_t) ptls_raw;
353354
if (!ptls->finalizers_inhibited && ptls->locks.len == 0) {
@@ -356,10 +357,12 @@ void mmtk_jl_run_finalizers(void* ptls_raw) {
356357
}
357358
}
358359

360+
// We implement finalization in the binding side. These functions
361+
// returns some pointers so MMTk can manipulate finalizer lists.
362+
359363
extern jl_mutex_t finalizers_lock;
360364
extern arraylist_t to_finalize;
361365
extern arraylist_t finalizer_list_marked;
362-
extern int prev_sweep_full;
363366

364367
void* get_thread_finalizer_list(void* ptls_raw) {
365368
jl_ptls_t ptls = (jl_ptls_t) ptls_raw;
@@ -374,6 +377,10 @@ void* get_marked_finalizers_list(void) {
374377
return (void*)&finalizer_list_marked;
375378
}
376379

380+
int* get_jl_gc_have_pending_finalizers(void) {
381+
return (int*)&jl_gc_have_pending_finalizers;
382+
}
383+
377384
// add the initial root set to mmtk roots
378385
static void queue_roots(void)
379386
{
@@ -894,10 +901,6 @@ uintptr_t get_abi_structs_checksum_c(void) {
894901
return sizeof(MMTkMutatorContext);
895902
}
896903

897-
int* get_jl_gc_have_pending_finalizers(void) {
898-
return (int*)&jl_gc_have_pending_finalizers;
899-
}
900-
901904
Julia_Upcalls mmtk_upcalls = (Julia_Upcalls) {
902905
.scan_julia_obj = scan_julia_obj,
903906
.scan_julia_exc_obj = scan_julia_exc_obj,

mmtk/api/mmtk.h

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -57,8 +57,6 @@ extern int mmtk_object_is_managed_by_mmtk(void* addr);
5757
extern void mmtk_runtime_panic(void);
5858
extern void mmtk_unreachable(void);
5959

60-
extern uint8_t mmtk_is_current_gc_nursery(void);
61-
6260
extern void mmtk_set_vm_space(void* addr, size_t size);
6361
extern void mmtk_immortal_region_post_alloc(void* addr, size_t size);
6462

@@ -83,7 +81,6 @@ typedef struct {
8381
void (* scan_julia_exc_obj) (void* obj, closure_pointer closure, ProcessEdgeFn process_edge);
8482
void* (* get_stackbase) (int16_t tid);
8583
void (* calculate_roots) (void* tls);
86-
// void (* run_finalizer_function) (void* obj, void* function, bool is_ptr);
8784
int (* get_jl_last_err) (void);
8885
void (* set_jl_last_err) (int e);
8986
size_t (* get_lo_size) (void* obj);

mmtk/src/api.rs

Lines changed: 0 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -599,11 +599,3 @@ pub extern "C" fn mmtk_get_obj_size(obj: ObjectReference) -> usize {
599599
addr_size.load::<u64>() as usize
600600
}
601601
}
602-
603-
#[no_mangle]
604-
pub extern "C" fn mmtk_is_current_gc_nursery() -> bool {
605-
match SINGLETON.get_plan().generational() {
606-
Some(gen) => gen.is_current_gc_nursery(),
607-
None => false,
608-
}
609-
}

mmtk/src/collection.rs

Lines changed: 7 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -140,3 +140,10 @@ impl Collection<JuliaVM> for VMCollection {
140140
) {
141141
}
142142
}
143+
144+
pub fn is_current_gc_nursery() -> bool {
145+
match crate::SINGLETON.get_plan().generational() {
146+
Some(gen) => gen.is_current_gc_nursery(),
147+
None => false,
148+
}
149+
}

mmtk/src/finalizer.rs renamed to mmtk/src/julia_finalizer.rs

Lines changed: 26 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -16,8 +16,10 @@ pub fn scan_finalizers_in_rust<T: ObjectTracer>(tracer: &mut T) {
1616
let jl_gc_have_pending_finalizers: *mut i32 =
1717
unsafe { ((*UPCALLS).get_jl_gc_have_pending_finalizers)() };
1818

19+
// Current length of marked list: we only need to trace objects after this length if this is a nursery GC.
1920
let mut orig_marked_len = marked_finalizers_list.len;
2021

22+
// Sweep thread local list: if they are not alive, move to to_finalize.
2123
for mutator in <JuliaVM as VMBinding>::VMActivePlan::mutators() {
2224
let list = ArrayListT::thread_local_finalizer_list(mutator);
2325
sweep_finalizer_list(
@@ -28,7 +30,8 @@ pub fn scan_finalizers_in_rust<T: ObjectTracer>(tracer: &mut T) {
2830
);
2931
}
3032

31-
if !crate::api::mmtk_is_current_gc_nursery() {
33+
// If this is a full heap GC, we also sweep marked list.
34+
if !crate::collection::is_current_gc_nursery() {
3235
sweep_finalizer_list(
3336
marked_finalizers_list,
3437
to_finalize,
@@ -38,12 +41,14 @@ pub fn scan_finalizers_in_rust<T: ObjectTracer>(tracer: &mut T) {
3841
orig_marked_len = 0;
3942
}
4043

44+
// Go through thread local list again and trace objects
4145
for mutator in <JuliaVM as VMBinding>::VMActivePlan::mutators() {
4246
let list = ArrayListT::thread_local_finalizer_list(mutator);
4347
mark_finlist(list, 0, tracer);
4448
}
45-
49+
// Trace new objects in marked list
4650
mark_finlist(marked_finalizers_list, orig_marked_len, tracer);
51+
// Trace objects in to_finalize (which are just pushed in sweeping thread local list)
4752
mark_finlist(to_finalize, 0, tracer);
4853
}
4954

@@ -105,11 +110,20 @@ impl ArrayListT {
105110
}
106111
}
107112

113+
fn gc_ptr_clear_tag(addr: Address, tag: usize) -> ObjectReference {
114+
ObjectReference::from_raw_address(unsafe { Address::from_usize(addr & !tag) })
115+
}
116+
117+
fn gc_ptr_tag(addr: Address, tag: usize) -> bool {
118+
addr & tag != 0
119+
}
120+
108121
// sweep_finalizer_list in gc.c
109-
// finalizer_list_marked is None if list is finalizer_list_marked.
110122
fn sweep_finalizer_list(
111123
list: &mut ArrayListT,
112124
to_finalize: &mut ArrayListT,
125+
// finalizer_list_marked is None if list (1st parameter) is finalizer_list_marked.
126+
// Rust does not allow sending the same mutable reference as two different arguments (cannot borrow __ as mutable more than once at a time)
113127
mut finalizer_list_marked: Option<&mut ArrayListT>,
114128
jl_gc_have_pending_finalizers: *mut i32,
115129
) {
@@ -121,19 +135,20 @@ fn sweep_finalizer_list(
121135
let mut j = 0;
122136
while i < list.len {
123137
let v0: Address = list.get(i);
124-
let v = unsafe { ObjectReference::from_raw_address(Address::from_usize(v0 & (!3usize))) };
138+
let v = gc_ptr_clear_tag(v0, 3);
125139
if v0.is_zero() {
126140
i += 2;
127141
// remove from this list
128142
continue;
129143
}
130144

131145
let fin = list.get(i + 1);
132-
let (isfreed, isold) = if v0 & 2usize != 0 {
146+
let (isfreed, isold) = if gc_ptr_tag(v0, 2) {
133147
(true, false)
134148
} else {
135149
let isfreed = !memory_manager::is_live_object(v);
136-
(isfreed, finalizer_list_marked.is_some() && !isfreed)
150+
let isold = finalizer_list_marked.is_some() && !isfreed;
151+
(isfreed, isold)
137152
};
138153
if isfreed || isold {
139154
// remove from this list
@@ -176,22 +191,22 @@ fn mark_finlist<T: ObjectTracer>(list: &mut ArrayListT, start: usize, tracer: &m
176191
continue;
177192
}
178193

179-
let obj = if cur & 1usize != 0 {
194+
let new_obj = if gc_ptr_tag(cur, 1) {
180195
// Skip next
181196
i += 1;
182197
debug_assert!(i < list.len);
183-
ObjectReference::from_raw_address(unsafe { Address::from_usize(cur & (!1usize)) })
198+
gc_ptr_clear_tag(cur, 1)
184199
} else {
185200
ObjectReference::from_raw_address(cur)
186201
};
187-
if cur & 2usize != 0 {
202+
if gc_ptr_tag(cur, 2) {
188203
i += 1;
189204
continue;
190205
}
191206

192-
let traced = tracer.trace_object(obj);
207+
let traced = tracer.trace_object(new_obj);
193208
debug_assert_eq!(
194-
traced, obj,
209+
traced, new_obj,
195210
"Object is moved -- we need to save the new object back to the finalizer list"
196211
);
197212
i += 1;

mmtk/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -24,12 +24,12 @@ pub mod active_plan;
2424
pub mod api;
2525
pub mod collection;
2626
pub mod edges;
27-
pub mod finalizer;
2827
pub mod object_model;
2928
pub mod reference_glue;
3029
pub mod scanning;
3130
pub mod util;
3231

32+
pub mod julia_finalizer;
3333
pub mod julia_scanning;
3434
#[allow(non_camel_case_types)]
3535
#[allow(improper_ctypes_definitions)]

mmtk/src/scanning.rs

Lines changed: 1 addition & 25 deletions
Original file line numberDiff line numberDiff line change
@@ -89,37 +89,13 @@ impl Scanning<JuliaVM> for VMScanning {
8989
_worker: &mut GCWorker<JuliaVM>,
9090
tracer_context: impl ObjectTracerContext<JuliaVM>,
9191
) -> bool {
92-
// use crate::mmtk::vm::ActivePlan;
93-
9492
let single_thread_process_finalizer = ScanFinalizersSingleThreaded { tracer_context };
9593
memory_manager::add_work_packet(
9694
&SINGLETON,
9795
WorkBucketStage::VMRefClosure,
9896
single_thread_process_finalizer,
9997
);
10098

101-
// let process_to_finalize = ScanToFinalizeList {
102-
// tracer_context: tracer_context.clone(),
103-
// };
104-
// memory_manager::add_work_packet(
105-
// &SINGLETON,
106-
// WorkBucketStage::VMRefClosure,
107-
// process_to_finalize,
108-
// );
109-
110-
// for mutator in <JuliaVM as VMBinding>::VMActivePlan::mutators() {
111-
// info!("Create ScanFinalizers: {:?}", mutator.mutator_tls);
112-
// let process_finalizer = ScanFinalizers {
113-
// tls: mutator.mutator_tls,
114-
// tracer_context: tracer_context.clone(),
115-
// };
116-
// memory_manager::add_work_packet(
117-
// &SINGLETON,
118-
// WorkBucketStage::VMRefClosure,
119-
// process_finalizer,
120-
// );
121-
// }
122-
12399
// We have pushed work. No need to repeat this method.
124100
false
125101
}
@@ -167,7 +143,7 @@ pub struct ScanFinalizersSingleThreaded<C: ObjectTracerContext<JuliaVM>> {
167143
impl<C: ObjectTracerContext<JuliaVM>> GCWork<JuliaVM> for ScanFinalizersSingleThreaded<C> {
168144
fn do_work(&mut self, worker: &mut GCWorker<JuliaVM>, _mmtk: &'static MMTK<JuliaVM>) {
169145
self.tracer_context.with_tracer(worker, |tracer| {
170-
crate::finalizer::scan_finalizers_in_rust(tracer);
146+
crate::julia_finalizer::scan_finalizers_in_rust(tracer);
171147
});
172148
}
173149
}

0 commit comments

Comments
 (0)