diff options
author | Nobuyoshi Nakada <[email protected]> | 2024-10-11 14:59:09 +0900 |
---|---|---|
committer | Hiroshi SHIBATA <[email protected]> | 2024-10-16 11:24:25 +0900 |
commit | bbd5b8ddae7b3ff7205866d54cf8aca065a6d9bd (patch) | |
tree | 0716841193c6c36b4d44173ccaf54dbe99356897 | |
parent | a0ecdbfbfe57a57ab33bdb5e1de4d5dfa8407dbb (diff) |
[ruby/fiddle] Ractor support
(https://github.com/ruby/fiddle/pull/139)
https://github.com/ruby/fiddle/commit/91d0ea9849
Co-authored-by: Sutou Kouhei <[email protected]>
-rw-r--r-- | ext/fiddle/closure.c | 3 | ||||
-rw-r--r-- | ext/fiddle/extconf.rb | 2 | ||||
-rw-r--r-- | ext/fiddle/fiddle.h | 10 | ||||
-rw-r--r-- | ext/fiddle/function.c | 5 | ||||
-rw-r--r-- | ext/fiddle/handle.c | 3 | ||||
-rw-r--r-- | ext/fiddle/memory_view.c | 9 | ||||
-rw-r--r-- | ext/fiddle/pinned.c | 10 | ||||
-rw-r--r-- | ext/fiddle/pointer.c | 2 | ||||
-rw-r--r-- | test/fiddle/helper.rb | 5 | ||||
-rw-r--r-- | test/fiddle/test_closure.rb | 12 | ||||
-rw-r--r-- | test/fiddle/test_function.rb | 5 | ||||
-rw-r--r-- | test/fiddle/test_handle.rb | 5 | ||||
-rw-r--r-- | test/fiddle/test_memory_view.rb | 12 | ||||
-rw-r--r-- | test/fiddle/test_pinned.rb | 8 | ||||
-rw-r--r-- | test/fiddle/test_pointer.rb | 8 |
15 files changed, 89 insertions, 10 deletions
diff --git a/ext/fiddle/closure.c b/ext/fiddle/closure.c index 7aa9407619..d526d870e8 100644 --- a/ext/fiddle/closure.c +++ b/ext/fiddle/closure.c @@ -61,7 +61,7 @@ const rb_data_type_t closure_data_type = { .dfree = dealloc, .dsize = closure_memsize }, - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + .flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS, }; struct callback_args { @@ -300,6 +300,7 @@ initialize_body(VALUE user_data) cl->argv[i] = rb_fiddle_int_to_ffi_type(NUM2INT(arg)); } cl->argv[argc] = NULL; + OBJ_FREEZE_RAW(normalized_args); ret = rb_fiddle_type_ensure(ret); rb_iv_set(data->self, "@ctype", ret); diff --git a/ext/fiddle/extconf.rb b/ext/fiddle/extconf.rb index 6b0ea753fc..f062d1fc76 100644 --- a/ext/fiddle/extconf.rb +++ b/ext/fiddle/extconf.rb @@ -223,6 +223,8 @@ if libffi $LOCAL_LIBS.prepend("#{libffi.a} ").strip! # to exts.mk $INCFLAGS.gsub!(/-I#{libffi.dir}/, '-I$(LIBFFI_DIR)') end + +have_func("rb_str_to_interned_str") create_makefile 'fiddle' do |conf| if !libffi next conf << "LIBFFI_CLEAN = none\n" diff --git a/ext/fiddle/fiddle.h b/ext/fiddle/fiddle.h index 54391b95f5..c0ab8a91ec 100644 --- a/ext/fiddle/fiddle.h +++ b/ext/fiddle/fiddle.h @@ -236,4 +236,14 @@ VALUE rb_fiddle_new_function(VALUE address, VALUE arg_types, VALUE ret_type); typedef void (*rb_fiddle_freefunc_t)(void*); VALUE rb_fiddle_ptr_new_wrap(void *ptr, long size, rb_fiddle_freefunc_t func, VALUE wrap0, VALUE wrap1); +enum { + FIDDLE_DEFAULT_TYPED_DATA_FLAGS = ( + RUBY_TYPED_FREE_IMMEDIATELY | + RUBY_TYPED_WB_PROTECTED | +#ifdef RUBY_TYPED_FROZEN_SHAREABLE + RUBY_TYPED_FROZEN_SHAREABLE | +#endif + 0) +}; + #endif diff --git a/ext/fiddle/function.c b/ext/fiddle/function.c index 73dfb129a5..21a7ad6d23 100644 --- a/ext/fiddle/function.c +++ b/ext/fiddle/function.c @@ -59,7 +59,7 @@ const rb_data_type_t function_data_type = { .dfree = deallocate, .dsize = function_memsize }, - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED, + .flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS, }; static VALUE @@ -153,6 +153,9 @@ initialize(int argc, VALUE argv[], VALUE self) rb_get_kwargs(kwargs, kw, 0, kw_max_, args); if (args[kw_name] != Qundef) { name = args[kw_name]; +#ifdef HAVE_RB_STR_TO_INTERNED_STR + name = rb_str_to_interned_str(name); +#endif } if (args[kw_need_gvl] != Qundef) { need_gvl = args[kw_need_gvl]; diff --git a/ext/fiddle/handle.c b/ext/fiddle/handle.c index 558d6d4551..0d03133cab 100644 --- a/ext/fiddle/handle.c +++ b/ext/fiddle/handle.c @@ -56,7 +56,8 @@ static const rb_data_type_t fiddle_handle_data_type = { .dfree = fiddle_handle_free, .dsize = fiddle_handle_memsize }, - .flags = RUBY_TYPED_WB_PROTECTED, + .flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS & ~RUBY_TYPED_FREE_IMMEDIATELY, + /* keeping while its symbols are referred. */ }; /* diff --git a/ext/fiddle/memory_view.c b/ext/fiddle/memory_view.c index fa66fc2c7b..5fd7b9b408 100644 --- a/ext/fiddle/memory_view.c +++ b/ext/fiddle/memory_view.c @@ -64,8 +64,13 @@ fiddle_memview_memsize(const void *ptr) } static const rb_data_type_t fiddle_memview_data_type = { - "fiddle/memory_view", - {fiddle_memview_mark, fiddle_memview_free, fiddle_memview_memsize,}, + .wrap_struct_name = "fiddle/memory_view", + .function = { + .dmark = fiddle_memview_mark, + .dfree = fiddle_memview_free, + .dsize = fiddle_memview_memsize, + }, + .flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS, }; static VALUE diff --git a/ext/fiddle/pinned.c b/ext/fiddle/pinned.c index 019a3020e2..94962b0ff6 100644 --- a/ext/fiddle/pinned.c +++ b/ext/fiddle/pinned.c @@ -24,9 +24,13 @@ pinned_memsize(const void *ptr) } static const rb_data_type_t pinned_data_type = { - "fiddle/pinned", - {pinned_mark, xfree, pinned_memsize, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED + .wrap_struct_name = "fiddle/pinned", + .function = { + .dmark = pinned_mark, + .dfree = RUBY_TYPED_DEFAULT_FREE, + .dsize = pinned_memsize, + }, + .flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS, }; static VALUE diff --git a/ext/fiddle/pointer.c b/ext/fiddle/pointer.c index 5c375fe9d2..00bd76e9b2 100644 --- a/ext/fiddle/pointer.c +++ b/ext/fiddle/pointer.c @@ -94,7 +94,7 @@ static const rb_data_type_t fiddle_ptr_data_type = { .dfree = fiddle_ptr_free, .dsize = fiddle_ptr_memsize, }, - .flags = RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED + .flags = FIDDLE_DEFAULT_TYPED_DATA_FLAGS, }; #ifdef HAVE_RUBY_MEMORY_VIEW_H diff --git a/test/fiddle/helper.rb b/test/fiddle/helper.rb index 9dfe381a20..aebe028206 100644 --- a/test/fiddle/helper.rb +++ b/test/fiddle/helper.rb @@ -189,5 +189,10 @@ module Fiddle ensure GC.stress = stress end + + def assert_ractor_shareable(object) + Ractor.make_shareable(object) + assert_operator(Ractor, :shareable?, object) + end end end diff --git a/test/fiddle/test_closure.rb b/test/fiddle/test_closure.rb index 787a9b635a..3985e1e2bf 100644 --- a/test/fiddle/test_closure.rb +++ b/test/fiddle/test_closure.rb @@ -152,5 +152,17 @@ module Fiddle end end end + + def test_ractor_shareable + omit("Need Ractor") unless defined?(Ractor) + closure_class = Class.new(Closure) do + def call + 0 + end + end + closure_class.create(:int, [:void]) do |c| + assert_ractor_shareable(c) + end + end end end if defined?(Fiddle) diff --git a/test/fiddle/test_function.rb b/test/fiddle/test_function.rb index b6ae8c14bc..b4b2df2874 100644 --- a/test/fiddle/test_function.rb +++ b/test/fiddle/test_function.rb @@ -253,6 +253,11 @@ module Fiddle end end + def test_ractor_shareable + omit("Need Ractor") unless defined?(Ractor) + assert_ractor_shareable(Function.new(@libm['sin'], [TYPE_DOUBLE], TYPE_DOUBLE)) + end + private def perror(m) diff --git a/test/fiddle/test_handle.rb b/test/fiddle/test_handle.rb index c952a7ef17..2a51add852 100644 --- a/test/fiddle/test_handle.rb +++ b/test/fiddle/test_handle.rb @@ -226,5 +226,10 @@ module Fiddle assert_equal(ansi, k["GetFileAttributes"], "should fallback to ANSI version") end end + + def test_ractor_shareable + omit("Need Ractor") unless defined?(Ractor) + assert_ractor_shareable(Fiddle::Handle.new(LIBC_SO)) + end end end if defined?(Fiddle) diff --git a/test/fiddle/test_memory_view.rb b/test/fiddle/test_memory_view.rb index d44c42d239..da00d66c91 100644 --- a/test/fiddle/test_memory_view.rb +++ b/test/fiddle/test_memory_view.rb @@ -159,5 +159,17 @@ module Fiddle mview.release end end + + def test_ractor_shareable + omit("Need Ractor") unless defined?(Ractor) + ptr = Pointer["hello world"] + mview = MemoryView.new(ptr) + begin + assert_ractor_shareable(mview) + assert_predicate(ptr, :frozen?) + ensure + mview.release + end + end end end diff --git a/test/fiddle/test_pinned.rb b/test/fiddle/test_pinned.rb index f0d375b1cc..ad132579b0 100644 --- a/test/fiddle/test_pinned.rb +++ b/test/fiddle/test_pinned.rb @@ -23,6 +23,12 @@ module Fiddle end assert_match "called on", ex.message end + + def test_ractor_shareable + omit("Need Ractor") unless defined?(Ractor) + obj = Object.new + assert_ractor_shareable(Pinned.new(obj)) + assert_predicate(obj, :frozen?) + end end end - diff --git a/test/fiddle/test_pointer.rb b/test/fiddle/test_pointer.rb index f17c8338f5..ea8015438e 100644 --- a/test/fiddle/test_pointer.rb +++ b/test/fiddle/test_pointer.rb @@ -305,5 +305,13 @@ module Fiddle assert_raise(DLError) {nullpo[0]} assert_raise(DLError) {nullpo[0] = 1} end + + def test_ractor_shareable + omit("Need Ractor") unless defined?(Ractor) + assert_ractor_shareable(Fiddle::NULL) + ary = [0, 1, 2, 4, 5] + addr = Pointer.new(dlwrap(ary)) + assert_ractor_shareable(addr) + end end end if defined?(Fiddle) |