Skip to content

Commit 19840df

Browse files
peterzhu2118eightbitraptor
authored andcommitted
[ruby/mmtk] [Feature #20860] Implement Mark-Sweep with MMTK
This commit implements the mark-sweep algorithm using MMTk and allows customizing the plan using MMTK_PLAN. ruby/mmtk@6fea5e5ffc Co-Authored-By: Matt Valentine-House <[email protected]>
1 parent 211aef1 commit 19840df

File tree

16 files changed

+1426
-955
lines changed

16 files changed

+1426
-955
lines changed

gc/mmtk.c

Lines changed: 908 additions & 154 deletions
Large diffs are not rendered by default.

gc/mmtk.h

Lines changed: 51 additions & 42 deletions
Original file line numberDiff line numberDiff line change
@@ -12,10 +12,8 @@
1212
typedef struct MMTk_Builder MMTk_Builder;
1313
typedef struct MMTk_Mutator MMTk_Mutator;
1414

15-
struct rb_thread_struct;
16-
typedef struct rb_thread_struct rb_thread_t;
17-
typedef rb_thread_t *MMTk_VMThread;
18-
typedef rb_thread_t *MMTk_VMMutatorThread;
15+
typedef struct MMTk_ractor_cache *MMTk_VMThread;
16+
typedef struct MMTk_ractor_cache *MMTk_VMMutatorThread;
1917
typedef struct MMTk_GCThreadTLS *MMTk_VMWorkerThread;
2018
typedef void *MMTk_Address;
2119
typedef void *MMTk_ObjectReference;
@@ -29,8 +27,6 @@ typedef uint32_t MMTk_AllocationSemantics;
2927

3028
#define MMTk_GC_THREAD_KIND_WORKER 1
3129

32-
typedef struct MMTk_st_table MMTk_st_table;
33-
3430
typedef struct MMTk_RubyBindingOptions {
3531
bool ractor_check_mode;
3632
size_t suffix_size;
@@ -57,52 +53,24 @@ typedef struct MMTk_GCThreadTLS {
5753

5854
typedef struct MMTk_RubyUpcalls {
5955
void (*init_gc_worker_thread)(struct MMTk_GCThreadTLS *gc_worker_tls);
60-
struct MMTk_GCThreadTLS *(*get_gc_thread_tls)(void);
6156
bool (*is_mutator)(void);
62-
void (*stop_the_world)(MMTk_VMWorkerThread tls);
63-
void (*resume_mutators)(MMTk_VMWorkerThread tls);
57+
void (*stop_the_world)(void);
58+
void (*resume_mutators)(void);
6459
void (*block_for_gc)(MMTk_VMMutatorThread tls);
6560
size_t (*number_of_mutators)(void);
6661
void (*get_mutators)(void (*visit_mutator)(MMTk_Mutator*, void*), void *data);
67-
void (*scan_vm_roots)(void);
68-
void (*scan_finalizer_tbl_roots)(void);
69-
void (*scan_end_proc_roots)(void);
70-
void (*scan_global_tbl_roots)(void);
71-
void (*scan_obj_to_id_tbl_roots)(void);
72-
void (*scan_misc_roots)(void);
73-
void (*scan_final_jobs_roots)(void);
62+
void (*scan_gc_roots)(void);
63+
void (*scan_objspace)(void);
7464
void (*scan_roots_in_mutator_thread)(MMTk_VMMutatorThread mutator_tls,
7565
MMTk_VMWorkerThread worker_tls);
7666
void (*scan_object_ruby_style)(MMTk_ObjectReference object);
7767
void (*call_gc_mark_children)(MMTk_ObjectReference object);
7868
void (*call_obj_free)(MMTk_ObjectReference object);
79-
void (*cleanup_generic_iv_tbl)(void);
80-
void *(*get_original_givtbl)(MMTk_ObjectReference object);
81-
void (*move_givtbl)(MMTk_ObjectReference old_objref, MMTk_ObjectReference new_objref);
8269
size_t (*vm_live_bytes)(void);
83-
void (*update_frozen_strings_table)(void);
70+
void (*update_global_tables)(int tbl_idx);
71+
int (*global_tables_count)(void);
8472
void (*update_finalizer_table)(void);
8573
void (*update_obj_id_tables)(void);
86-
void (*update_global_symbols_table)(void);
87-
void (*update_overloaded_cme_table)(void);
88-
void (*update_ci_table)(void);
89-
struct MMTk_st_table *(*get_frozen_strings_table)(void);
90-
struct MMTk_st_table *(*get_finalizer_table)(void);
91-
struct MMTk_st_table *(*get_obj_id_tables)(void);
92-
struct MMTk_st_table *(*get_global_symbols_table)(void);
93-
struct MMTk_st_table *(*get_overloaded_cme_table)(void);
94-
struct MMTk_st_table *(*get_ci_table)(void);
95-
void (*st_get_size_info)(const struct MMTk_st_table *table,
96-
size_t *entries_start,
97-
size_t *entries_bound,
98-
size_t *bins_num);
99-
void (*st_update_entries_range)(struct MMTk_st_table *table,
100-
size_t begin,
101-
size_t end,
102-
bool weak_keys,
103-
bool weak_records,
104-
bool forward);
105-
void (*st_update_bins_range)(struct MMTk_st_table *table, size_t begin, size_t end);
10674
} MMTk_RubyUpcalls;
10775

10876
typedef struct MMTk_RawVecOfObjRef {
@@ -111,14 +79,29 @@ typedef struct MMTk_RawVecOfObjRef {
11179
size_t capa;
11280
} MMTk_RawVecOfObjRef;
11381

82+
bool mmtk_is_live_object(MMTk_ObjectReference object);
83+
84+
bool mmtk_is_reachable(MMTk_ObjectReference object);
85+
11486
MMTk_Builder *mmtk_builder_default(void);
11587

11688
void mmtk_init_binding(MMTk_Builder *builder,
11789
const struct MMTk_RubyBindingOptions *_binding_options,
118-
const struct MMTk_RubyUpcalls *upcalls);
90+
const struct MMTk_RubyUpcalls *upcalls,
91+
MMTk_ObjectReference weak_reference_dead_value);
92+
93+
void mmtk_initialize_collection(MMTk_VMThread tls);
11994

12095
MMTk_Mutator *mmtk_bind_mutator(MMTk_VMMutatorThread tls);
12196

97+
void mmtk_destroy_mutator(MMTk_Mutator *mutator);
98+
99+
void mmtk_handle_user_collection_request(MMTk_VMMutatorThread tls);
100+
101+
void mmtk_set_gc_enabled(bool enable);
102+
103+
bool mmtk_gc_enabled_p(void);
104+
122105
MMTk_Address mmtk_alloc(MMTk_Mutator *mutator,
123106
size_t size,
124107
size_t align,
@@ -132,10 +115,36 @@ void mmtk_post_alloc(MMTk_Mutator *mutator,
132115

133116
void mmtk_add_obj_free_candidate(MMTk_ObjectReference object);
134117

118+
void mmtk_mark_weak(MMTk_ObjectReference *ptr);
119+
120+
void mmtk_remove_weak(const MMTk_ObjectReference *ptr);
121+
122+
void mmtk_object_reference_write_post(MMTk_Mutator *mutator, MMTk_ObjectReference object);
123+
124+
void mmtk_register_wb_unprotected_object(MMTk_ObjectReference object);
125+
126+
bool mmtk_object_wb_unprotected_p(MMTk_ObjectReference object);
127+
135128
void mmtk_enumerate_objects(void (*callback)(MMTk_ObjectReference, void*), void *data);
136129

137130
struct MMTk_RawVecOfObjRef mmtk_get_all_obj_free_candidates(void);
138131

139132
void mmtk_free_raw_vec_of_obj_ref(struct MMTk_RawVecOfObjRef raw_vec);
140133

141-
#endif /* MMTK_H */
134+
void mmtk_before_fork(void);
135+
136+
void mmtk_after_fork(MMTk_VMThread tls);
137+
138+
size_t mmtk_total_bytes(void);
139+
140+
size_t mmtk_used_bytes(void);
141+
142+
size_t mmtk_free_bytes(void);
143+
144+
MMTk_Address mmtk_starting_heap_address(void);
145+
146+
MMTk_Address mmtk_last_heap_address(void);
147+
148+
bool mmtk_is_mmtk_object(MMTk_Address addr);
149+
150+
#endif /* MMTK_H */

gc/mmtk/Cargo.lock

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

gc/mmtk/Cargo.toml

Lines changed: 4 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,16 +24,17 @@ env_logger = "0.11.3"
2424
once_cell = "1.17.0"
2525
atomic_refcell = "0.1.9"
2626
probe = "0.5"
27+
sysinfo = "0.32.0"
2728

2829
[dependencies.mmtk]
2930
features = ["is_mmtk_object", "object_pinning", "sticky_immix_non_moving_nursery"]
3031

3132
# Uncomment the following lines to use mmtk-core from the official repository.
32-
git = "https://github.com/wks/mmtk-core.git"
33-
rev = "7d3f79d4e50dacec881252562c8c7946e2513e55"
33+
git = "https://github.com/mmtk/mmtk-core.git"
34+
rev = "0883898514d482d9027c845e8d7f6976a49a39ac"
3435

3536
# Uncomment the following line to use mmtk-core from a local repository.
36-
# path = "../../mmtk-core"
37+
# path = "../../../mmtk-core"
3738

3839
[features]
3940
default = []

gc/mmtk/cbindgen.toml

Lines changed: 2 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -13,10 +13,8 @@ after_includes = """
1313
typedef struct MMTk_Builder MMTk_Builder;
1414
typedef struct MMTk_Mutator MMTk_Mutator;
1515
16-
struct rb_thread_struct;
17-
typedef struct rb_thread_struct rb_thread_t;
18-
typedef rb_thread_t *MMTk_VMThread;
19-
typedef rb_thread_t *MMTk_VMMutatorThread;
16+
typedef struct MMTk_ractor_cache *MMTk_VMThread;
17+
typedef struct MMTk_ractor_cache *MMTk_VMMutatorThread;
2018
typedef struct MMTk_GCThreadTLS *MMTk_VMWorkerThread;
2119
typedef void *MMTk_Address;
2220
typedef void *MMTk_ObjectReference;

0 commit comments

Comments
 (0)