Commit graph

51 commits

Author SHA1 Message Date
John Hawthorn
f483befd90 Add shape_id to RBasic under 32 bit
This makes `RBobject` `4B` larger on 32 bit systems
but simplifies the implementation a lot.

[Feature #21353]

Co-authored-by: Jean Boussier <byroot@ruby-lang.org>
2025-05-26 10:31:54 +02:00
Peter Zhu
3487117e55 [ruby/mmtk] Fix object ID in rb_gc_impl_define_finalizer
The 0th element of the finalizer table array should be the object ID.

75e4a82652
2025-05-21 14:35:36 +00:00
Peter Zhu
27b0638386 [ruby/mmtk] Fix object ID for finalizers
We should get the object ID for finalizers in rb_gc_impl_define_finalizer
instead of when we create the finalizer job in make_final_job because
when we are in multi-Ractor mode, object ID needs to walk the references
which allocates an identity hash table. We cannot allocate in make_final_job
because it is in a MMTk worker thread.

922f22a690
2025-05-21 02:30:33 +00:00
Jean Boussier
ec8900e3eb rb_gc_impl_copy_finalizer: generate a new object id
Fix a regression introduced by: https://github.com/ruby/ruby/pull/13155
2025-05-16 20:16:52 +02:00
Jean Boussier
a294427017 Add missing lock to rb_gc_impl_copy_finalizer 2025-05-16 20:16:52 +02:00
Jean Boussier
ed632cd0ba Add missing lock in rb_gc_impl_undefine_finalizer
The table is global so accesses must be synchronized.
2025-05-15 13:32:08 +02:00
Alan Wu
92b218fbc3 YJIT: ZJIT: Allow both JITs in the same build
This commit allows building YJIT and ZJIT simultaneously, a "combo
build". Previously, `./configure --enable-yjit --enable-zjit` failed. At
runtime, though, only one of the two can be enabled at a time.

Add a root Cargo workspace that contains both the yjit and zjit crate.
The common Rust build integration mechanisms are factored out into
defs/jit.mk.

Combo YJIT+ZJIT dev builds are supported; if either JIT uses
`--enable-*=dev`, both of them are built in dev mode.

The combo build requires Cargo, but building one JIT at a time with only
rustc in release build remains supported.
2025-05-15 00:39:03 +09:00
Jean Boussier
f48e45d1e9 Move object_id in object fields.
And get rid of the `obj_to_id_tbl`

It's no longer needed, the `object_id` is now stored inline
in the object alongside instance variables.

We still need the inverse table in case `_id2ref` is invoked, but
we lazily build it by walking the heap if that happens.

The `object_id` concern is also no longer a GC implementation
concern, but a generic implementation.

Co-Authored-By: Matt Valentine-House <matt@eightbitraptor.com>
2025-05-08 07:58:05 +02:00
Jean Boussier
0ea210d1ea Rename ivptr -> fields, next_iv_index -> next_field_index
Ivars will longer be the only thing stored inline
via shapes, so keeping the `iv_index` and `ivptr` names
would be confusing.

Instance variables won't be the only thing stored inline
via shapes, so keeping the `ivptr` name would be confusing.

`field` encompass anything that can be stored in a VALUE array.

Similarly, `gen_ivtbl` becomes `gen_fields_tbl`.
2025-05-08 07:58:05 +02:00
Jean Boussier
6d0dd7d863 rb_gc_impl_define_finalizer: unlock on early return 2025-04-23 07:04:41 +02:00
Jean Boussier
7c30bd50df Add missing lock in rb_gc_impl_define_finalizer
`objspace->finalizer_table` must be synchronized,
otherwise concurrent insertion from multiple ractors
will cause a crash.

Repro:

```ruby
ractors = 5.times.map do |i|
  Ractor.new do
    100_000.times.map do
      o = Object.new
      ObjectSpace.define_finalizer(o, ->(id) {})
      o
    end
  end
end

ractors.each(&:take)
```
2025-04-22 23:23:35 +02:00
dependabot[bot]
f6fddbd337 Bump crossbeam-channel from 0.5.13 to 0.5.15 in /gc/mmtk
Bumps [crossbeam-channel](https://github.com/crossbeam-rs/crossbeam) from 0.5.13 to 0.5.15.
- [Release notes](https://github.com/crossbeam-rs/crossbeam/releases)
- [Changelog](https://github.com/crossbeam-rs/crossbeam/blob/master/CHANGELOG.md)
- [Commits](https://github.com/crossbeam-rs/crossbeam/compare/crossbeam-channel-0.5.13...crossbeam-channel-0.5.15)

---
updated-dependencies:
- dependency-name: crossbeam-channel
  dependency-version: 0.5.15
  dependency-type: indirect
...

Signed-off-by: dependabot[bot] <support@github.com>
2025-04-15 17:14:26 +09:00
Jean Boussier
0606046c1a Lazily create objspace->id_to_obj_tbl
This inverse table is only useful if `ObjectSpace._id2ref` is used,
which is extremely rare. The only notable exception is the `drb` gem
and even then it has an option not to rely on `_id2ref`.

So if we assume this table will never be looked up, we can just
not maintain it, and if it turns out `_id2ref` is called, we
can lock the VM and re-build it.

```
compare-ruby: ruby 3.5.0dev (2025-04-10T09:44:40Z master 684cfa42d7) +YJIT +PRISM [arm64-darwin24]
built-ruby: ruby 3.5.0dev (2025-04-10T10:13:43Z lazy-id-to-obj d3aa9626cc) +YJIT +PRISM [arm64-darwin24]
warming up..

|           |compare-ruby|built-ruby|
|:----------|-----------:|---------:|
|baseline   |     26.364M|   25.974M|
|           |       1.01x|         -|
|object_id  |     10.293M|   14.202M|
|           |           -|     1.38x|
```
2025-04-15 07:57:39 +09:00
Kunshan Wang
d17ab5a430 [ruby/mmtk] Do root scanning in scan_vm_specific_roots
We rely on scan_vm_specific_roots to reach all stacks via the following
path:

    VM -> ractors -> threads -> fibers -> stacks

0a6a835aaa
2025-04-08 03:12:50 +00:00
Matt Valentine-House
e4020133c8 Remove incorrect assertion
ractor_cache will always be NULL in this context
2025-04-01 21:45:08 +01:00
Jean Boussier
7db0e07134 Don't preserve object_id when moving object to another Ractor
That seemed like the logical thing to do to me, but ko1 disagree.
2025-03-31 12:01:55 +02:00
Jean Boussier
0350290262 Ractor: Fix moving embedded objects
[Bug #20271]
[Bug #20267]
[Bug #20255]

`rb_obj_alloc(RBASIC_CLASS(obj))` will always allocate from the basic
40B pool, so if `obj` is larger than `40B`, we'll create a corrupted
object when we later copy the shape_id.

Instead we can use the same logic than ractor copy, which is
to use `rb_obj_clone`, and later ask the GC to free the original
object.

We then must turn it into a `T_OBJECT`, because otherwise
just changing its class to `RactorMoved` leaves a lot of
ways to keep using the object, e.g.:

```
a = [1, 2, 3]
Ractor.new{}.send(a, move: true)
[].concat(a) # Should raise, but wasn't.
```

If it turns out that `rb_obj_clone` isn't performant enough
for some uses, we can always have carefully crafted specialized
paths for the types that would benefit from it.
2025-03-31 12:01:55 +02:00
Peter Zhu
31cf2684b0 Output object_id in object metadata for MMTk 2025-03-13 10:12:24 -04:00
Kunshan Wang
aa7b5e2df4 [ruby/mmtk] Trigger forced GC in GC.start
We now use `MMTK::handle_user_collection_request(true, ...)` to force
triggering a GC instead of enabling GC temporarily.

02ef47f818
2025-02-24 23:30:00 +00:00
Peter Zhu
0f1cb92345 [ruby/mmtk] Fix compatibility for Rust 1.85
9da566e26a
2025-02-20 19:35:38 +00:00
Peter Zhu
5acfe30880 Implement rb_gc_object_metadata for MMTk 2025-02-19 09:47:28 -05:00
Peter Zhu
b74077c19e [ruby/mmtk] Set Immix as the default plan
e52b973611
2025-02-10 20:37:10 +00:00
Peter Zhu
feec48ae2b Fix rb_gc_vm_weak_table_foreach compatibility for MMTK 2025-01-27 10:28:36 -05:00
Peter Zhu
4df16051be [ruby/mmtk] Remove unused lazy_static dependency
f47a1e2d17
2025-01-22 16:07:04 +00:00
Peter Zhu
be66448311 [ruby/mmtk] Bump mmtk-core
Fixes a bug where there is an infinite loop when MMTK_HEAP_MIN is small.

12c7ede20b
2025-01-21 17:02:18 +00:00
Peter Zhu
5fceba6614 [ruby/mmtk] Add mmtk_heap_max to GC.config
6a78ffaf16
2025-01-17 15:44:24 +00:00
Peter Zhu
179899c616 [ruby/mmtk] Add mmtk_heap_min to GC.config
5bbac70c69
2025-01-16 21:40:31 +00:00
Peter Zhu
d1a30359b1 [ruby/mmtk] Bump mmtk-core
52b857ea04
2025-01-16 16:20:05 +00:00
Peter Zhu
2538f4d521 [ruby/mmtk] Add mmtk_heap_mode to GC.config
810f897603
2025-01-16 16:20:04 +00:00
Peter Zhu
ab1565ebe3 [ruby/mmtk] Add mmtk_plan to GC.config
67da9ea5b8
2025-01-15 18:08:03 +00:00
Peter Zhu
e02c7491e9 [ruby/mmtk] Fix mmtk.h
dbb4036be9
2025-01-15 17:55:32 +00:00
Peter Zhu
cb6476a34e [ruby/mmtk] Bump mmtk-core
https://github.com/mmtk/mmtk-core/pull/1261 fixes an issue where the following
script causes a Rust panic:

    GC.disable
    10_000.times { Object.new }
    puts GC.stat

6191ee994a
2025-01-15 15:13:36 +00:00
Peter Zhu
f1e32914eb [ruby/mmtk] Add mmtk_worker_count to GC.config
836a9059cb
2025-01-14 20:59:39 +00:00
Peter Zhu
f5fa1ee5f6 [ruby/mmtk] Exit with error message if MMTK_PLAN is invalid
79ce2008a3
2025-01-14 17:17:44 +00:00
Peter Zhu
2bcbc80fa2 [ruby/mmtk] Exit with error message if MMTK_HEAP_MODE is invalid
c8b1f4c156
2025-01-14 17:07:21 +00:00
Nobuyoshi Nakada
1758137ead Simplify gc/mmtk/extconf.rb
- Split static recipes to depend file.
- Modify makefile configurations in the block to `create_makefile`.
- Expand rust sources in extconf.rb instead of GNU make extension.

TODO: pass `CARGO_TARGET_DIR` without shell syntax.
2025-01-14 10:21:57 -05:00
Peter Zhu
ed4b1f9c1a [ruby/mmtk] Exit with error message if MMTK_HEAP_MAX is invalid
4a24d55d91
2025-01-13 20:08:20 +00:00
Peter Zhu
f821a127ea [ruby/mmtk] Exit with error message if MMTK_HEAP_MIN is invalid
1d2f7b9cfc
2025-01-13 20:08:20 +00:00
Peter Zhu
3b9b41d046 [ruby/mmtk] Exit with error message if MMTK_THREADS is invalid
5c5c454f65
2025-01-13 20:08:19 +00:00
Peter Zhu
85a25116cc [ruby/mmtk] Enable immix_non_moving feature
63ab563e04
2025-01-13 16:44:36 +00:00
Peter Zhu
f76d40789d [ruby/mmtk] Enable UNIQUE_OBJECT_ENQUEUING in MMTk
UNIQUE_OBJECT_ENQUEUING guarantees that object marking is atomic so that
an object cannot be marked more than once.

2f97fd8207
2025-01-09 19:08:49 +00:00
Peter Zhu
4ce82f1c33 [ruby/mmtk] Bump mmtk-core to
68bf1b6382

ba1ec69bf6
2025-01-09 19:08:49 +00:00
Peter Zhu
2da91080d3 [ruby/mmtk] Fix libmmtk_ruby.a building in extconf.rb
Since libmmtk_ruby.a was a PHONY target, it caused the shared object to
not be rebuilt even though libmmtk_ruby.a was updated.

076f0a97a6
2025-01-09 17:34:02 +00:00
Peter Zhu
4a78d74039 [ruby/mmtk] Remove unused Ruby SHA reference in Cargo.toml
02b9439ea6
2025-01-07 22:17:31 +00:00
Peter Zhu
2b713f08a3 [ruby/mmtk] Bump mmtk-core version
0de72c03ba
2025-01-07 15:37:41 +00:00
Peter Zhu
de7feb0538 [ruby/mmtk] Also remove .rustc_info.json in clean-mmtk target
4b67c8b4da
2024-12-09 19:11:49 +00:00
Peter Zhu
ea7e34fd5d [ruby/mmtk] Add target clean-mmtk to clean Rust debug and release directories
1f71cb873c
2024-12-09 18:37:07 +00:00
Matt Valentine-House
d8dbc2dcba [ruby/mmtk] Support setting the mmtk thread count with MMTK_THREADS
e4d6b56824
2024-12-05 16:28:02 +00:00
Peter Zhu
770ca58cd3 [ruby/mmtk] Use extconf.rb for external GC compilation
This commit adds extconf.rb for both the default GC and and MMTk to build
the external GC. This allows common.mk to not need to contain any
implementation-specific build configuration.

db6a29b4a9
2024-11-22 09:55:25 +00:00
Peter Zhu
19840dfd71 [ruby/mmtk] [Feature #20860] Implement Mark-Sweep with MMTK
This commit implements the mark-sweep algorithm using MMTk and allows
customizing the plan using MMTK_PLAN.

6fea5e5ffc

Co-Authored-By: Matt Valentine-House <matt@eightbitraptor.com>
2024-11-22 09:55:24 +00:00