Skip to content

Commit 76211be

Browse files
committed
Ractor support
1 parent 2b3747e commit 76211be

14 files changed

Lines changed: 86 additions & 10 deletions

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_FALGS,
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
@@ -218,6 +218,8 @@ def enable_debug_build_flag(flags)
218218
$LOCAL_LIBS.prepend("#{libffi.a} ").strip! # to exts.mk
219219
$INCFLAGS.gsub!(/-I#{libffi.dir}/, '-I$(LIBFFI_DIR)')
220220
end
221+
222+
have_func("rb_str_to_interned_str")
221223
create_makefile 'fiddle' do |conf|
222224
if !libffi
223225
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,5 +236,15 @@ 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_FALGS = (
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
240250
/* vim: set noet sws=4 sw=4: */

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_FALGS,
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_FALGS & ~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_FALGS,
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_FALGS,
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_FALGS,
9898
};
9999

100100
#ifdef HAVE_RUBY_MEMORY_VIEW_H

test/fiddle/test_closure.rb

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -149,5 +149,14 @@ def test_memsize_ruby_dev_42480
149149
end
150150
end
151151
end
152+
153+
if defined?(Ractor)
154+
def test_ractor_shareable
155+
Closure.create(:int, [:void]) do |c|
156+
Ractor.make_shareable(c)
157+
assert_operator Ractor, :shareable?, c
158+
end
159+
end
160+
end
152161
end
153162
end if defined?(Fiddle)

test/fiddle/test_function.rb

Lines changed: 8 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -225,6 +225,14 @@ def test_no_memory_leak
225225
end
226226
end
227227

228+
if defined?(Ractor)
229+
def test_ractor_shareable
230+
func = Function.new(@libm['sin'], [TYPE_DOUBLE], TYPE_DOUBLE)
231+
Ractor.make_shareable(func)
232+
assert_operator Ractor, :shareable?, func
233+
end
234+
end
235+
228236
private
229237

230238
def perror(m)

0 commit comments

Comments
 (0)