Skip to content

Commit 749c0e7

Browse files
authored
Add prefix to MMTk API (#530)
1 parent 8b58a78 commit 749c0e7

11 files changed

+251
-171
lines changed

examples/allocation_benchmark.c

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -5,11 +5,11 @@
55

66
int main() {
77
volatile uint64_t * tmp;
8-
gc_init(1024*1024*1024);
9-
MMTk_Mutator handle = bind_mutator(0);
8+
mmtk_gc_init(1024*1024*1024);
9+
MMTk_Mutator handle = mmtk_bind_mutator(0);
1010

1111
for (int i=0; i<1024*1024*100; i++) {
12-
tmp = alloc(handle, 8, 1, 0, 0);
12+
tmp = mmtk_alloc(handle, 8, 1, 0, 0);
1313
#ifdef STORE
1414
*tmp = 42;
1515
#endif

examples/main.c

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -2,13 +2,13 @@
22
#include "mmtk.h"
33

44
int main(int argc, char* argv[]){
5-
gc_init(1024*1024);
5+
mmtk_gc_init(1024*1024);
6+
7+
MMTk_Mutator handle = mmtk_bind_mutator(0);
68

7-
MMTk_Mutator handle = bind_mutator(0);
8-
99
for (int i=0;i<4;i++){
1010
int arr_size = 10000;
11-
int* my_arr = alloc(handle, sizeof(int)*arr_size, 8, 0, 0);
11+
int* my_arr = mmtk_alloc(handle, sizeof(int)*arr_size, 8, 0, 0);
1212
if (!my_arr){
1313
printf("OOM\n");
1414
break;

examples/mmtk.h

Lines changed: 93 additions & 58 deletions
Original file line numberDiff line numberDiff line change
@@ -1,8 +1,9 @@
11
// This is an example of native API for the single instance MMTk.
22

3-
// Note: the mmtk core does not directly provide this API. However, it provides a similar multi-instance Rust API.
4-
// A VM binding should write their own C header file (possibly based on this example with their own extension and modification),
5-
// and expose the Rust API based on their native API.
3+
// Note: the mmtk core does not directly provide this API. However, it provides
4+
// a similar multi-instance Rust API. A VM binding should write their own C
5+
// header file (possibly based on this example with their own extension and
6+
// modification), and expose the Rust API based on their native API.
67

78
#ifndef MMTK_H
89
#define MMTK_H
@@ -15,79 +16,113 @@ extern "C" {
1516
#endif
1617

1718
typedef void* MMTk_Mutator;
18-
typedef void* MMTk_TraceLocal;
1919

20-
/**
21-
* Allocation
22-
*/
23-
extern MMTk_Mutator bind_mutator(void *tls);
24-
extern void destroy_mutator(MMTk_Mutator mutator);
20+
// Initialize an MMTk instance
21+
extern void mmtk_gc_init(size_t heap_size);
2522

26-
extern void* alloc(MMTk_Mutator mutator, size_t size,
27-
size_t align, ssize_t offset, int allocator);
23+
// Request MMTk to create a new mutator for the given `tls` thread
24+
extern MMTk_Mutator mmtk_bind_mutator(void* tls);
2825

29-
extern void* alloc_slow(MMTk_Mutator mutator, size_t size,
30-
size_t align, ssize_t offset, int allocator);
26+
// Reclaim mutator that is no longer needed
27+
extern void mmtk_destroy_mutator(MMTk_Mutator mutator);
3128

32-
extern void post_alloc(MMTk_Mutator mutator, void* refer, void* type_refer,
33-
int bytes, int allocator);
29+
// Flush mutator local state
30+
extern void mmtk_flush_mutator(MMTk_Mutator mutator);
3431

35-
extern bool is_live_object(void* ref);
36-
extern bool is_mapped_object(void* ref);
37-
extern bool is_mapped_address(void* addr);
38-
extern void modify_check(void* ref);
32+
// Initialize MMTk scheduler and GC workers
33+
extern void mmtk_initialize_collection(void* tls);
3934

40-
/**
41-
* Tracing
42-
*/
43-
extern void report_delayed_root_edge(MMTk_TraceLocal trace_local,
44-
void* addr);
35+
// Allow MMTk to perform a GC when the heap is full
36+
extern void mmtk_enable_collection();
4537

46-
extern bool will_not_move_in_current_collection(MMTk_TraceLocal trace_local,
47-
void* obj);
38+
// Disallow MMTk to perform a GC when the heap is full
39+
extern void mmtk_disable_collection();
4840

49-
extern void process_interior_edge(MMTk_TraceLocal trace_local, void* target,
50-
void* slot, bool root);
41+
// Allocate memory for an object
42+
extern void* mmtk_alloc(MMTk_Mutator mutator,
43+
size_t size,
44+
size_t align,
45+
ssize_t offset,
46+
int allocator);
5147

52-
extern void* trace_get_forwarded_referent(MMTk_TraceLocal trace_local, void* obj);
48+
// Slowpath allocation for an object
49+
extern void* mmtk_alloc_slow(MMTk_Mutator mutator,
50+
size_t size,
51+
size_t align,
52+
ssize_t offset,
53+
int allocator);
5354

54-
extern void* trace_get_forwarded_reference(MMTk_TraceLocal trace_local, void* obj);
55+
// Perform post-allocation hooks or actions such as initializing object metadata
56+
extern void mmtk_post_alloc(MMTk_Mutator mutator,
57+
void* refer,
58+
int bytes,
59+
int allocator);
5560

56-
extern void* trace_retain_referent(MMTk_TraceLocal trace_local, void* obj);
61+
// Return if the object pointed to by `ref` is live
62+
extern bool mmtk_is_live_object(void* ref);
5763

58-
/**
59-
* Misc
60-
*/
61-
extern void gc_init(size_t heap_size);
62-
extern bool will_never_move(void* object);
63-
extern bool process(char* name, char* value);
64-
extern void scan_region();
65-
extern void handle_user_collection_request(void *tls);
64+
// Return if the object pointed to by `ref` is in mapped memory
65+
extern bool mmtk_is_mapped_object(void* ref);
6666

67-
extern void start_control_collector(void *tls);
68-
extern void start_worker(void *tls, void* worker);
67+
// Return if the address pointed to by `addr` is in mapped memory
68+
extern bool mmtk_is_mapped_address(void* addr);
6969

70-
/**
71-
* VM Accounting
72-
*/
73-
extern size_t free_bytes();
74-
extern size_t total_bytes();
75-
extern size_t used_bytes();
76-
extern void* starting_heap_address();
77-
extern void* last_heap_address();
70+
// Check if a GC is in progress and if the object `ref` is movable
71+
extern void mmtk_modify_check(void* ref);
7872

79-
/**
80-
* Reference Processing
81-
*/
82-
extern void add_weak_candidate(void* ref, void* referent);
83-
extern void add_soft_candidate(void* ref, void* referent);
84-
extern void add_phantom_candidate(void* ref, void* referent);
73+
// Return if object pointed to by `object` will never move
74+
extern bool mmtk_will_never_move(void* object);
8575

86-
extern void harness_begin(void *tls);
87-
extern void harness_end();
76+
// Process an MMTk option. Return true if option was processed successfully
77+
extern bool mmtk_process(char* name, char* value);
78+
79+
// Process MMTk options. Return true if all options were processed successfully
80+
extern bool mmtk_process_bulk(char* options);
81+
82+
// Sanity only. Scan heap for discrepancies and errors
83+
extern void mmtk_scan_region();
84+
85+
// Request MMTk to trigger a GC. Note that this may not actually trigger a GC
86+
extern void mmtk_handle_user_collection_request(void* tls);
87+
88+
// Run the main loop for the GC controller thread. Does not return
89+
extern void mmtk_start_control_collector(void* tls);
90+
91+
// Run the main loop for a GC worker. Does not return
92+
extern void mmtk_start_worker(void* tls, void* worker);
93+
94+
// Return the current amount of free memory in bytes
95+
extern size_t mmtk_free_bytes();
96+
97+
// Return the current amount of used memory in bytes
98+
extern size_t mmtk_used_bytes();
99+
100+
// Return the current amount of total memory in bytes
101+
extern size_t mmtk_total_bytes();
102+
103+
// Return the starting address of MMTk's heap
104+
extern void* mmtk_starting_heap_address();
105+
106+
// Return the ending address of MMTk's heap
107+
extern void* mmtk_last_heap_address();
108+
109+
// Add a reference to the list of weak references
110+
extern void mmtk_add_weak_candidate(void* ref, void* referent);
111+
112+
// Add a reference to the list of soft references
113+
extern void mmtk_add_soft_candidate(void* ref, void* referent);
114+
115+
// Add a reference to the list of phantom references
116+
extern void mmtk_add_phantom_candidate(void* ref, void* referent);
117+
118+
// Generic hook to allow benchmarks to be harnessed
119+
extern void mmtk_harness_begin(void* tls);
120+
121+
// Generic hook to allow benchmarks to be harnessed
122+
extern void mmtk_harness_end();
88123

89124
#ifdef __cplusplus
90125
}
91126
#endif
92127

93-
#endif // MMTK_H
128+
#endif // MMTK_H

vmbindings/dummyvm/api/mmtk.h

Lines changed: 97 additions & 52 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,10 @@
1+
// This is an example of native API for the single instance MMTk.
2+
3+
// Note: the mmtk core does not directly provide this API. However, it provides
4+
// a similar multi-instance Rust API. A VM binding should write their own C
5+
// header file (possibly based on this example with their own extension and
6+
// modification), and expose the Rust API based on their native API.
7+
18
#ifndef MMTK_H
29
#define MMTK_H
310

@@ -9,75 +16,113 @@ extern "C" {
916
#endif
1017

1118
typedef void* MMTk_Mutator;
12-
typedef void* MMTk_TraceLocal;
1319

14-
/**
15-
* Allocation
16-
*/
17-
extern MMTk_Mutator bind_mutator(void *tls);
18-
extern void destroy_mutator(MMTk_Mutator mutator);
20+
// Initialize an MMTk instance
21+
extern void mmtk_gc_init(size_t heap_size);
22+
23+
// Request MMTk to create a new mutator for the given `tls` thread
24+
extern MMTk_Mutator mmtk_bind_mutator(void* tls);
25+
26+
// Reclaim mutator that is no longer needed
27+
extern void mmtk_destroy_mutator(MMTk_Mutator mutator);
28+
29+
// Flush mutator local state
30+
extern void mmtk_flush_mutator(MMTk_Mutator mutator);
31+
32+
// Initialize MMTk scheduler and GC workers
33+
extern void mmtk_initialize_collection(void* tls);
34+
35+
// Allow MMTk to perform a GC when the heap is full
36+
extern void mmtk_enable_collection();
37+
38+
// Disallow MMTk to perform a GC when the heap is full
39+
extern void mmtk_disable_collection();
40+
41+
// Allocate memory for an object
42+
extern void* mmtk_alloc(MMTk_Mutator mutator,
43+
size_t size,
44+
size_t align,
45+
ssize_t offset,
46+
int allocator);
47+
48+
// Slowpath allocation for an object
49+
extern void* mmtk_alloc_slow(MMTk_Mutator mutator,
50+
size_t size,
51+
size_t align,
52+
ssize_t offset,
53+
int allocator);
54+
55+
// Perform post-allocation hooks or actions such as initializing object metadata
56+
extern void mmtk_post_alloc(MMTk_Mutator mutator,
57+
void* refer,
58+
int bytes,
59+
int allocator);
60+
61+
// Return if the object pointed to by `ref` is live
62+
extern bool mmtk_is_live_object(void* ref);
63+
64+
// Return if the object pointed to by `ref` is in mapped memory
65+
extern bool mmtk_is_mapped_object(void* ref);
66+
67+
// Return if the address pointed to by `addr` is in mapped memory
68+
extern bool mmtk_is_mapped_address(void* addr);
69+
70+
// Check if a GC is in progress and if the object `ref` is movable
71+
extern void mmtk_modify_check(void* ref);
72+
73+
// Return if object pointed to by `object` will never move
74+
extern bool mmtk_will_never_move(void* object);
75+
76+
// Process an MMTk option. Return true if option was processed successfully
77+
extern bool mmtk_process(char* name, char* value);
78+
79+
// Process MMTk options. Return true if all options were processed successfully
80+
extern bool mmtk_process_bulk(char* options);
1981

20-
extern void* alloc(MMTk_Mutator mutator, size_t size,
21-
size_t align, size_t offset, int allocator);
82+
// Sanity only. Scan heap for discrepancies and errors
83+
extern void mmtk_scan_region();
2284

23-
extern void post_alloc(MMTk_Mutator mutator, void* refer,
24-
int bytes, int allocator);
85+
// Request MMTk to trigger a GC. Note that this may not actually trigger a GC
86+
extern void mmtk_handle_user_collection_request(void* tls);
2587

26-
extern bool is_live_object(void* ref);
27-
extern bool is_mapped_object(void* ref);
28-
extern bool is_mapped_address(void* addr);
29-
extern void modify_check(void* ref);
88+
// Run the main loop for the GC controller thread. Does not return
89+
extern void mmtk_start_control_collector(void* tls);
3090

31-
/**
32-
* Tracing
33-
*/
34-
extern void report_delayed_root_edge(MMTk_TraceLocal trace_local,
35-
void* addr);
91+
// Run the main loop for a GC worker. Does not return
92+
extern void mmtk_start_worker(void* tls, void* worker);
3693

37-
extern bool will_not_move_in_current_collection(MMTk_TraceLocal trace_local,
38-
void* obj);
94+
// Return the current amount of free memory in bytes
95+
extern size_t mmtk_free_bytes();
3996

40-
extern void process_interior_edge(MMTk_TraceLocal trace_local, void* target,
41-
void* slot, bool root);
97+
// Return the current amount of used memory in bytes
98+
extern size_t mmtk_used_bytes();
4299

43-
extern void* trace_get_forwarded_referent(MMTk_TraceLocal trace_local, void* obj);
100+
// Return the current amount of total memory in bytes
101+
extern size_t mmtk_total_bytes();
44102

45-
extern void* trace_get_forwarded_reference(MMTk_TraceLocal trace_local, void* obj);
103+
// Return the starting address of MMTk's heap
104+
extern void* mmtk_starting_heap_address();
46105

47-
extern void* trace_retain_referent(MMTk_TraceLocal trace_local, void* obj);
106+
// Return the ending address of MMTk's heap
107+
extern void* mmtk_last_heap_address();
48108

49-
/**
50-
* Misc
51-
*/
52-
extern void gc_init(size_t heap_size);
53-
extern bool will_never_move(void* object);
54-
extern bool process(char* name, char* value);
55-
extern void handle_user_collection_request(void *tls);
109+
// Add a reference to the list of weak references
110+
extern void mmtk_add_weak_candidate(void* ref, void* referent);
56111

57-
extern void start_control_collector(void *tls);
58-
extern void start_worker(void *tls, void* worker, void* mmtk);
112+
// Add a reference to the list of soft references
113+
extern void mmtk_add_soft_candidate(void* ref, void* referent);
59114

60-
/**
61-
* VM Accounting
62-
*/
63-
extern size_t free_bytes();
64-
extern size_t total_bytes();
65-
extern size_t used_bytes();
66-
extern void* starting_heap_address();
67-
extern void* last_heap_address();
115+
// Add a reference to the list of phantom references
116+
extern void mmtk_add_phantom_candidate(void* ref, void* referent);
68117

69-
/**
70-
* Reference Processing
71-
*/
72-
extern void add_weak_candidate(void* ref, void* referent);
73-
extern void add_soft_candidate(void* ref, void* referent);
74-
extern void add_phantom_candidate(void* ref, void* referent);
118+
// Generic hook to allow benchmarks to be harnessed
119+
extern void mmtk_harness_begin(void* tls);
75120

76-
extern void harness_begin(void *tls);
77-
extern void harness_end();
121+
// Generic hook to allow benchmarks to be harnessed
122+
extern void mmtk_harness_end();
78123

79124
#ifdef __cplusplus
80125
}
81126
#endif
82127

83-
#endif // MMTK_H
128+
#endif // MMTK_H

0 commit comments

Comments
 (0)