Skip to content

Commit 8f188ce

Browse files
committed
Bulk enqueue references
1 parent 93998de commit 8f188ce

File tree

5 files changed

+24
-11
lines changed

5 files changed

+24
-11
lines changed

mmtk/Cargo.toml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -26,7 +26,7 @@ lazy_static = "1.1"
2626
# - change branch
2727
# - change repo name
2828
# But other changes including adding/removing whitespaces in commented lines may break the CI.
29-
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "f47e85bdf2b6bf95807b425b184135cfdbf4de14" }
29+
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "722546b37e7579aee9d093f51b97f5a729a553d5" }
3030
# Uncomment the following to build locally
3131
# mmtk = { path = "../repos/mmtk-core" }
3232

mmtk/src/lib.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -83,7 +83,7 @@ pub struct OpenJDK_Upcalls {
8383
pub number_of_mutators: extern "C" fn() -> usize,
8484
pub schedule_finalizer: extern "C" fn(),
8585
pub prepare_for_roots_re_scanning: extern "C" fn(),
86-
pub enqueue_reference: extern "C" fn(object: ObjectReference),
86+
pub enqueue_references: extern "C" fn(objects: &[ObjectReference], len: usize),
8787
}
8888

8989
pub static mut UPCALLS: *const OpenJDK_Upcalls = null_mut();

mmtk/src/reference_glue.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -15,9 +15,9 @@ impl ReferenceGlue<OpenJDK> for VMReferenceGlue {
1515
let oop = Oop::from(object);
1616
unsafe { InstanceRefKlass::referent_address(oop).load::<ObjectReference>() }
1717
}
18-
fn enqueue_reference(object: ObjectReference) {
18+
fn enqueue_references(references: &[ObjectReference]) {
1919
unsafe {
20-
((*UPCALLS).enqueue_reference)(object);
20+
((*UPCALLS).enqueue_references)(references, references.len());
2121
}
2222
}
2323
}

openjdk/mmtk.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -144,7 +144,7 @@ typedef struct {
144144
size_t (*number_of_mutators)();
145145
void (*schedule_finalizer)();
146146
void (*prepare_for_roots_re_scanning)();
147-
void (*enqueue_reference)(void* object);
147+
void (*enqueue_references)(void** objects, size_t len);
148148
} OpenJDK_Upcalls;
149149

150150
extern void openjdk_gc_init(OpenJDK_Upcalls *calls, size_t heap_size);

openjdk/mmtkUpcalls.cpp

Lines changed: 19 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -319,12 +319,25 @@ static void mmtk_prepare_for_roots_re_scanning() {
319319
#endif
320320
}
321321

322-
static void mmtk_enqueue_reference(void* object) {
323-
// printf("enqueue object: %p\n", object);
322+
static void mmtk_enqueue_references(void** objects, size_t len) {
323+
if (len == 0) {
324+
return;
325+
}
326+
324327
MutexLocker x(Heap_lock);
325-
oop reff = (oop) object;
326-
oop old = Universe::swap_reference_pending_list(reff);
327-
HeapAccess<AS_NO_KEEPALIVE>::oop_store_at(reff, java_lang_ref_Reference::discovered_offset, old);
328+
329+
oop prev = NULL;
330+
for (size_t i = 0; i < len; i++) {
331+
oop reff = (oop) objects[i];
332+
printf("enqueue: %p\n", reff);
333+
if (prev != NULL) {
334+
HeapAccess<AS_NO_KEEPALIVE>::oop_store_at(prev, java_lang_ref_Reference::discovered_offset, reff);
335+
}
336+
prev = reff;
337+
}
338+
339+
oop old = Universe::swap_reference_pending_list(prev);
340+
HeapAccess<AS_NO_KEEPALIVE>::oop_store_at(prev, java_lang_ref_Reference::discovered_offset, old);
328341
assert(Universe::has_reference_pending_list(), "Reference pending list is empty after swap");
329342
}
330343

@@ -369,5 +382,5 @@ OpenJDK_Upcalls mmtk_upcalls = {
369382
mmtk_number_of_mutators,
370383
mmtk_schedule_finalizer,
371384
mmtk_prepare_for_roots_re_scanning,
372-
mmtk_enqueue_reference,
385+
mmtk_enqueue_references
373386
};

0 commit comments

Comments
 (0)