aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
Commit message (Collapse)AuthorAgeFilesLines
* Change darray size to size_t and add functions that use GC mallocPeter Zhu2022-02-161-0/+7
| | | | | | | Changes size and capacity of darray to size_t to support more elements. Adds functions to darray that use GC allocation functions.
* `wmap#each` should check liveness of keysKoichi Sasada2022-02-161-20/+42
| | | | | `ObjectSpace::WeakMap#each*` should check key's liveness. fix [Bug #18586]
* fix GC event synchronizationKoichi Sasada2022-02-141-14/+22
| | | | | | | | | | | | | | (1) gc_verify_internal_consistency() use barrier locking for consistency while `during_gc == true` at the end of the sweep on `RGENGC_CHECK_MODE >= 2`. (2) `rb_objspace_reachable_objects_from()` is called without VM synchronization and it checks `during_gc != true`. So (1) and (2) causes BUG because of `during_gc == true`. To prevent this error, wait for VM barrier on `during_gc == false` and introduce VM locking on `rb_objspace_reachable_objects_from()`. http://ci.rvm.jp/results/trunk-asserts@phosphorus-docker/3830088
* Free cached mark stack chunks when freeing objspacePeter Zhu2022-02-101-2/+19
| | | | Cached mark stack chunks should also be freed when freeing objspace.
* Move total_freed_pages to size poolPeter Zhu2022-02-031-3/+17
|
* Move total_allocated_pages to size poolPeter Zhu2022-02-031-3/+20
|
* Fix case when gc_marks_continue does not yield slotsPeter Zhu2022-02-031-4/+5
| | | | | | | | | gc_marks_continue will start sweeping when it finishes marking. However, if the heap we are trying to allocate into is full, then the sweeping may not yield any free slots. If we don't call gc_sweep_continue immediate after this, then another GC will be started halfway during lazy sweeping. gc_sweep_continue will either grow the heap or finish sweeping.
* Decouple GC slot sizes from RVALUEPeter Zhu2022-02-021-73/+84
| | | | | | | | | Add a new macro BASE_SLOT_SIZE that determines the slot size. For Variable Width Allocation (compiled with USE_RVARGC=1), all slot sizes are powers-of-2 multiples of BASE_SLOT_SIZE. For USE_RVARGC=0, BASE_SLOT_SIZE is set to sizeof(RVALUE).
* Fix heap page iteration in gc_verify_heap_pagePeter Zhu2022-01-311-6/+8
| | | | | The for loops are not correctly iterating heap pages in gc_verify_heap_page.
* [Bug#18556] Fallback `MAP_ ANONYMOUS`Nobuyoshi Nakada2022-01-291-0/+4
| | | Define `MAP_ANONYMOUS` to `MAP_ANON` if undefined on old systems.
* Fix typo in assertion in gc.cPeter Zhu2022-01-261-1/+1
|
* Unpoison the cached object in the exact sizeNobuyoshi Nakada2022-01-261-1/+7
|
* Call rb_id_table_foreach_values insteadPeter Zhu2022-01-251-2/+2
| | | | | These places never replace the value, so call rb_id_table_foreach_values instead of rb_id_table_foreach_values_with_replace.
* Rename rb_id_table_foreach_with_replacePeter Zhu2022-01-251-7/+7
| | | | | | | Renames rb_id_table_foreach_with_replace to rb_id_table_foreach_values_with_replace and passes only the value to the callback. We can use this in GC compaction when we cannot access the global symbol array.
* Remove redundant if statement in try_movePeter Zhu2022-01-251-6/+1
| | | | | The if statement is redundant since if `index == 0` then `BITS_BITLENGTH * index == 0`.
* Keep right operand within width when right shiftingPeter Zhu2022-01-241-1/+1
| | | | | | | | | | | | NUM_IN_PAGE could return a value much larger than 64. According to the C11 spec 6.5.7 paragraph 3 this is undefined behavior: > If the value of the right operand is negative or is greater than or > equal to the width of the promoted left operand, the behavior is > undefined. On most platforms, this is usually not a problem as the architecture will mask off all out-of-range bits.
* [wasm] Disallow compactionPeter Zhu2022-01-241-12/+26
| | | | | WebAssembly doesn't support signals so we can't use read barriers so we can't use compaction.
* Fix format size qualifier on IL32P64Nobuyoshi Nakada2022-01-191-1/+1
|
* [wasm] gc.c: scan wasm locals and c stack to mark living objectsYuta Saito2022-01-191-21/+40
| | | | | | | WebAssembly has function local infinite registers and stack values, but there is no way to scan the values in a call stack for now. This implementation uses Asyncify to spilling out wasm locals into linear memory.
* [wasm] gc.c: disable read signal barrier for wasiYuta Saito2022-01-191-0/+14
| | | | WASI currently does not yet support signal
* [wasm] eval_inter.h gc.c vm_core.h: include wasm/setjmp.h instead of sysroot ↵Yuta Saito2022-01-191-1/+5
| | | | header
* Separately allocate class_serial on 32-bit systemsPeter Zhu2022-01-141-0/+4
| | | | | | | | On 32-bit systems, VWA causes class_serial to not be aligned (it only guarantees 4 byte alignment but class_serial is 8 bytes and requires 8 byte alignment). This commit uses a hack to allocate class_serial through malloc. Once VWA allocates with 8 byte alignment in the future, we will revert this commit.
* Improve string info in rb_raw_obj_infoPeter Zhu2022-01-071-2/+9
| | | | | Improve rb_raw_obj_info to output additional into about strings including the length, capacity, and whether or not it is embedded.
* Remove assertion causing read barrier to triggerPeter Zhu2022-01-051-2/+0
| | | | | GET_HEAP_PAGE reads the page. If during compaction there is a read barrier on the page, it causes the read barrier to trigger.
* Switch `is_pointer_to_heap` to use library bsearchMatt Valentine-House2022-01-041-23/+50
| | | | | | | | | | | | | | | | This commit switches from a custom implemented bsearch algorithm to use the one provided by the C standard library. Because `is_pointer_to_heap` will only return true if the pointer being searched for is a valid slot starting address within the heap page body, we've extracted the bsearch call site into a more general function so we can use it elsewhere. The new function `heap_page_for_ptr` returns the heap page for any heap page pointer, regardless of whether that is at the start of a slot or in the middle of one. We then use this function as the basis of `is_pointer_to_heap`.
* [Feature #18364] Add GC.stat_heap to get stats for memory heapsPeter Zhu2022-01-041-0/+122
| | | | | GC.stat_heap will return stats for memory heaps. This is used for the Variable Width Allocation feature.
* Negative RBOOL usageNobuyoshi Nakada2022-01-011-2/+2
|
* On 64bit macOS, enlarge heap pages to reduce mmap calls [Bug #18447]Nobuyoshi Nakada2021-12-291-0/+7
|
* Remove deprecate rb_cData [Bug #18433]Nobuyoshi Nakada2021-12-261-3/+0
| | | | Also enable the warning for T_DATA allocator.
* `finalize_deferred` doesn't need VM lockKoichi Sasada2021-12-231-6/+2
| | | | `finalize_list()` acquires VM lock to manipulate objspace state.
* undef `rb_vm_lookup_overloaded_cme()`Koichi Sasada2021-12-231-6/+5
| | | | | | | | | | | | | | Some callable method entries (cme) can be a key of `overloaded_cme_table` and the keys should be pinned because the table is numtable (VALUE is a key). Before the patch GC checks the cme is in `overloaded_cme_table` by looking up the table, but it needs VM locking. It works well in normal GC marking because it is protected by the VM lock, but it doesn't work on `rb_objspace_reachable_objects_from` because it doesn't use VM lock. Now, the number of target cmes are small enough, I decide to pin down all possible cmes instead of using looking up the table.
* make `overloaded_cme_table` truly weak key mapKoichi Sasada2021-12-211-7/+1
| | | | | | | | | | | | | `overloaded_cme_table` keeps cme -> monly_cme pairs to manage corresponding `monly_cme` for `cme`. The lifetime of the `monly_cme` should be longer than `monly_cme`, but the previous patch losts the reference to the living `monly_cme`. Now `overloaded_cme_table` values are always root (keys are only weak reference), it means `monly_cme` does not freed until corresponding `cme` is invalidated. To make managing easy, move `overloaded_cme_table` to `rb_vm_t`.
* `mandatory_only_cme` should not be in `def`Koichi Sasada2021-12-211-4/+13
| | | | | | | | | | | | | | | | | | | | | | | | `def` (`rb_method_definition_t`) is shared by multiple callable method entries (cme, `rb_callable_method_entry_t`). There are two issues: * old -> young reference: `cme1->def->mandatory_only_cme = monly_cme` if `cme1` is young and `monly_cme` is young, there is no problem. Howevr, another old `cme2` can refer `def`, in this case, old `cme2` points young `monly_cme` and it violates gengc assumption. * cme can have different `defined_class` but `monly_cme` only has one `defined_class`. It does not make sense and `monly_cme` should be created for a cme (not `def`). To solve these issues, this patch allocates `monly_cme` per `cme`. `cme` does not have another room to store a pointer to the `monly_cme`, so this patch introduces `overloaded_cme_table`, which is weak key map `[cme] -> [monly_cme]`. `def::body::iseqptr::monly_cme` is deleted. The first issue is reported by Alan Wu.
* Show whether object is garbage in rb_raw_obj_info()Alan Wu2021-12-201-1/+2
| | | | | | When using `rp(obj)` for debugging during development, it may be useful to know that an object is soon to be swept. Add a new letter to the object dump for whether the object is garbage. It's easy to forget about lazy sweep.
* Remove compaction support detection using sysconfPeter Zhu2021-12-141-35/+3
| | | | | | | Except on Windows and MinGW, we can only use compaction on systems that use mmap (only systems that use mmap can use the read barrier that compaction requires). We don't need to separately detect whether we can support compaction or not.
* Fixed the check order in wmap_live_p [Bug #18392]Nobuyoshi Nakada2021-12-071-13/+22
| | | | | Check if the object is a pointer to heap before check the flag in that object.
* ObjectSpace::WeakMap#inspect: check if living object [Bug #18392]Nobuyoshi Nakada2021-12-071-6/+23
|
* Refactor GC functions to have consistent namingPeter Zhu2021-12-031-18/+18
| | | | | Refactor function names for consistency. Function with name xyz_page should have a corresponding function named xyz_plane.
* Lazily create singletons on instance_{exec,eval} (#5146)John Hawthorn2021-12-021-2/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | * Lazily create singletons on instance_{exec,eval} Previously when instance_exec or instance_eval was called on an object, that object would be given a singleton class so that method definitions inside the block would be added to the object rather than its class. This commit aims to improve performance by delaying the creation of the singleton class unless/until one is needed for method definition. Most of the time instance_eval is used without any method definition. This was implemented by adding a flag to the cref indicating that it represents a singleton of the object rather than a class itself. In this case CREF_CLASS returns the object's existing class, but in cases that we are defining a method (either via definemethod or VM_SPECIAL_OBJECT_CBASE which is used for undef and alias). This also happens to fix what I believe is a bug. Previously instance_eval behaved differently with regards to constant access for true/false/nil than for all other objects. I don't think this was intentional. String::Foo = "foo" "".instance_eval("Foo") # => "foo" Integer::Foo = "foo" 123.instance_eval("Foo") # => "foo" TrueClass::Foo = "foo" true.instance_eval("Foo") # NameError: uninitialized constant Foo This also slightly changes the error message when trying to define a method through instance_eval on an object which can't have a singleton class. Before: $ ruby -e '123.instance_eval { def foo; end }' -e:1:in `block in <main>': no class/module to add method (TypeError) After: $ ./ruby -e '123.instance_eval { def foo; end }' -e:1:in `block in <main>': can't define singleton (TypeError) IMO this error is a small improvement on the original and better matches the (both old and new) message when definging a method using `def self.` $ ruby -e '123.instance_eval{ def self.foo; end }' -e:1:in `block in <main>': can't define singleton (TypeError) Co-authored-by: Matthew Draper <matthew@trebex.net> * Remove "under" argument from yield_under * Move CREF_SINGLETON_SET into vm_cref_new * Simplify vm_get_const_base * Fix leaf VM_SPECIAL_OBJECT_CONST_BASE Co-authored-by: Matthew Draper <matthew@trebex.net>
* Don't clear the constant cache when finishing compactionMatt Valentine-House2021-12-021-1/+0
| | | | References are being updated correctly, so this is no longer necessary
* Cast tv_usec to int32_t to fit in tv_nsecYuta Saito2021-12-021-1/+1
| | | | | | suseconds_t, which is the type of tv_usec, may be defined with a longer size type than tv_nsec's type (long). So usec to nsec conversion needs an explicit casting.
* Fix a function name in an error messageKazuhiro NISHIYAMA2021-11-261-1/+1
|
* Remove unused function `size_pool_for_size`Kazuhiro NISHIYAMA2021-11-261-14/+0
| | | | | | | | | | ``` compiling ../gc.c ../gc.c:2444:1: warning: unused function 'size_pool_for_size' [-Wunused-function] size_pool_for_size(rb_objspace_t *objspace, size_t size) ^ 1 warning generated. ```
* initialize allocated memory by VWA for assertionsKoichi Sasada2021-11-261-0/+4
| | | | | When `RGENGC_CHECK_MODE` is enable, `obj_memsize_of` is called in `newobj_init` and it expect the memory is zero-cleared.
* Revert "Add GC.stat_size_pool to get stats for a size pool"Peter Zhu2021-11-251-95/+0
| | | | | | This reverts commit 6157619bb68e4307cdf065cb73d5bfcec30d042d. We'll wait for comments in the open ticket: https://bugs.ruby-lang.org/issues/18364
* Add GC.stat_size_pool to get stats for a size poolPeter Zhu2021-11-251-0/+95
| | | | | GC.stat_size_pool will return stats for a particular size pool. This is used for the Variable Width Allocation feature.
* Speed up Ractors for Variable Width AllocationPeter Zhu2021-11-231-93/+59
| | | | | | | | | | | | | | | | This commit adds a Ractor cache for every size pool. Previously, all VWA allocated objects used the slowpath and locked the VM. On a micro-benchmark that benchmarks String allocation: VWA turned off: 29.196591 0.889709 30.086300 ( 9.434059) VWA before this commit: 29.279486 41.477869 70.757355 ( 12.527379) VWA after this commit: 16.782903 0.557117 17.340020 ( 4.255603)
* Removes unused HEAP_PAGE_BITMAP_PLANES constant from gc.cJemma Issroff2021-11-221-2/+0
|
* Make RCLASS_EXT(c)->subclasses a doubly linked listMatt Valentine-House2021-11-221-13/+2
| | | | | | | | Updating RCLASS_PARENT_SUBCLASSES and RCLASS_MODULE_SUBCLASSES while compacting can trigger the read barrier. This commit makes RCLASS_SUBCLASSES a doubly linked list with a dedicated head object so that we can add and remove entries from the list without having to touch an object in the Ruby heap
* gc.c: Fix a compile error on some crossbuildsYusuke Endoh2021-11-191-1/+1
| | | | | | | | | | | | | | | | | | | | http://rubyci.s3.amazonaws.com/crossruby/crossruby-master-wasm32_emscripten/log/20211118T233311Z.log.html.gz#make ``` compiling gc.c gc.c:10629:47: error: implicit conversion loses integer precision: 'unsigned long long' to 'size_t' (aka 'unsigned long') [-Werror,-Wshorten-64-to-32] SET(time, objspace->profile.total_time_ns / (1000 * 1000) /* ns -> ms */); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gc.c:10624:9: note: expanded from macro 'SET' return attr; \ ~~~~~~ ^~~~ gc.c:10629:47: error: implicit conversion loses integer precision: 'unsigned long long' to 'unsigned long' [-Werror,-Wshorten-64-to-32] SET(time, objspace->profile.total_time_ns / (1000 * 1000) /* ns -> ms */); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ gc.c:10626:68: note: expanded from macro 'SET' rb_hash_aset(hash, gc_stat_symbols[gc_stat_sym_##name], SIZET2NUM(attr)); ~~~~~~~~~ ^~~~ 2 errors generated. ```