aboutsummaryrefslogtreecommitdiffstats
path: root/gc.c
Commit message (Collapse)AuthorAgeFilesLines
* 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. ```
* GC measurement featureKoichi Sasada2021-11-191-37/+60
| | | | | | | * `GC.measure_total_time = true` enables total time measurement (default: true) * `GC.measure_total_time` returns current flag. * `GC.total_time` returns measured total time in nano seconds. * `GC.stat(:time)` (and Hash) returns measured total time in milli seconds.
* support `GC.stat(:time)` take 2Koichi Sasada2021-11-191-0/+51
|
* `Primitive.mandatory_only?` for fast pathKoichi Sasada2021-11-151-5/+9
| | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | | Compare with the C methods, A built-in methods written in Ruby is slower if only mandatory parameters are given because it needs to check the argumens and fill default values for optional and keyword parameters (C methods can check the number of parameters with `argc`, so there are no overhead). Passing mandatory arguments are common (optional arguments are exceptional, in many cases) so it is important to provide the fast path for such common cases. `Primitive.mandatory_only?` is a special builtin function used with `if` expression like that: ```ruby def self.at(time, subsec = false, unit = :microsecond, in: nil) if Primitive.mandatory_only? Primitive.time_s_at1(time) else Primitive.time_s_at(time, subsec, unit, Primitive.arg!(:in)) end end ``` and it makes two ISeq, ``` def self.at(time, subsec = false, unit = :microsecond, in: nil) Primitive.time_s_at(time, subsec, unit, Primitive.arg!(:in)) end def self.at(time) Primitive.time_s_at1(time) end ``` and (2) is pointed by (1). Note that `Primitive.mandatory_only?` should be used only in a condition of an `if` statement and the `if` statement should be equal to the methdo body (you can not put any expression before and after the `if` statement). A method entry with `mandatory_only?` (`Time.at` on the above case) is marked as `iseq_overload`. When the method will be dispatch only with mandatory arguments (`Time.at(0)` for example), make another method entry with ISeq (2) as mandatory only method entry and it will be cached in an inline method cache. The idea is similar discussed in https://bugs.ruby-lang.org/issues/16254 but it only checks mandatory parameters or more, because many cases only mandatory parameters are given. If we find other cases (optional or keyword parameters are used frequently and it hurts performance), we can extend the feature.
* Remove RCLASS(obj)->ptr when RVARGC is enabledMatt Valentine-House2021-11-111-4/+4
| | | | | | | With RVARGC we always store the rb_classext_t in the same slot as the RClass struct that refers to it. So we don't need to store the pointer or access through the pointer anymore and can switch the RCLASS_EXT macro to use an offset
* fix a memory leak introduced in 8bbd319Matt Valentine-House2021-11-111-2/+6
| | | | | | This commit fixes a memory leak introduced in an early part of the variable width allocation project that would prevent the rb_classext_t struct from being free'd when the class is swept.
* [Feature #18290] Deprecate rb_gc_force_recycle and remove ↵Peter Zhu2021-11-081-72/+1
| | | | | | | | invalidate_mark_stack_chunk This commit deprecates rb_gc_force_recycle and coverts it to a no-op function. Also removes invalidate_mark_stack_chunk since only rb_gc_force_recycle uses it.
* make obj_free return true when it frees an objectMatt Valentine-House2021-10-291-9/+8
| | | | | Previously obj_free returned true when it could not free a slot because of a finalizer, and false when it successfully frees a slot.
* Prefer size pool heap macros over direct accessMatt Valentine-House2021-10-291-15/+15
|
* Fix a warningKazuhiro NISHIYAMA2021-10-281-1/+1
| | | | | | | | | | | ``` ../gc.c:2342:45: warning: comparison of integers of different signs: 'short' and 'size_t' (aka 'unsigned long') [-Wsign-compare] GC_ASSERT(size_pools[pool_id].slot_size == slot_size); ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~^~~~~~~~~~~~~ ``` Add cast to short, because `GC_ASSERT`s in `size_pool_for_size` already use cast to short.
* Fix a warningKazuhiro NISHIYAMA2021-10-281-1/+1
| | | | | | | | ``` ../gc.c:2342:25: warning: array subscript is of type 'char' [-Wchar-subscripts] GC_ASSERT(size_pools[pool_id].slot_size == slot_size); ^~~~~~~~ ```
* Align `RFloat` at VALUE boundaryNobuyoshi Nakada2021-10-271-6/+5
|
* [Feature #18239] Implement VWA for stringsPeter Zhu2021-10-251-56/+89
| | | | | This commit adds support for embedded strings with variable capacity and uses Variable Width Allocation to allocate strings.
* [Feature #18239] Refactor RVARGC alloc functionsPeter Zhu2021-10-251-1/+3
| | | | | The allocation functions no longer assume that one RVALUE needs to be allocated.
* Suppress false warning for freed pointerNobuyoshi Nakada2021-10-241-13/+24
|
* 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.