aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
Commit message (Collapse)AuthorAgeFilesLines
* Revert "Skip repeated scan of object during compaction"Aaron Patterson2020-12-031-1/+1
| | | | | | | | | | 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.
* Skip repeated scan of object during compactionPeter Zhu2020-12-031-1/+1
|
* When allocating new pages, add them to the end of the linked listAaron Patterson2020-12-021-2/+2
| | | | | 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
* Incremental sweeping should not require page allocationAaron Patterson2020-12-021-3/+2
| | | | | | | | 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>
* show with sharing infoKoichi Sasada2020-12-011-0/+1
|
* ractor local storage C-APIKoichi Sasada2020-12-011-0/+1
| | | | | | | | | | | | | | | | | | | | | | 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.
* support SIGSEGV/BUS while read_barrier_handler()Koichi Sasada2020-11-301-11/+18
| | | | | read_barrier_handler() can cause SIGSEGV/BUS so it should show the errors.
* Run rb_print_backtrace first on ruby_on_ciTakashi Kokubun2020-11-261-1/+7
| | | | | Unfortunately we couldn't see a C backtrace with the previous commit http://ci.rvm.jp/results/trunk-random2@phosphorus-docker/3272697.
* Call rb_bug_without_die on CITakashi Kokubun2020-11-261-1/+6
| | | | when GC.compact's SEGV handler is installed
* Disable auto compaction on platforms that can't support itAaron Patterson2020-11-251-5/+64
| | | | | | | | | | | | | 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]
* Revert "Disable auto compaction on platforms that can't support it"Aaron Patterson2020-11-241-49/+3
| | | | | | | | This reverts commit 63ad55cd882e4010fe313d271af006a430b5ffa8. Revert "Disable read barrier on explicit compaction request" This reverts commit 490b57783d80f0c5f7882c66d9fb6aa02713c9a5.
* Disable auto compaction on platforms that can't support itAaron Patterson2020-11-241-0/+21
| | | | | | | | | | 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]
* add HEAP_PAGE_SIZE to internal constantsAaron Patterson2020-11-241-0/+1
|
* Disable read barrier on explicit compaction requestAaron Patterson2020-11-241-3/+28
| | | | | 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"
* fix public interfaceKoichi Sasada2020-11-181-1/+1
| | | | | | | | | | | | | | | | | | 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)
* gc_rest can change the total pages, so we need to do that firstAaron Patterson2020-11-051-2/+2
|
* add asserts to find crashAaron Patterson2020-11-051-3/+3
|
* Refactor verification methodAaron Patterson2020-11-051-43/+37
| | | | Combine everything in to one C function
* take VM lock when mutating the heapAaron Patterson2020-11-051-19/+27
|
* ensure T_OBJECT objects have internals initializedAaron Patterson2020-11-041-1/+5
|
* Add `GC.auto_compact= true/false` and `GC.auto_compact`Aaron Patterson2020-11-021-351/+642
| | | | | | | | | | * `GC.auto_compact=`, `GC.auto_compact` can be used to control when compaction runs. Setting `auto_compact=` to true will cause compaction to occurr duing major collections. At the moment, compaction adds significant overhead to major collections, so please test first! [Feature #17176]
* suppport Ractor.send(move: true) for more detaKoichi Sasada2020-11-021-12/+0
| | | | This patch allows to move more data types.
* Objects are born embedded, so we don't need to check ivprAaron Patterson2020-10-281-2/+1
| | | | | It's not necessary to check ivpt because objects are allocated as "embedded" by default
* Remove another unnecessary testAaron Patterson2020-10-281-5/+3
| | | | Same as 5be42c1ef4f7ed0a8004cad750a9ce61869bd768
* Remove unnecessary conditionalAaron Patterson2020-10-281-8/+6
| | | | | | | | As of 0b81a484f3453082d28a48968a063fd907daa5b5, `ROBJECT_IVPTR` will always return a value, so we don't need to test whether or not we got one. T_OBJECTs always come to life as embedded objects, so they will return an ivptr, and when they become "unembedded" they will have an ivptr at that point too
* If an object isn't embedded it will have an ivptrAaron Patterson2020-10-281-3/+2
| | | | | We don't need to check the existence if an ivptr because non-embedded objects will always have one
* Use a lock level for a less granular lock.Aaron Patterson2020-10-221-0/+2
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | We are seeing an error where code that is generated with MJIT contains references to objects that have been moved. I believe this is due to a race condition in the compaction function. `gc_compact` has two steps: 1. Run a full GC to pin objects 2. Compact / update references Step one is executed with `garbage_collect`. `garbage_collect` calls `gc_enter` / `gc_exit`, these functions acquire a JIT lock and release a JIT lock. So a lock is held for the duration of step 1. Step two is executed by `gc_compact_after_gc`. It also holds a JIT lock. I believe the problem is that the JIT is free to execute between step 1 and step 2. It copies call cache values, but doesn't pin them when it copies them. So the compactor thinks it's OK to move the call cache even though it is not safe. We need to hold a lock for the duration of `garbage_collect` *and* `gc_compact_after_gc`. This patch introduces a lock level which increments and decrements. The compaction function can increment and decrement the lock level and prevent MJIT from executing during both steps.
* Ractor-safe rb_objspace_reachable_objects_fromKoichi Sasada2020-10-211-76/+82
| | | | | | | | | | rb_objspace_reachable_objects_from(obj) is used to traverse all reachable objects from obj. This function modify objspace but it is not ractor-safe (thread-safe). This patch fix the problem. Strategy: (1) call GC mark process during_gc (2) call Ractor-local custom mark func when !during_gc
* ObjectSpace.each_object with RactorsKoichi Sasada2020-10-201-2/+4
| | | | | | | Unshareable objects should not be touched from multiple ractors so ObjectSpace.each_object should be restricted. On multi-ractor mode, ObjectSpace.each_object only iterates shareable objects. [Feature #17270]
* sync RClass::ext::iv_index_tblKoichi Sasada2020-10-171-1/+29
| | | | | | | | | | | | iv_index_tbl manages instance variable indexes (ID -> index). This data structure should be synchronized with other ractors so introduce some VM locks. This patch also introduced atomic ivar cache used by set/getinlinecache instructions. To make updating ivar cache (IVC), we changed iv_index_tbl data structure to manage (ID -> entry) and an entry points serial and index. IVC points to this entry so that cache update becomes atomically.
* add NULL check.Koichi Sasada2020-10-031-1/+3
| | | | DATA_PTR(ractor) can be NULL just after creation.
* Fix ASAN and don't check SPECIAL_CONST_PAaron Patterson2020-09-281-24/+21
| | | | | | | Heap allocated objects are never special constants. Since we're walking the heap, we know none of these objects can be special. Also, adding the object to the freelist will poison the object, so we can't check that the type is T_NONE after poison.
* Fix ASAN errors when updating call cacheAaron Patterson2020-09-281-0/+8
| | | | | Invalidating call cache walks the heap, so we need to take care to un-poison objects when examining them
* sync rb_gc_register_mark_object()Koichi Sasada2020-09-241-7/+11
| | | | | rb_vm_t::mark_object_ary is global resource so we need to synchronize to access it.
* Add a comment about why we're checking the finalizer tableAaron Patterson2020-09-221-0/+5
|
* Revert "Pin values in the finalizer table"Aaron Patterson2020-09-221-0/+6
| | | | | | If an object has a finalizer flag set on it, prevent it from moving. This partially reverts commit 1a9dd31910699c7cd69f2a84c94af20eacd5875c.
* Update heap_pages_himem after freeing pagesPeter Zhu2020-09-201-0/+6
|
* strip trailing spaces [ci skip]Nobuyoshi Nakada2020-09-191-3/+3
|
* Pin values in the finalizer tableAaron Patterson2020-09-181-7/+9
| | | | | | | | | | When finalizers run (in `rb_objspace_call_finalizer`) the table is copied to a linked list that is not managed by the GC. If compaction runs, the references in the linked list can go bad. Finalizer table shouldn't be used frequently, so lets pin references in the table so that the linked list in `rb_objspace_call_finalizer` is safe.
* rb_obj_info() shows more info for T_SYMBOLKoichi Sasada2020-09-181-0/+11
|
* Warn on a finalizer that captures the object to be finalizedChris Seaton2020-09-161-3/+61
| | | | | Also improve specs and documentation for finalizers and more clearly recommend a safe code pattern to use them.
* pointers on the stack need to be pinnedAaron Patterson2020-09-151-1/+1
|
* Fix incorrect initialization of `rb_io_t::self`.Samuel Williams2020-09-151-0/+2
|
* Fixed heap-use-after-free on racterNobuyoshi Nakada2020-09-041-0/+3
|
* Avoid potential for rb_raise() while crashingAlan Wu2020-09-031-1/+10
| | | | | | rb_obj_raw_info is called while printing out crash messages and sometimes called during garbage collection. Calling rb_raise() in these situations is undesirable because it can start executing ensure blocks.
* Introduce Ractor mechanism for parallel executionKoichi Sasada2020-09-031-124/+223
| | | | | | | | | | | | | | | | This commit introduces Ractor mechanism to run Ruby program in parallel. See doc/ractor.md for more details about Ractor. See ticket [Feature #17100] to see the implementation details and discussions. [Feature #17100] This commit does not complete the implementation. You can find many bugs on using Ractor. Also the specification will be changed so that this feature is experimental. You will see a warning when you make the first Ractor with `Ractor.new`. I hope this feature can help programmers from thread-safety issues.
* Initialize new T_OBJECT as ROBJECT_EMBEDJohn Hawthorn2020-09-021-0/+7
| | | | | | | | | | | | | | | | | | | | | | Previously, when an object is first initialized, ROBJECT_EMBED isn't set. This means that for brand new objects, ROBJECT_NUMIV(obj) is 0 and ROBJECT_IV_INDEX_TBL(obj) is NULL. Previously, this combination meant that the inline cache would never be initialized when setting an ivar on an object for the first time since iv_index_tbl was NULL, and if it were it would never be used because ROBJECT_NUMIV was 0. Both cases always fell through to the generic rb_ivar_set which would then set the ROBJECT_EMBED flag and initialize the ivar array. This commit changes rb_class_allocate_instance to set the ROBJECT_EMBED flag on the object initially and to initialize all members of the embedded array to Qundef. This allows the inline cache to be set correctly on first use and to be used on future uses. This moves rb_class_allocate_instance to gc.c, so that it has access to newobj_of. This seems appropriate given that there are other allocating methods in this file (ex. rb_data_object_wrap, rb_imemo_new).
* Fix error message for wb unprotected objects countPeter Zhu2020-09-011-1/+1
| | | | This error is about wb unprotected objects, not old objects.
* Fixed argument typesNobuyoshi Nakada2020-09-021-4/+4
|
* Format with proper conversion specifiers instead of castsNobuyoshi Nakada2020-09-021-54/+74
|