Skip to content

Commit 91d0ea9

Browse files
nobukou
andauthored
Ractor support (#139)
Co-authored-by: Sutou Kouhei <kou@clear-code.com>
1 parent 31bebd8 commit 91d0ea9

15 files changed

+89
-10
lines changed

ext/fiddle/closure.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -61,7 +61,7 @@ const rb_data_type_t closure_data_type = {
6161
.dfree = dealloc,
6262
.dsize = closure_memsize
6363
},
64-
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
64+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS,
6565
};
6666

6767
struct callback_args {
@@ -300,6 +300,7 @@ initialize_body(VALUE user_data)
300300
cl->argv[i] = rb_fiddle_int_to_ffi_type(NUM2INT(arg));
301301
}
302302
cl->argv[argc] = NULL;
303+
OBJ_FREEZE_RAW(normalized_args);
303304

304305
ret = rb_fiddle_type_ensure(ret);
305306
rb_iv_set(data->self, "@ctype", ret);

ext/fiddle/extconf.rb

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -223,6 +223,8 @@ def enable_debug_build_flag(flags)
223223
$LOCAL_LIBS.prepend("#{libffi.a} ").strip! # to exts.mk
224224
$INCFLAGS.gsub!(/-I#{libffi.dir}/, '-I$(LIBFFI_DIR)')
225225
end
226+
227+
have_func("rb_str_to_interned_str")
226228
create_makefile 'fiddle' do |conf|
227229
if !libffi
228230
next conf << "LIBFFI_CLEAN = none\n"

ext/fiddle/fiddle.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -236,4 +236,14 @@ VALUE rb_fiddle_new_function(VALUE address, VALUE arg_types, VALUE ret_type);
236236
typedef void (*rb_fiddle_freefunc_t)(void*);
237237
VALUE rb_fiddle_ptr_new_wrap(void *ptr, long size, rb_fiddle_freefunc_t func, VALUE wrap0, VALUE wrap1);
238238

239+
enum {
240+
FIDDLE_DEFAULT_TYPED_DATA_FLAGS = (
241+
RUBY_TYPED_FREE_IMMEDIATELY |
242+
RUBY_TYPED_WB_PROTECTED |
243+
#ifdef RUBY_TYPED_FROZEN_SHAREABLE
244+
RUBY_TYPED_FROZEN_SHAREABLE |
245+
#endif
246+
0)
247+
};
248+
239249
#endif

ext/fiddle/function.c

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,7 +59,7 @@ const rb_data_type_t function_data_type = {
5959
.dfree = deallocate,
6060
.dsize = function_memsize
6161
},
62-
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED,
62+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS,
6363
};
6464

6565
static VALUE
@@ -153,6 +153,9 @@ initialize(int argc, VALUE argv[], VALUE self)
153153
rb_get_kwargs(kwargs, kw, 0, kw_max_, args);
154154
if (args[kw_name] != Qundef) {
155155
name = args[kw_name];
156+
#ifdef HAVE_RB_STR_TO_INTERNED_STR
157+
name = rb_str_to_interned_str(name);
158+
#endif
156159
}
157160
if (args[kw_need_gvl] != Qundef) {
158161
need_gvl = args[kw_need_gvl];

ext/fiddle/handle.c

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -56,7 +56,8 @@ static const rb_data_type_t fiddle_handle_data_type = {
5656
.dfree = fiddle_handle_free,
5757
.dsize = fiddle_handle_memsize
5858
},
59-
.flags = RUBY_TYPED_WB_PROTECTED,
59+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS & ~RUBY_TYPED_FREE_IMMEDIATELY,
60+
/* keeping while its symbols are referred. */
6061
};
6162

