Commit graph

1564 commits

Author SHA1 Message Date
Aaron Patterson
2ca537ba4b
Fixing function name
This function is used for marking / pinning vm stack values, so it
should have "vm" in the function name to be more clear.
2019-05-14 08:18:43 -07:00
Aaron Patterson
a1ecf07dff
turn T_MOVED in to a linked list 2019-05-13 14:00:36 -07:00
Aaron Patterson
66a7c92938
Don't run the compactor if GC is disabled
GC is required for pinning / marking objects.  If the compactor runs
without pinning everything, then it will blow up, so just return early
if the GC is disabled.
2019-05-13 12:59:30 -07:00
Kazuhiro NISHIYAMA
b42303b151
Fix typos 2019-05-13 21:14:52 +09:00
Aaron Patterson
dc405eb737
Pin finalizer table
Objects in the finalizer table stay pinned for now.  In some cases, the
key could move which would cause a miss when removing the object from
the table (leading to a T_MOVED reference staying in the table).
2019-05-08 15:56:07 -07:00
git
8b12db6e19 * expand tabs. 2019-05-09 07:26:29 +09:00
Aaron Patterson
c53f87943e
Calling obj_info during sweep is unsafe
`obj_info` will look at references of objects in some cases (for example
it will try to access path information on ISeq objects).  But during the
sweep phase, if the referenced object is collected before `obj_info` is
called, then it could be a bad ref and a segv will occur.

For example:

A -> B

Sweep phase:

1. obj_info(B)
2. Sweep and free B
3. obj_info(A); A tries to read B
4. SEGV

This commit simply removes the call to `obj_info` during the sweep
phase.
2019-05-08 15:19:59 -07:00
Lourens Naudé
a47f598d77
Reduce ONIG_NREGION from 10 to 4: power of 2 and testing revealed most pattern matches are less than or equal to 4 results
Closes: https://github.com/ruby/ruby/pull/2135
2019-05-07 21:58:55 +09:00
Koichi Sasada
4dc5d3c5dd add new debug_counters about is_pointer_to_heap().
is_pointer_to_heap() is used for conservative marking. To analyze
this function's behavior, introduce some debug_counters.
2019-05-07 14:10:43 +09:00
Urabe, Shyouhei
f95f07dad3 avoid passing NULL to memset
`GC::Profiler.enable; GC::Profiler.clear` tries to clear
objspace->profile.records but it has never been allocated before.
Thus the MEMCPY took NULL argument before this changeset.

The objspace->profile.records is allocated appropriately elsewhere.
Why not juts free it if any?  That should work.
2019-04-29 21:52:44 +09:00
Urabe, Shyouhei
3ba485c0bf zero-fill before GC mark
Depending on architectures, setjmp might not fully fill a jmp_buf.
On such machines the union can contain wobbly bits. They are then
scanned during mark_locations_array().  This is bad.
2019-04-26 15:59:40 +09:00
Urabe, Shyouhei
1f4204a762 disable assertion when MSAN is active
These assertions check if a newly allocated object (which is marked
as an uninitialized memory region in MSAN) is in fact a T_NONE.

