1 /**********************************************************************
2 
3   transient_heap.h - declarations of transient_heap related APIs.
4 
5   Copyright (C) 2018 Koichi Sasada
6 
7 **********************************************************************/
8 
9 #ifndef RUBY_TRANSIENT_HEAP_H
10 #define RUBY_TRANSIENT_HEAP_H
11 
12 #include "internal.h"
13 
14 #if USE_TRANSIENT_HEAP
15 
16 /* public API */
17 
18 /* Allocate req_size bytes from transient_heap.
19    Allocated memories are free-ed when next GC
20    if this memory is not marked by `rb_transient_heap_mark()`.
21  */
22 void *rb_transient_heap_alloc(VALUE obj, size_t req_size);
23 
24 /* If `obj` uses a memory pointed by `ptr` from transient_heap,
25    you need to call `rb_transient_heap_mark(obj, ptr)`
26    to assert liveness of `obj` (and ptr). */
27 void  rb_transient_heap_mark(VALUE obj, const void *ptr);
28 
29 /* used by gc.c */
30 void rb_transient_heap_promote(VALUE obj);
31 void rb_transient_heap_start_marking(int full_marking);
32 void rb_transient_heap_finish_marking(void);
33 
34 /* for debug API */
35 void rb_transient_heap_dump(void);
36 void rb_transient_heap_verify(void);
37 int  rb_transient_heap_managed_ptr_p(const void *ptr);
38 
39 /* evacuate functions for each type */
40 void rb_ary_transient_heap_evacuate(VALUE ary, int promote);
41 void rb_obj_transient_heap_evacuate(VALUE obj, int promote);
42 void rb_hash_transient_heap_evacuate(VALUE hash, int promote);
43 void rb_struct_transient_heap_evacuate(VALUE st, int promote);
44 
45 #else /* USE_TRANSIENT_HEAP */
46 
47 #define rb_transient_heap_alloc(o, s) NULL
48 #define rb_transient_heap_verify() ((void)0)
49 #define rb_transient_heap_promote(obj) ((void)0)
50 #define rb_transient_heap_start_marking(full_marking) ((void)0)
51 #define rb_transient_heap_finish_marking() ((void)0)
52 #define rb_transient_heap_mark(obj, ptr) ((void)0)
53 
54 #define rb_ary_transient_heap_evacuate(x, y) ((void)0)
55 #define rb_obj_transient_heap_evacuate(x, y) ((void)0)
56 #define rb_hash_transient_heap_evacuate(x, y) ((void)0)
57 #define rb_struct_transient_heap_evacuate(x, y) ((void)0)
58 
59 #endif /* USE_TRANSIENT_HEAP */
60 #endif
61