Skip to content

Commit 39aa10e

Browse files
peterzhu2118wks
andcommitted
[Feature #20860] Implement NoGC with MMTk
This commit only supports initializing MMTk with NoGC and object allocation. Co-Authored-By: Kunshan Wang <[email protected]>
1 parent bf89490 commit 39aa10e

19 files changed

+3938
-0
lines changed

gc/mmtk.c

Lines changed: 605 additions & 0 deletions
Large diffs are not rendered by default.

gc/mmtk.h

Lines changed: 141 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,141 @@
1+
#ifndef MMTK_H
2+
#define MMTK_H
3+
4+
/* Warning, this file is autogenerated by cbindgen from the mmtk-ruby repository. Don't modify this manually. */
5+
6+
#include <stdarg.h>
7+
#include <stdbool.h>
8+
#include <stddef.h>
9+
#include <stdint.h>
10+
#include <stdlib.h>
11+
12+
typedef struct MMTk_Builder MMTk_Builder;
13+
typedef struct MMTk_Mutator MMTk_Mutator;
14+
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;
19+
typedef struct MMTk_GCThreadTLS *MMTk_VMWorkerThread;
20+
typedef void *MMTk_Address;
21+
typedef void *MMTk_ObjectReference;
22+
typedef void *MMTk_NullableObjectReference;
23+
typedef uint32_t MMTk_AllocationSemantics;
24+
25+
26+
#define MMTk_OBJREF_OFFSET 8
27+
28+
#define MMTk_MIN_OBJ_ALIGN 8
29+
30+
#define MMTk_GC_THREAD_KIND_WORKER 1
31+
32+
typedef struct MMTk_st_table MMTk_st_table;
33+
34+
typedef struct MMTk_RubyBindingOptions {
35+
bool ractor_check_mode;
36+
size_t suffix_size;
37+
} MMTk_RubyBindingOptions;
38+
39+
typedef MMTk_ObjectReference (*MMTk_ObjectClosureFunction)(void*, void*, MMTk_ObjectReference, bool);
40+
41+
typedef struct MMTk_ObjectClosure {
42+
/**
43+
* The function to be called from C.
44+
*/
45+
MMTk_ObjectClosureFunction c_function;
46+
/**
47+
* The pointer to the Rust-level closure object.
48+
*/
49+
void *rust_closure;
50+
} MMTk_ObjectClosure;
51+
52+
typedef struct MMTk_GCThreadTLS {
53+
int kind;
54+
void *gc_context;
55+
struct MMTk_ObjectClosure object_closure;
56+
} MMTk_GCThreadTLS;
57+
58+
typedef struct MMTk_RubyUpcalls {
59+
void (*init_gc_worker_thread)(struct MMTk_GCThreadTLS *gc_worker_tls);
60+
struct MMTk_GCThreadTLS *(*get_gc_thread_tls)(void);
61+
bool (*is_mutator)(void);
62+
void (*stop_the_world)(MMTk_VMWorkerThread tls);
63+
void (*resume_mutators)(MMTk_VMWorkerThread tls);
64+
void (*block_for_gc)(MMTk_VMMutatorThread tls);
65+
size_t (*number_of_mutators)(void);
66+
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);
74+
void (*scan_roots_in_mutator_thread)(MMTk_VMMutatorThread mutator_tls,
75+
MMTk_VMWorkerThread worker_tls);
76+
void (*scan_object_ruby_style)(MMTk_ObjectReference object);
77+
void (*call_gc_mark_children)(MMTk_ObjectReference object);
78+
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);
82+
size_t (*vm_live_bytes)(void);
83+
void (*update_frozen_strings_table)(void);
84+
void (*update_finalizer_table)(void);
85+
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);
106+
} MMTk_RubyUpcalls;
107+
108+
typedef struct MMTk_RawVecOfObjRef {
109+
MMTk_ObjectReference *ptr;
110+
size_t len;
111+
size_t capa;
112+
} MMTk_RawVecOfObjRef;
113+
114+
MMTk_Builder *mmtk_builder_default(void);
115+
116+
void mmtk_init_binding(MMTk_Builder *builder,
117+
const struct MMTk_RubyBindingOptions *_binding_options,
118+
const struct MMTk_RubyUpcalls *upcalls);
119+
120+
MMTk_Mutator *mmtk_bind_mutator(MMTk_VMMutatorThread tls);
121+
122+
MMTk_Address mmtk_alloc(MMTk_Mutator *mutator,
123+
size_t size,
124+
size_t align,
125+
size_t offset,
126+
MMTk_AllocationSemantics semantics);
127+
128+
void mmtk_post_alloc(MMTk_Mutator *mutator,
129+
MMTk_ObjectReference refer,
130+
size_t bytes,
131+
MMTk_AllocationSemantics semantics);
132+
133+
void mmtk_add_obj_free_candidate(MMTk_ObjectReference object);
134+
135+
void mmtk_enumerate_objects(void (*callback)(MMTk_ObjectReference, void*), void *data);
136+
137+
struct MMTk_RawVecOfObjRef mmtk_get_all_obj_free_candidates(void);
138+
139+
void mmtk_free_raw_vec_of_obj_ref(struct MMTk_RawVecOfObjRef raw_vec);
140+
141+
#endif /* MMTK_H */

gc/mmtk/.gitignore

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1 @@
1+
target

0 commit comments

Comments
 (0)