diff options
author | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-10-30 21:53:56 +0000 |
---|---|---|
committer | ko1 <ko1@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2018-10-30 21:53:56 +0000 |
commit | 312b105d0e263a36c129a14f2681fe16905c0244 (patch) | |
tree | 00bf11825e6f8a8cb12ba1f2c02c722f35090e0c /transient_heap.h | |
parent | 69b8ffcd5b8b28c56212368a3fe66f076b90e4c4 (diff) | |
download | ruby-312b105d0e263a36c129a14f2681fe16905c0244.tar.gz |
introduce TransientHeap. [Bug #14858]
* transient_heap.c, transient_heap.h: implement TransientHeap (theap).
theap is designed for Ruby's object system. theap is like Eden heap
on generational GC terminology. theap allocation is very fast because
it only needs to bump up pointer and deallocation is also fast because
we don't do anything. However we need to evacuate (Copy GC terminology)
if theap memory is long-lived. Evacuation logic is needed for each type.
See [Bug #14858] for details.
* array.c: Now, theap for T_ARRAY is supported.
ary_heap_alloc() tries to allocate memory area from theap. If this trial
sccesses, this array has theap ptr and RARRAY_TRANSIENT_FLAG is turned on.
We don't need to free theap ptr.
* ruby.h: RARRAY_CONST_PTR() returns malloc'ed memory area. It menas that
if ary is allocated at theap, force evacuation to malloc'ed memory.
It makes programs slow, but very compatible with current code because
theap memory can be evacuated (theap memory will be recycled).
If you want to get transient heap ptr, use RARRAY_CONST_PTR_TRANSIENT()
instead of RARRAY_CONST_PTR(). If you can't understand when evacuation
will occur, use RARRAY_CONST_PTR().
(re-commit of r65444)
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@65449 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
Diffstat (limited to 'transient_heap.h')
-rw-r--r-- | transient_heap.h | 38 |
1 files changed, 38 insertions, 0 deletions
diff --git a/transient_heap.h b/transient_heap.h new file mode 100644 index 0000000000..ac0eaadb78 --- /dev/null +++ b/transient_heap.h @@ -0,0 +1,38 @@ +/********************************************************************** + + transient_heap.h - declarations of transient_heap related APIs. + + Copyright (C) 2018 Koichi Sasada + +**********************************************************************/ + +#ifndef RUBY_TRANSIENT_HEAP_H +#define RUBY_TRANSIENT_HEAP_H + +/* public API */ + +/* Allocate req_size bytes from transient_heap. + Allocated memories are free-ed when next GC + if this memory is not marked by `rb_transient_heap_mark()`. + */ +void *rb_transient_heap_alloc(VALUE obj, size_t req_size); + +/* If `obj` uses a memory pointed by `ptr` from transient_heap, + you need to call `rb_transient_heap_mark(obj, ptr)` + to assert liveness of `obj` (and ptr). */ +void rb_transient_heap_mark(VALUE obj, const void *ptr); + +/* used by gc.c */ +void rb_transient_heap_promote(VALUE obj); +void rb_transient_heap_start_marking(int full_marking); +void rb_transient_heap_finish_marking(void); + +/* for debug API */ +void rb_transient_heap_dump(void); +void rb_transient_heap_verify(void); +int rb_transient_heap_managed_ptr_p(const void *ptr); + +/* evacuate functions */ +void rb_ary_transient_heap_evacuate(VALUE ary, int promote); + +#endif |