aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
Commit message (Collapse)AuthorAgeFilesLines
* Push compaction page alignment check downAaron Patterson2021-10-211-18/+18
| | | | | | | | | | | | It seems like `gc_verify_compaction_references` is not protected in case alignment is wrong. This commit pushes the alignment check down to `gc_start_internal` so that anyone trying to compact will check page alignment I think this method may be getting called on PowerPC and the alignment might be wrong. http://rubyci.s3.amazonaws.com/ppc64le/ruby-master/log/20211021T190006Z.fail.html.gz
* Partial revert of ceebc7fc98dAaron Patterson2021-10-201-1/+1
| | | | | | | I'm looking through the places where YJIT needs notifications. It looks like these changes to gc.c and vm_callinfo.h have become unnecessary since 84ab77ba592. This commit just makes the diff against upstream smaller, but otherwise shouldn't change any behavior.
* MicroJIT: generate less code for CFUNCsAlan Wu2021-10-201-1/+1
| | | | | | | | Added UJIT_CHECK_MODE. Set to 1 to double check method dispatch in generated code. It's surprising to me that we need to watch both cc and cme. There might be opportunities to simplify there.
* Print errno when mprotect failsAaron Patterson2021-10-201-2/+2
| | | | Trying to figure out the problem on s390x.
* Move rb_ractor_p definitionS.H2021-10-041-2/+0
|
* Using NIL_P macro instead of `== Qnil`S.H2021-10-031-4/+4
|
* Cast to void pointer to suppress -Wformat-pedantic in RUBY_DEBUG_LOGNobuyoshi Nakada2021-10-031-4/+4
|
* Introduce `RBIMPL_NONNULL_ARG` macroNobuyoshi Nakada2021-09-271-8/+1
| | | | | Runtime assertion for the argument declared as non-null. This macro does nothing if `RBIMPL_ATTR_NONNULL` is effective, otherwise asserts that the argument is non-null.
* Fix malloc_increase is not correctly calculatedPeter Zhu2021-09-201-3/+3
| | | | | | | | | | Commit 123eeb1c1a904923754ce65148dbef045b56e083 added incremental GC which moved resetting malloc_increase, oldmalloc_increase to before marking. However, during_minor_gc is not set until gc_marks_start. So the value will be from the last GC run, rather than the current one. Before the incremental GC commit, this code was in gc_before_sweep which ran before sweep (after marking) so the value during_minor_gc was correct.
* Fix total_freed_objects for invalidated pagesPeter Zhu2021-09-151-1/+2
| | | | | | When the object is moved back into the T_MOVED, the flags of the T_MOVED is not copied, so the FL_FROM_FREELIST flag is lost. This causes total_freed_objects to always be incremented.
* Don't overwrite free_slots count during sweepingPeter Zhu2021-09-151-1/+2
| | | | | gc_compact_finish may invalidate pages, which may move objects from this page to other pages, which updates the free_slots of this page.
* Update the free_slots count of the original pagePeter Zhu2021-09-151-20/+9
| | | | | | When invalidating a page during compaction, the free_slots count should be updated for the page of the object and not the page of the forwarding address (since the object gets moved back to the forwarding address).
* Using RB_BIGNUM_TYPE_P macroS-H-GAMELINKS2021-09-111-2/+2
|
* suppress GCC's -Wnonnull-compare卜部昌平2021-09-101-0/+7
| | | | | This particular NULL check must be a good thing to do both statically and dynamically.
* Replace RBOOL macroS-H-GAMELINKS2021-09-051-4/+4
|
* Remove heap_is_swept_object functionPeter Zhu2021-09-011-12/+1
| | | | | is_swept_object just calls heap_is_swept_object so remove heap_is_swept_object.
* Fix memory leak in Variable Width AllocationPeter Zhu2021-08-271-23/+27
| | | | | | Force recycled objects could create a freelist for the page. At the start of sweeping we should append to the freelist to avoid permanently losing the slots on the freelist.
* [Feature #18045] Implement size classes for GCPeter Zhu2021-08-251-329/+749
| | | | | | | | | This commits implements size classes in the GC for the Variable Width Allocation feature. Unless `USE_RVARGC` compile flag is set, only a single size class is created, maintaining current behaviour. See the redmine ticket for more details. Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
* [Feature #18045] Remove T_PAYLOADPeter Zhu2021-08-251-343/+2
| | | | | | | This commit removes T_PAYLOAD since the new VWA implementation no longer requires T_PAYLOAD types. Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
* Replace intptr_t with uintptr_t in gc.cPeter Zhu2021-08-231-21/+21
| | | | | Pointers may be large to the point where intptr_t would be negative. This is problematic when doing comparisons of pointers.
* Revert "[Feature #18045] Implement size classes for GC"Peter Zhu2021-08-231-754/+674
| | | | | | This reverts commits 48ff7a9f3e47bffb3e4d067a12ba9b936261caa0 and b2e2cf2dedd104acad8610721db5e4d341f135ef because it is causing crashes in SPARC solaris and i386 debian.
* [Feature #18045] Implement size classes for GCPeter Zhu2021-08-231-331/+752
| | | | | | | | | This commits implements size classes in the GC for the Variable Width Allocation feature. Unless `USE_RVARGC` compile flag is set, only a single size class is created, maintaining current behaviour. See the redmine ticket for more details. Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
* [Feature #18045] Remove T_PAYLOADPeter Zhu2021-08-231-343/+2
| | | | | | | This commit removes T_PAYLOAD since the new VWA implementation no longer requires T_PAYLOAD types. Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
* Turned the reminder comment to a compile-time messageNobuyoshi Nakada2021-08-201-1/+2
|
* Undefine the alloc function for T_DATA classesMike Dalessio2021-08-201-2/+13
| | | | | | | | | | | | | | which have not undefined or redefined it. When a `T_DATA` object is created whose class has not undefined or redefined the alloc function, the alloc function now gets undefined by Data_Wrap_Struct et al. Optionally, a future release may also warn that this being done. This should help developers of C extensions to meet the requirements explained in "doc/extension.rdoc". Without a check like this, there is no easy way for an author of a C extension to see where they have made a mistake.
* `SIZE_MAX` is not `size_t` on emscriptenNobuyoshi Nakada2021-08-161-3/+3
|
* Make during_compacting flag in GC one bitPeter Zhu2021-08-111-2/+2
| | | | | | | | Commit c32218de1ba094223420a4ea017707f48d0009c5 turned during_compacting flag to 2 bits to support the case when there is no write barrier. But commit 32b7dcfb56a417c1d1c354102351fc1825d653bf changed compaction to always enable the write barrier. This commit cleans up some of the leftover code.
* Make bit flags `reason` unsignedNobuyoshi Nakada2021-08-081-26/+26
|
* Suppress warnings when GC_ENABLE_INCREMENTAL_MARK == 0Nobuyoshi Nakada2021-08-081-8/+7
|
* Using RBOOL macroS.H2021-08-021-5/+5
|
* Do not check pending interrupts when running finalizersJeremy Evans2021-07-291-0/+4
| | | | | | | | | | | | | This fixes cases where exceptions raised using Thread#raise are swallowed by finalizers and not delivered to the running thread. This could cause issues with finalizers that rely on pending interrupts, but that case is expected to be rarer. Fixes [Bug #13876] Fixes [Bug #15507] Co-authored-by: Koichi Sasada <ko1@atdot.net>
* Suppress exception message in finalizer [Feature #17798]Nobuyoshi Nakada2021-07-231-1/+1
|
* Show exception in finalizer [Feature #17798]Nobuyoshi Nakada2021-07-231-1/+14
|
* Access rb_execution_context_t::errinfo directlyNobuyoshi Nakada2021-07-231-2/+2
|
* Use rb_equalNobuyoshi Nakada2021-07-231-1/+1
| | | | It can be optimized and handles Qnil properly.
* Finalizers no longer store the safe levelNobuyoshi Nakada2021-07-231-6/+6
|
* Don't recompute the heap pagePeter Zhu2021-07-221-1/+1
| | | | | We already page the page of the zombie calculated. Don't recalculate the page.
* Don't set flags in finalize_listPeter Zhu2021-07-221-1/+0
| | | | The call after it to `heap_page_add_freeobj` will set the flags.
* Change GC verification to walk all pagesPeter Zhu2021-07-211-6/+7
| | | | | `gc_verify_internal_consistency_` does not walk pages in the tomb heap so numbers were off. This commit changes it to walk all allocated pages.
* [Bug #18014] Add assertion to verify freelistPeter Zhu2021-07-151-0/+12
| | | | | | This commit adds an assertion has been added after `gc_page_sweep` to verify that the freelist length is equal to the number of free slots in the page.
* [Bug #18014] Fix memory leak in GC when using RactorsPeter Zhu2021-07-151-62/+54
| | | | | | | When a Ractor is removed, the freelist in the Ractor cache is not returned to the GC, leaving the freelist permanently lost. This commit recycles the freelist when the Ractor is destroyed, preventing a memory leak from occurring.
* [Bug #18014] Fix rb_gc_force_recycle unmark before sweepPeter Zhu2021-07-151-1/+1
| | | | | | | If we force recycle an object before the page is swept, we should clear it in the mark bitmap. If we don't clear it in the bitmap, then during sweeping we won't account for this free slot so the `free_slots` count of the page will be incorrect.
* Get rid of conflict in ccan/listNobuyoshi Nakada2021-07-101-0/+2
| | | | Undefine LIST_HEAD from BSD-origin sys/queue.h.
* gc.c: use each_stack_location for emscriptenYusuke Endoh2021-07-071-2/+2
| | | | follow up of e4e416380d4b1b36ca1cc2e1e1ed993c9be694bb
* Use stride passed into os_obj_of_iPeter Zhu2021-06-301-3/+2
|
* Fix crash on RGENGC_CHECK_MODE=4Peter Zhu2021-06-291-0/+2
| | | | | | | | When running btest there is a crash when compiled with RGENGC_CHECK_MODE=4. The crash happens because `during_gc` is not turned off before `gc_marks_check` is called, causing the marking to happen on the main mark stack instead of mark stack created in `objspace_allrefs`.
* Fix asan error when walking heap for T_PAYLOAD objectseileencodes2021-06-221-1/+3
| | | | | | Related to https://bugs.ruby-lang.org/issues/18001 Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
* Add a cache for class variableseileencodes2021-06-181-0/+36
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Redo of 34a2acdac788602c14bf05fb616215187badd504 and 931138b00696419945dc03e10f033b1f53cd50f3 which were reverted. GitHub PR #4340. This change implements a cache for class variables. Previously there was no cache for cvars. Cvar access is slow due to needing to travel all the way up th ancestor tree before returning the cvar value. The deeper the ancestor tree the slower cvar access will be. The benefits of the cache are more visible with a higher number of included modules due to the way Ruby looks up class variables. The benchmark here includes 26 modules and shows with the cache, this branch is 6.5x faster when accessing class variables. ``` compare-ruby: ruby 3.1.0dev (2021-03-15T06:22:34Z master 9e5105c) [x86_64-darwin19] built-ruby: ruby 3.1.0dev (2021-03-15T12:12:44Z add-cache-for-clas.. c6be009) [x86_64-darwin19] | |compare-ruby|built-ruby| |:--------|-----------:|---------:| |vm_cvar | 5.681M| 36.980M| | | -| 6.51x| ``` Benchmark.ips calling `ActiveRecord::Base.logger` from within a Rails application. ActiveRecord::Base.logger has 71 ancestors. The more ancestors a tree has, the more clear the speed increase. IE if Base had only one ancestor we'd see no improvement. This benchmark is run on a vanilla Rails application. Benchmark code: ```ruby require "benchmark/ips" require_relative "config/environment" Benchmark.ips do |x| x.report "logger" do ActiveRecord::Base.logger end end ``` Ruby 3.0 master / Rails 6.1: ``` Warming up -------------------------------------- logger 155.251k i/100ms Calculating ------------------------------------- ``` Ruby 3.0 with cvar cache / Rails 6.1: ``` Warming up -------------------------------------- logger 1.546M i/100ms Calculating ------------------------------------- logger 14.857M (± 4.8%) i/s - 74.198M in 5.006202s ``` Lastly we ran a benchmark to demonstate the difference between master and our cache when the number of modules increases. This benchmark measures 1 ancestor, 30 ancestors, and 100 ancestors. Ruby 3.0 master: ``` Warming up -------------------------------------- 1 module 1.231M i/100ms 30 modules 432.020k i/100ms 100 modules 145.399k i/100ms Calculating ------------------------------------- 1 module 12.210M (± 2.1%) i/s - 61.553M in 5.043400s 30 modules 4.354M (± 2.7%) i/s - 22.033M in 5.063839s 100 modules 1.434M (± 2.9%) i/s - 7.270M in 5.072531s Comparison: 1 module: 12209958.3 i/s 30 modules: 4354217.8 i/s - 2.80x (± 0.00) slower 100 modules: 1434447.3 i/s - 8.51x (± 0.00) slower ``` Ruby 3.0 with cvar cache: ``` Warming up -------------------------------------- 1 module 1.641M i/100ms 30 modules 1.655M i/100ms 100 modules 1.620M i/100ms Calculating ------------------------------------- 1 module 16.279M (± 3.8%) i/s - 82.038M in 5.046923s 30 modules 15.891M (± 3.9%) i/s - 79.459M in 5.007958s 100 modules 16.087M (± 3.6%) i/s - 81.005M in 5.041931s Comparison: 1 module: 16279458.0 i/s 100 modules: 16087484.6 i/s - same-ish: difference falls within error 30 modules: 15891406.2 i/s - same-ish: difference falls within error ``` Co-authored-by: Aaron Patterson <tenderlove@ruby-lang.org>
* Refactor heap_set_incrementPeter Zhu2021-06-171-17/+7
| | | | | | | heap_set_increment essentially only calls heap_allocatable_pages_set. They only differ in behaviour when `additional_pages == 0`. However, this is only possible because heap_extend_pages may return 0. This commit also changes heap_extend_pages to always return at least 1.
* Adjust styles [ci skip]Nobuyoshi Nakada2021-06-171-11/+13
| | | | | | | | | * --braces-after-func-def-line * --dont-cuddle-else * --procnames-start-lines * --space-after-for * --space-after-if * --space-after-while