diff options
| author | Nobuyoshi Nakada <nobu@ruby-lang.org> | 2024-10-11 14:59:09 +0900 |
|---|---|---|
| committer | Hiroshi SHIBATA <hsbt@ruby-lang.org> | 2024-10-16 11:24:25 +0900 |
| commit | bbd5b8ddae7b3ff7205866d54cf8aca065a6d9bd (patch) | |
| tree | 0716841193c6c36b4d44173ccaf54dbe99356897 /ext | |
| 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 <kou@clear-code.com>
Diffstat (limited to 'ext')
| -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 |
8 files changed, 35 insertions, 9 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 |