Thus they intentionally read uninitialized memory regions, which do
not interface well with MSAN.  Just disalbe them.
2019-04-26 15:59:40 +09:00
Nobuyoshi Nakada
1613917ae6
Defer setting gc_stress instead of setting dont_gc
[Bug #15784]
2019-04-24 17:34:21 +09:00
Nobuyoshi Nakada
f1a52d96a5
Defer setting gc_stress until inits done
[Bug #15784]
2019-04-24 13:02:01 +09:00
Aaron Patterson
2e1ac22089
Oops, bad merge 🙇‍♂️ 2019-04-22 20:39:03 -07:00
Aaron Patterson
ea520ca927
Prevent rb_define_(class|module) classes from moving
Before this commit, classes and modules would be registered with the
VM's `defined_module_hash`.  The key was the ID of the class, but that
meant that it was possible for hash collisions to occur.  The compactor
doesn't allow classes in the `defined_module_hash` to move, but if there
is a conflict, then it's possible a class would be removed from the hash
and not get pined.

This commit changes the key / value of the hash just to be the class
itself, thus preventing movement.
2019-04-22 20:08:01 -07:00
kazu
dad3047659 Remove redundant cast
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67657 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-21 02:51:03 +00:00
tenderlove
78d3e4396d Make sure the has_remembered_objects flag is correctly set
Remembered objects can move between pages, so we need to make sure the
flags on the page are set correctly.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67640 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-20 06:08:54 +00:00
tenderlove
109633b127 Always pin stack zombie and moved slots
We should always pin stack zombies and moved

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67635 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-20 05:11:37 +00:00
tenderlove
91793b8967 Add GC.compact again.
🙏

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67620 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-20 01:19:47 +00:00
tenderlove
390ea54420 Only mark the superclass if there is one
Some classes don't have a superclass, so we should check to see if it's
there before marking.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67610 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-19 06:21:55 +00:00
svn
828353334a * expand tabs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67599 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-17 09:41:55 +00:00
tenderlove
744e5df715 Reverting compaction for now
For some reason symbols (or classes) are being overridden in trunk

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67598 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-17 09:41:41 +00:00
svn
b077654a2c * expand tabs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67585 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-17 06:16:39 +00:00
tenderlove
281a22a398 Super should be marked regardless of whether or not ext exists
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67584 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-17 06:16:35 +00:00
tenderlove
7bd58a4e6d update super even if there is no ext
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67583 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-17 06:13:11 +00:00
tenderlove
62c07674e0 make verification more strict
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67581 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-17 05:19:05 +00:00
svn
aee9f24973 * expand tabs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67577 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-17 03:17:42 +00:00
tenderlove
3c55b643ae Adding GC.compact and compacting GC support.
This commit adds the new method `GC.compact` and compacting GC support.
Please see this issue for caveats:

  https://bugs.ruby-lang.org/issues/15626

[Feature #15626]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67576 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-17 03:17:25 +00:00
nobu
b9e52ef8b6 Adjusted styles
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67504 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-10 12:43:33 +00:00
svn
481481b81a * expand tabs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67500 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-10 09:16:00 +00:00
kazu
25c1fd3b90 Reverting all commits from r67479 to r67496 because of CI failures
Because hard to specify commits related to r67479 only.
So please commit again.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67499 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-10 09:15:21 +00:00
nobu
5ae753dfa3 Adjusted styles
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67493 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-10 06:44:41 +00:00
tenderlove
e900bba945 Pin weakmap references
Weak map references can't move because the st_table needs their address
as a key.  But, we also need to remove T_NONE from the map so they
aren't reused.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67485 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-09 23:03:40 +00:00
tenderlove
3ef4db15e9 Adding GC.compact and compacting GC support.
This commit adds the new method `GC.compact` and compacting GC support.
Please see this issue for caveats:

  https://bugs.ruby-lang.org/issues/15626

[Feature #15626]

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67479 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-09 20:32:04 +00:00
nobu
b7c4e6d11c gc.c: missing break
* gc.c (obj_memsize_of): T_RATIONAL and T_COMPLEX cannot be an
  imemo.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67464 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-07 11:14:06 +00:00
tenderlove
dd2479bcea Fix more ASAN errors
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67421 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-02 21:59:04 +00:00
tenderlove
be0f09a998 Extract type to sym as a new function
I will use this from another function in compaction

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67420 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-02 21:58:59 +00:00
tenderlove
e377eb0e75 Fix ASAN error
This code was trying to access memory before unpoisoning it.

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67417 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-02 19:13:12 +00:00
tenderlove
4283fb42bc Poison / verify the freelist
This commit just adds poisoning around the freelist to help debugging.
Also verify that the freelist only contains T_NONE objects when checking
the heap integrity

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67416 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-02 19:13:07 +00:00
tenderlove
1ad6dde9da Fix ASAN errors when walking the heap
verify_internal_consistency_i and gc_verify_heap_page would walk the
heap, reading data from each slot, but would not unpoison the object
before reading.  This commit unpoisons the slot before reading so that
we won't get ASAN errors

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67408 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-04-01 23:55:02 +00:00
nobu
56557ec28a [DOC] fix markups [ci skip]
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67337 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-22 11:04:59 +00:00
nobu
d577019746 Early return in gc_mark_children
for types Float, Bignum and Symbol as they do not have references
and singleton classes.

[Fix GH-2091]

From: Lourens Naudé <lourens@bearmetal.eu>

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67195 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-03-09 00:00:26 +00:00
naruse
e5347b1c90 Revert "Assert that union sizes match"
This reverts commit r67078.
It breaks armv7l-linux-eabihf and sparc-solaris2.11.
20190215T061708Z.diff.html.gz
20190215T072546Z.diff.html.gz

git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67080 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-02-16 15:51:01 +00:00
nobu
387e8967a3 Assert that union sizes match
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67078 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-02-15 05:51:39 +00:00
ko1
91cb5c1a70 fix empty Hash memsize.
* gc.c (obj_memsize_of): ar_table ptr can be NULL (size == 0).


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@67054 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2019-02-12 03:45:15 +00:00
ko1
8ee0a8e91a hide ar_table internals from internal.h.
* internal.h: move ar_table def to hash.c because other files
  don't need to know implementation of ar_table.

* hash.c (rb_hash_ar_table_size): added because gc.c needs to know
  the size_of(ar_table).


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66638 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-29 16:29:44 +00:00
ko1
ff8a775c57 move checking code.
* gc.c (gc_mark_ptr): this check was introduced by accidentaly
  (this is why message is "...", crazy simple) for debugging.
  However, this check is useful because if there is T_NONE
  object here, we can't know which object points to it.
  For debugging reason, I remain this checking code and
  set reasonable error message.


git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66514 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-23 15:02:17 +00:00
svn
84b49707d6 * expand tabs.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66435 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-18 08:11:57 +00:00
ko1
542e63b953 rb_raw_obj_info() support T_MODULE and T_ICLASS.
git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66434 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
2018-12-18 08:11:52 +00:00