6263
/*

ext/fiddle/memory_view.c

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,13 @@ fiddle_memview_memsize(const void *ptr)
6464
}
6565

6666
static const rb_data_type_t fiddle_memview_data_type = {
67-
"fiddle/memory_view",
68-
{fiddle_memview_mark, fiddle_memview_free, fiddle_memview_memsize,},
67+
.wrap_struct_name = "fiddle/memory_view",
68+
.function = {
69+
.dmark = fiddle_memview_mark,
70+
.dfree = fiddle_memview_free,
71+
.dsize = fiddle_memview_memsize,
72+
},
73+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS,
6974
};
7075

7176
static VALUE

ext/fiddle/pinned.c

Lines changed: 7 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,13 @@ pinned_memsize(const void *ptr)
2424
}
2525

2626
static const rb_data_type_t pinned_data_type = {
27-
"fiddle/pinned",
28-
{pinned_mark, xfree, pinned_memsize, },
29-
0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
27+
.wrap_struct_name = "fiddle/pinned",
28+
.function = {
29+
.dmark = pinned_mark,
30+
.dfree = RUBY_TYPED_DEFAULT_FREE,
31+
.dsize = pinned_memsize,
32+
},
33+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS,
3034
};
3135

3236
static VALUE

ext/fiddle/pointer.c

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -94,7 +94,7 @@ static const rb_data_type_t fiddle_ptr_data_type = {
9494
.dfree = fiddle_ptr_free,
9595
.dsize = fiddle_ptr_memsize,
9696
},
97-
.flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED
97+
.flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS,
9898
};
9999

100100
#ifdef HAVE_RUBY_MEMORY_VIEW_H

test/fiddle/helper.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -193,5 +193,10 @@ def under_gc_stress
193193
ensure
194194
GC.stress = stress
195195
end
196+
197+
def assert_ractor_shareable(object)
198+
Ractor.make_shareable(object)
199+
assert_operator(Ractor, :shareable?, object)
200+
end
196201
end
197202
end

test/fiddle/test_closure.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -157,5 +157,17 @@ def call
157157
end
158158
end
159159
end
160+
161+
def test_ractor_shareable
162+
omit("Need Ractor") unless defined?(Ractor)
163+
closure_class = Class.new(Closure) do
164+
def call
165+
0
166+
end
167+
end
168+
closure_class.create(:int, [:void]) do |c|
169+
assert_ractor_shareable(c)
170+
end
171+
end
160172
end
161173
end if defined?(Fiddle)

test/fiddle/test_function.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -259,6 +259,11 @@ def test_no_memory_leak
259259
end
260260
end
261261

262+
def test_ractor_shareable
263+
omit("Need Ractor") unless defined?(Ractor)
264+
assert_ractor_shareable(Function.new(@libm['sin'], [TYPE_DOUBLE], TYPE_DOUBLE))
265+
end
266+
262267
private
263268

264269
def perror(m)

test/fiddle/test_handle.rb

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -226,5 +226,10 @@ def test_fallback_to_ansi
226226
assert_equal(ansi, k["GetFileAttributes"], "should fallback to ANSI version")
227227
end
228228
end
229+
230+
def test_ractor_shareable
231+
omit("Need Ractor") unless defined?(Ractor)
232+
assert_ractor_shareable(Fiddle::Handle.new(LIBC_SO))
233+
end
229234
end
230235
end if defined?(Fiddle)

test/fiddle/test_memory_view.rb

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -159,5 +159,17 @@ def test_to_s
159159
mview.release
160160
end
161161
end
162+
163+
def test_ractor_shareable
164+
omit("Need Ractor") unless defined?(Ractor)
165+
ptr = Pointer["hello world"]
166+
mview = MemoryView.new(ptr)
167+
begin
168+
assert_ractor_shareable(mview)
169+
assert_predicate(ptr, :frozen?)
170+
ensure
171+
mview.release
172+
end
173+
end
162174
end
163175
end

test/fiddle/test_pinned.rb

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,12 @@ def test_clear
2323
end
2424
assert_match "called on", ex.message
2525
end
26+
27+
def test_ractor_shareable
28+
omit("Need Ractor") unless defined?(Ractor)
29+
obj = Object.new
30+
assert_ractor_shareable(Pinned.new(obj))
31+
assert_predicate(obj, :frozen?)
32+
end
2633
end
2734
end
28-

test/fiddle/test_pointer.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -305,5 +305,13 @@ def test_null_pointer
305305
assert_raise(DLError) {nullpo[0]}
306306
assert_raise(DLError) {nullpo[0] = 1}
307307
end
308+
309+
def test_ractor_shareable
310+
omit("Need Ractor") unless defined?(Ractor)
311+
assert_ractor_shareable(Fiddle::NULL)
312+
ary = [0, 1, 2, 4, 5]
313+
addr = Pointer.new(dlwrap(ary))
314+
assert_ractor_shareable(addr)
315+
end
308316
end
309317
end if defined?(Fiddle)

0 commit comments

Comments
 (0)