Skip to content

Commit 96ef821

Browse files
authored
Implement JuliaMemorySlice, and expose mmtk_memory_region_copy (mmtk#53)
Merge with mmtk/julia#10.
1 parent a66526a commit 96ef821

File tree

6 files changed

+118
-7
lines changed

6 files changed

+118
-7
lines changed

mmtk/Cargo.lock

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

mmtk/Cargo.toml

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -10,7 +10,7 @@ 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 = "a760a7ee28150261669cb0b31a8284214b3635c7"
13+
julia_version = "95bc54ab673fcdf11604324638f597f32158a22f"
1414

1515
[lib]
1616
crate-type = ["staticlib", "rlib", "dylib"]
@@ -29,7 +29,7 @@ lazy_static = "1.1"
2929
# - change branch
3030
# - change repo name
3131
# But other changes including adding/removing whitespaces in commented lines may break the CI.
32-
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "2cc34abe2b3ce4ee213b9ac4b9295160dac754cc" }
32+
mmtk = { git = "https://github.com/mmtk/mmtk-core.git", rev = "ed347f19f230dfec8c05a24032f1529e9079478c" }
3333
# Uncomment the following to build locally
3434
# mmtk = { path = "../repos/mmtk-core" }
3535
log = {version = "0.4", features = ["max_level_trace", "release_max_level_off"] }

mmtk/api/mmtk.h

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -57,6 +57,8 @@ extern void modify_check(void* ref);
5757
extern int object_is_managed_by_mmtk(void* addr);
5858
extern void runtime_panic(void);
5959

60+
// Write barriers
61+
extern void mmtk_memory_region_copy(MMTk_Mutator mutator, void* src_obj, void* src_addr, void* dst_obj, void* dst_addr, size_t size);
6062
extern void mmtk_object_reference_write_post(MMTk_Mutator mutator, const void* src, const void* target);
6163
extern uint8_t mmtk_needs_write_barrier(void);
6264

mmtk/src/api.rs

Lines changed: 24 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -443,11 +443,34 @@ pub extern "C" fn mmtk_gc_poll(tls: VMMutatorThread) {
443443
}
444444

445445
#[no_mangle]
446-
447446
pub extern "C" fn runtime_panic() {
448447
panic!("Panicking at runtime!")
449448
}
450449

