summaryrefslogtreecommitdiff
path: root/gc.c
AgeCommit message (Collapse)Author
2021-01-05enable constant cache on ractorsKoichi Sasada
constant cache `IC` is accessed by non-atomic manner and there are thread-safety issues, so Ruby 3.0 disables to use const cache on non-main ractors. This patch enables it by introducing `imemo_constcache` and allocates it by every re-fill of const cache like `imemo_callcache`. [Bug #17510] Now `IC` only has one entry `IC::entry` and it points to `iseq_inline_constant_cache_entry`, managed by T_IMEMO object. `IC` is atomic data structure so `rb_mjit_before_vm_ic_update()` and `rb_mjit_after_vm_ic_update()` is not needed. Notes: Merged: https://github.com/ruby/ruby/pull/4022
2020-12-29Stop managing valid class serialsTakashi Kokubun
`mjit_valid_class_serial_p` has no longer been used since b9007b6c548.
2020-12-28Adjusted styles [ci skip]Nobuyoshi Nakada
2020-12-26Fixed leaked global symbolsNobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/4003
2020-12-25define RGENGC_DEBUG_ENABLED() as 0Koichi Sasada
on RUBY_DEVEL==0 and !HAVE_VA_ARGS_MACRO. gc_report() is always enabled on such configuration (maybe it is a bug) so disable RGENGC_DEBUG_ENABLED().
2020-12-23Use rb_init_identtable instead of direct use of rb_hashtype_identNobuyoshi Nakada
2020-12-22separate rb_ractor_pub from rb_ractor_tKoichi Sasada
separate some fields from rb_ractor_t to rb_ractor_pub and put it at the beggining of rb_ractor_t and declare it in vm_core.h so vm_core.h can access rb_ractor_pub fields. Now rb_ec_ractor_hooks() is a complete inline function and no MJIT related issue. Notes: Merged: https://github.com/ruby/ruby/pull/3943
2020-12-18finalizing should be checked before VM lockKoichi Sasada
2020-12-18Removed a moved local variableNobuyoshi Nakada
2020-12-18need to sync gc_finalize_deferredKoichi Sasada
gc_finalize_deferred() runs finalizers and it accesses objspace, so it need to sync.
2020-12-18Removed old GC.stat keys deprecated since 2.2Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/3921
2020-12-18Removed old GC tuning environment variables deprecated since 2.1Nobuyoshi Nakada
Notes: Merged: https://github.com/ruby/ruby/pull/3921
2020-12-18acquire VM lock on gc_verify_internal_consistency()Koichi Sasada
There is a case to call this function without VM lock acquiring.
2020-12-18add explicit checkKoichi Sasada
To debug this issue: https://rubyci.org/logs/rubyci.s3.amazonaws.com/solaris10-gcc/ruby-master/log/20201217T220004Z.fail.html.gz
2020-12-18gc_verify_internal_consistency() needs barrierKoichi Sasada
gc_verify_internal_consistency() accesses all slots (objects) so all ractors should stop before starting this function.
2020-12-17sync obj_to_id_tblKoichi Sasada
objspace->obj_to_id_tbl is a shared table so we need to synchronize it to access. Notes: Merged: https://github.com/ruby/ruby/pull/3924
2020-12-17reduce barrier counts for GC eventsKoichi Sasada
mark needs barrier (stop other ractors), but other GC events don't need barriers (maybe...). Notes: Merged: https://github.com/ruby/ruby/pull/3923
2020-12-17relax synchronization on WBKoichi Sasada
Current synchronization is too much on write barriers. Notes: Merged: https://github.com/ruby/ruby/pull/3918
2020-12-17add debug counters for gc start eventsKoichi Sasada
2020-12-17RGENGC_PROFILE=0Koichi Sasada
Enabled this flag, maybe accidentally.
2020-12-15Removed unneeded cast and use the real nameNobuyoshi Nakada
2020-12-11revert da3bca513f437b05b3953c3712ff48621fc5e008Koichi Sasada
It seems introduce critical problems. Now I could not find out the issue. http://ci.rvm.jp/results/trunk-test@ruby-sky1/3286048
2020-12-10ObjectSpace._id2ref should not support unshareableKoichi Sasada
ObjectSpace._id2ref(id) can return any objects even if they are unshareable, so this patch raises RangeError if it runs on multi-ractor mode and the found object is unshareable. Notes: Merged: https://github.com/ruby/ruby/pull/3878
2020-12-10Unpoison freelist to chainNobuyoshi Nakada
2020-12-10cache free pages per ractorKoichi Sasada
Per ractor method cache (GH-#3842) only cached 1 page and this patch caches several pages to keep at least 512 free slots if available. If you increase the number of cached free slots, all cached slots will be collected when the GC is invoked. Notes: Merged: https://github.com/ruby/ruby/pull/3875
2020-12-10set min/maximum free slots relative to ractor cntKoichi Sasada
A program with multiple ractors can consume more objects per unit time, so this patch set minimum/maximum free_slots to relative to ractors count (upto 8). Notes: Merged: https://github.com/ruby/ruby/pull/3875
2020-12-10lazy sweep tries to collect 2048 slotsKoichi Sasada
Lazy sweep tries to collect free (unused) slots incrementally, and it only collect a few pages. This patch makes lazy sweep collects more objects (at least 2048 objects) and GC overhead of multi-ractor execution will be reduced. Notes: Merged: https://github.com/ruby/ruby/pull/3875
2020-12-09need the lock for debug checking.Koichi Sasada
Checking code (RGENGC_CHECK_MODE > 0) need a VM lock because it refers objspace.
2020-12-07need more lock in finalize_list()Koichi Sasada
Some data should be accessed in parallel so they should be protected by the lock.
2020-12-07RB_VM_LOCK_ENTER_NO_BARRIERKoichi Sasada
Write barrier requires VM lock because it accesses VM global bitmap but RB_VM_LOCK_ENTER() can invoke GC because another ractor can wait to invoke GC and RB_VM_LOCK_ENTER() is barrier point. This means that before protecting by a write barrier, GC can invoke. To prevent such situation, RB_VM_LOCK_ENTER_NO_BARRIER() is introduced. This lock primitive does not become GC barrier points.
2020-12-07skip assertion on multi-ractorKoichi Sasada
This assertion is not considerred on multi-ractor mdoe.
2020-12-07RB_EC_NEWOBJ_OFKoichi Sasada
NEWOBJ with current ec. Notes: Merged: https://github.com/ruby/ruby/pull/3842
2020-12-07per-ractor object allocationKoichi Sasada
Now object allocation requires VM global lock to synchronize objspace. However, of course, it introduces huge overhead. This patch caches some slots (in a page) by each ractor and use cached slots for object allocation. If there is no cached slots, acquire the global lock and get new cached slots, or start GC (marking or lazy sweeping). Notes: Merged: https://github.com/ruby/ruby/pull/3842
2020-12-03Revert "Skip repeated scan of object during compaction"Aaron Patterson
This seems to be breaking the build for some reason. This command can reproduce it: `make yes-test-all TESTS=--repeat-count=20` This reverts commit 88bb1a672c49746972f4b15410fa92e9d237c43d.
2020-12-03Skip repeated scan of object during compactionPeter Zhu
Notes: Merged: https://github.com/ruby/ruby/pull/3843
2020-12-02When allocating new pages, add them to the end of the linked listAaron Patterson
When we allocate new pages, allocate them on the end of the linked list. Then when we compact we can move things to the head of the list Notes: Merged: https://github.com/ruby/ruby/pull/3814
2020-12-02Incremental sweeping should not require page allocationAaron Patterson
Incremental sweeping should sweep until we find a slot for objects to use. `heap_increment` was adding a page to the heap even though we would sweep immediately after. Co-authored-by: John Hawthorn <john@hawthorn.email> Notes: Merged: https://github.com/ruby/ruby/pull/3837
2020-12-01show with sharing infoKoichi Sasada
2020-12-01ractor local storage C-APIKoichi Sasada
To manage ractor-local data for C extension, the following APIs are defined. * rb_ractor_local_storage_value_newkey * rb_ractor_local_storage_value * rb_ractor_local_storage_value_set * rb_ractor_local_storage_ptr_newkey * rb_ractor_local_storage_ptr * rb_ractor_local_storage_ptr_set At first, you need to create a key of storage by rb_ractor_local_(value|ptr)_newkey(). For ptr storage, it accepts the type of storage, how to mark and how to free with ractor's lifetime. rb_ractor_local_storage_value/set are used to access a VALUE and rb_ractor_local_storage_ptr/set are used to access a pointer. random.c uses this API. Notes: Merged: https://github.com/ruby/ruby/pull/3822
2020-11-30support SIGSEGV/BUS while read_barrier_handler()Koichi Sasada
read_barrier_handler() can cause SIGSEGV/BUS so it should show the errors.
2020-11-26Run rb_print_backtrace first on ruby_on_ciTakashi Kokubun
Unfortunately we couldn't see a C backtrace with the previous commit http://ci.rvm.jp/results/trunk-random2@phosphorus-docker/3272697.
2020-11-26Call rb_bug_without_die on CITakashi Kokubun
when GC.compact's SEGV handler is installed
2020-11-25Disable auto compaction on platforms that can't support itAaron Patterson
Both explicit compaction routines (gc_compact and the verify references form) need to clear the heap before executing compaction. Otherwise some objects may not be alive, and we'll need the read barrier. The heap must only contain *live* objects if we want to disable the read barrier during explicit compaction. The previous commit was missing the "clear the heap" phase from the "verify references" explicit compaction function. Fixes [Bug #17306]
2020-11-24Revert "Disable auto compaction on platforms that can't support it"Aaron Patterson
This reverts commit 63ad55cd882e4010fe313d271af006a430b5ffa8. Revert "Disable read barrier on explicit compaction request" This reverts commit 490b57783d80f0c5f7882c66d9fb6aa02713c9a5.
2020-11-24Disable auto compaction on platforms that can't support itAaron Patterson
Auto Compaction uses mprotect to implement a read barrier. mprotect can only work on regions of memory that are a multiple of the OS page size. Ruby's pages are a multiple of 4kb, but some platforms (like ppc64le) don't have 4kb page sizes. This commit disables the features on those platforms. Fixes [Bug #17306]
2020-11-24add HEAP_PAGE_SIZE to internal constantsAaron Patterson
2020-11-24Disable read barrier on explicit compaction requestAaron Patterson
We don't need a read barrier when the user calls `GC.compact` because we don't allow allocations during GC, and all references should be "live" Notes: Merged: https://github.com/ruby/ruby/pull/3809
2020-11-18fix public interfaceKoichi Sasada
To make some kind of Ractor related extensions, some functions should be exposed. * include/ruby/thread_native.h * rb_native_mutex_* * rb_native_cond_* * include/ruby/ractor.h * RB_OBJ_SHAREABLE_P(obj) * rb_ractor_shareable_p(obj) * rb_ractor_std*() * rb_cRactor and rm ractor_pub.h and rename srcdir/ractor.h to srcdir/ractor_core.h (to avoid conflict with include/ruby/ractor.h) Notes: Merged: https://github.com/ruby/ruby/pull/3775
2020-11-05gc_rest can change the total pages, so we need to do that firstAaron Patterson
2020-11-05add asserts to find crashAaron Patterson