Commit graph

1633 commits

Author SHA1 Message Date
Koichi Sasada
02973d3ba8 pin maybe pointers.
Objects pointed by "maybe" pointers because of conservative marking
should be pinned down.
2019-05-23 11:42:15 +09:00
Koichi Sasada
136ae55892 Do not kick finalizers on rb_gc().
rb_gc() kicks gc_finalize_deferred(), which invokes finalizers.
This means that any Ruby program can be run this point and
it may be thread switching points and so on.

However, it is difficult to think it invokes any Ruby programs.
For example, `GC.compact` use `rb_gc()` to implement it, howver,
any Ruby program must not be run on this timing.

For this reason (it is difficult to image it run any Ruby program),
I removed `gc_finalize_deferred()` line in rb_gc().

This patch solves GC.compact issue.
[Bug #15809] and re-enable GC.compact test.
2019-05-23 11:26:33 +09:00
git
2fb69b3296 * expand tabs. 2019-05-22 16:54:47 +09:00
Nobuyoshi Nakada
32dd1a798a
gc.c: revert b00f280d4b "Eagerly name modules and classes"
* gc.c (rb_raw_obj_info): new string objects cannot allocate to
  create new class path name during GC.
2019-05-22 16:52:19 +09:00
Alan Wu
b00f280d4b
Eagerly name modules and classes
* variable.c: make the hidden ivars `classpath` and `tmp_classpath` the source
  of truth for module and constant names. Assign to them when modules are bind
  to constants.

* variable.c: remove references to module name cache, as what used to be the cache
  is now the source of truth. Remove rb_class_path_no_cache().

* variable.c: remove the hidden ivar `classid`. This existed for the purposes of
  module name search, which is now replaced. Also, remove the associated
  rb_name_class().

* class.c: use rb_set_class_path_string to set the name of Object during boot.
  Must use a fstring as this runs before rb_cString is initialized and
  creating a normal string leads to a VALUE without a class.

* spec/ruby/core/module/name_spec.rb: add a few specs to specify what happens
  to Module#name across multiple operations. These specs pass without other
  code changes in this commit.

[Feature #15765]
2019-05-22 15:46:47 +09:00
Koichi Sasada
7ff4abe650 unify normal and verify ver. 2019-05-21 07:45:21 +01:00
git
583ecd5fc5 * expand tabs. 2019-05-20 22:08:27 +09:00
Nobuyoshi Nakada
e83f10b368
Get rid of undefined behavior that source and destination buffers overlap 2019-05-20 21:58:06 +09:00
Aaron Patterson
154a67f140
Rename rb_gc_new_location to rb_gc_location
The function will return new or existing locations depending on whether
or not the object actually moved, so give it a more appropriate name.
2019-05-18 12:24:28 +03:00
Kazuhiro NISHIYAMA
bbb84a16fa
Add fall through comment for Coverity Scan 2019-05-18 14:20:33 +09:00
Aaron Patterson
ea3e7e2685
Prevent Dynamic -> Static symbols from moving
If a dynamic symbol has been converted to a static symbol, it gets added
to the global ID list and should no longer move.  C extensions can pass
symbols to rb_sym2id and those symbols should no longer be movable.
When the symbol is passed to rb_sym2id, the `id` member is set, so we
can use its existence to prevent movement.
2019-05-17 17:08:31 +03:00
Koichi Sasada
88449100bc don't need to sweep rest.
`transient_heap_evacuate()` disables GC using `rb_gc_disable()`
to prohibt GC invocation because of new allocation for evacuated
memory. However, `rb_gc_disable()` sweep all rest of unswept pages.
We don't need to cancel lazy sweep so this patch introduce
`rb_gc_disable_no_rest()` which doesn't cancel lazy sweep.
2019-05-16 17:18:50 +09:00
Nobuyoshi Nakada
7069f64c41
Prefix global_symbols with ruby_ 2019-05-16 15:43:16 +09:00
Nobuyoshi Nakada
973431c059
Make internal functions static 2019-05-16 15:41:33 +09:00
Takashi Kokubun
82332c7d8b
Rename mjit_gc_finish_hook to mjit_gc_exit_hook
because @ko1 said "gc_finish" is confusing like a finish of entire GC
process
2019-05-15 23:14:07 -07:00
Nobuyoshi Nakada
e970ab3339
Suppress unused-but-set-variable warning 2019-05-15 23:17:18 +09:00
Aaron Patterson
3cf767ee35
unpin finalizers and update references 2019-05-15 10:56:15 +02:00
git
e8b929b9df * expand tabs. 2019-05-15 12:21:53 +09:00
Aaron Patterson
c70ceb5992
Add object packing strategies for compaction
This commit adds an alternative packing strategy for compaction.
Instead of packing towards "most pinned" pages, we can pack towards
"most empty" pages.  The idea is that we can double the heap size, then
pack all objects towards the empty side of the heap.  This will ensure
maximum chaos for testing / verification.
2019-05-14 20:21:03 -07:00
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