450+
#[no_mangle]
451+
pub extern "C" fn mmtk_memory_region_copy(
452+
mutator: *mut Mutator<JuliaVM>,
453+
src_obj: ObjectReference,
454+
src_addr: Address,
455+
dst_obj: ObjectReference,
456+
dst_addr: Address,
457+
count: usize,
458+
) {
459+
use crate::edges::JuliaMemorySlice;
460+
let src = JuliaMemorySlice {
461+
owner: src_obj,
462+
start: src_addr,
463+
count,
464+
};
465+
let dst = JuliaMemorySlice {
466+
owner: dst_obj,
467+
start: dst_addr,
468+
count,
469+
};
470+
let mutator = unsafe { &mut *mutator };
471+
memory_manager::memory_region_copy(mutator, src, dst);
472+
}
473+
451474
#[no_mangle]
452475
pub extern "C" fn mmtk_object_reference_write_post(
453476
mutator: *mut Mutator<JuliaVM>,

mmtk/src/edges.rs

Lines changed: 87 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -74,3 +74,90 @@ impl Edge for OffsetEdge {
7474
unsafe { (*self.slot_addr).store(middle, atomic::Ordering::Relaxed) }
7575
}
7676
}
77+
78+
#[derive(Hash, Clone, PartialEq, Eq, Debug)]
79+
pub struct JuliaMemorySlice {
80+
pub owner: ObjectReference,
81+
pub start: Address,
82+
pub count: usize,
83+
}
84+
85+
impl mmtk::vm::edge_shape::MemorySlice for JuliaMemorySlice {
86+
type Edge = JuliaVMEdge;
87+
type EdgeIterator = JuliaMemorySliceEdgeIterator;
88+
89+
fn iter_edges(&self) -> Self::EdgeIterator {
90+
JuliaMemorySliceEdgeIterator {
91+
cursor: self.start,
92+
limit: self.start.shift::<Address>(self.count as isize),
93+
}
94+
}
95+
96+
fn object(&self) -> Option<ObjectReference> {
97+
Some(self.owner)
98+
}
99+
100+
fn start(&self) -> Address {
101+
self.start
102+
}
103+
104+
fn bytes(&self) -> usize {
105+
self.count << mmtk::util::constants::LOG_BYTES_IN_ADDRESS
106+
}
107+
108+
fn copy(src: &Self, tgt: &Self) {
109+
use std::sync::atomic::*;
110+
// Raw memory copy -- we should be consistent with jl_array_ptr_copy in array.c
111+
unsafe {
112+
let words = tgt.bytes() >> mmtk::util::constants::LOG_BYTES_IN_ADDRESS;
113+
// let src = src.start().to_ptr::<usize>();
114+
// let tgt = tgt.start().to_mut_ptr::<usize>();
115+
// std::ptr::copy(src, tgt, words)
116+
117+
let src_addr = src.start();
118+
let tgt_addr = tgt.start();
119+
120+
let n: isize = words as isize;
121+
122+
if tgt_addr < src_addr || tgt_addr > src_addr + tgt.bytes() {
123+
// non overlaping
124+
for i in 0..n {
125+
let val: usize = src_addr
126+
.shift::<usize>(i)
127+
.atomic_load::<AtomicUsize>(Ordering::Relaxed);
128+
tgt_addr
129+
.shift::<usize>(i)
130+
.atomic_store::<AtomicUsize>(val, Ordering::Release);
131+
}
132+
} else {
133+
for i in 0..n {
134+
let val = src_addr
135+
.shift::<usize>(n - i - 1)
136+
.atomic_load::<AtomicUsize>(Ordering::Relaxed);
137+
tgt_addr
138+
.shift::<usize>(n - i - 1)
139+
.atomic_store::<AtomicUsize>(val, Ordering::Release);
140+
}
141+
}
142+
}
143+
}
144+
}
145+
146+
pub struct JuliaMemorySliceEdgeIterator {
147+
cursor: Address,
148+
limit: Address,
149+
}
150+
151+
impl Iterator for JuliaMemorySliceEdgeIterator {
152+
type Item = JuliaVMEdge;
153+
154+
fn next(&mut self) -> Option<JuliaVMEdge> {
155+
if self.cursor >= self.limit {
156+
None
157+
} else {
158+
let edge = self.cursor;
159+
self.cursor = self.cursor.shift::<ObjectReference>(1);
160+
Some(JuliaVMEdge::Simple(SimpleEdge::from_address(edge)))
161+
}
162+
}
163+
}

mmtk/src/lib.rs

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -8,7 +8,6 @@ use mmtk::scheduler::*;
88
use mmtk::util::opaque_pointer::*;
99
use mmtk::util::Address;
1010
use mmtk::util::ObjectReference;
11-
use mmtk::vm::edge_shape;
1211
use mmtk::vm::EdgeVisitor;
1312
use mmtk::vm::VMBinding;
1413
use mmtk::MMTKBuilder;
@@ -50,7 +49,7 @@ impl VMBinding for JuliaVM {
5049
type VMCollection = collection::VMCollection;
5150
type VMActivePlan = active_plan::VMActivePlan;
5251
type VMReferenceGlue = reference_glue::VMReferenceGlue;
53-
type VMMemorySlice = edge_shape::UnimplementedMemorySlice<JuliaVMEdge>;
52+
type VMMemorySlice = edges::JuliaMemorySlice;
5453
type VMEdge = JuliaVMEdge;
5554
}
5655

0 commit comments

Comments
 (0)