Age | Commit message (Collapse) | Author |
|
This is a continuation of 0130e17a410d60a10e7041ce98748b8de6946971. We
need to always use the read barrier
|
|
Some objects can survive the GC before compaction, but get collected in
the second compaction. This means we could have objects reference
T_MOVED during "free" in the second, compacting GC. If that is the
case, we need to invalidate those "moved" addresses. Invalidation is
done via read barrier, so we need to make sure the read barrier is
active even during `GC.compact`.
This also means we don't actually need to do one GC before compaction,
we can just do the compaction and GC in one step.
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/4067
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/4044
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/4030
|
|
|
|
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
|
|
`mjit_valid_class_serial_p` has no longer been used since b9007b6c548.
|
|
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/4003
|
|
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().
|
|
|
|
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
|
|
|
|
|
|
gc_finalize_deferred() runs finalizers and it accesses objspace,
so it need to sync.
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/3921
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/3921
|
|
There is a case to call this function without VM lock acquiring.
|
|
To debug this issue:
https://rubyci.org/logs/rubyci.s3.amazonaws.com/solaris10-gcc/ruby-master/log/20201217T220004Z.fail.html.gz
|
|
gc_verify_internal_consistency() accesses all slots (objects) so
all ractors should stop before starting this function.
|
|
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
|
|
mark needs barrier (stop other ractors), but other GC events don't need
barriers (maybe...).
Notes:
Merged: https://github.com/ruby/ruby/pull/3923
|
|
Current synchronization is too much on write barriers.
Notes:
Merged: https://github.com/ruby/ruby/pull/3918
|
|
|
|
Enabled this flag, maybe accidentally.
|
|
|
|
It seems introduce critical problems. Now I could not find
out the issue.
http://ci.rvm.jp/results/trunk-test@ruby-sky1/3286048
|
|
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
|
|
|
|
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
|
|
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
|
|
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
|
|
Checking code (RGENGC_CHECK_MODE > 0) need a VM lock because it
refers objspace.
|
|
Some data should be accessed in parallel so they should be protected
by the lock.
|
|
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.
|
|
This assertion is not considerred on multi-ractor mdoe.
|
|
NEWOBJ with current ec.
Notes:
Merged: https://github.com/ruby/ruby/pull/3842
|
|
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
|
|
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.
|
|
Notes:
Merged: https://github.com/ruby/ruby/pull/3843
|
|
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
|
|
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
|
|
|
|
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
|
|
read_barrier_handler() can cause SIGSEGV/BUS so it should show
the errors.
|
|
Unfortunately we couldn't see a C backtrace with the previous commit
http://ci.rvm.jp/results/trunk-random2@phosphorus-docker/3272697.
|
|
when GC.compact's SEGV handler is installed
|
|
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]
|
|
This reverts commit 63ad55cd882e4010fe313d271af006a430b5ffa8.
Revert "Disable read barrier on explicit compaction request"
This reverts commit 490b57783d80f0c5f7882c66d9fb6aa02713c9a5.
|