Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

Ractor support #139

Merged
merged 7 commits into from
Oct 11, 2024
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
3 changes: 2 additions & 1 deletion ext/fiddle/closure.c
Original file line number Diff line number Diff line change
Expand Up @@ -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 {
Expand Down Expand Up @@ -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);
Expand Down
2 changes: 2 additions & 0 deletions ext/fiddle/extconf.rb
Original file line number Diff line number Diff line change
Expand Up @@ -223,6 +223,8 @@ def enable_debug_build_flag(flags)
$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"
Expand Down
10 changes: 10 additions & 0 deletions ext/fiddle/fiddle.h
Original file line number Diff line number Diff line change
Expand Up @@ -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
5 changes: 4 additions & 1 deletion ext/fiddle/function.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down Expand Up @@ -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];
Expand Down
3 changes: 2 additions & 1 deletion ext/fiddle/handle.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */
};

/*
Expand Down
9 changes: 7 additions & 2 deletions ext/fiddle/memory_view.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
10 changes: 7 additions & 3 deletions ext/fiddle/pinned.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
2 changes: 1 addition & 1 deletion ext/fiddle/pointer.c
Original file line number Diff line number Diff line change
Expand Up @@ -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
Expand Down
5 changes: 5 additions & 0 deletions test/fiddle/helper.rb
Original file line number Diff line number Diff line change
Expand Up @@ -193,5 +193,10 @@ def under_gc_stress
ensure
GC.stress = stress
end

def assert_ractor_shareable(object)
Ractor.make_shareable(object)
assert_operator(Ractor, :shareable?, object)
end
end
end
12 changes: 12 additions & 0 deletions test/fiddle/test_closure.rb
Original file line number Diff line number Diff line change
Expand Up @@ -157,5 +157,17 @@ def call
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)
5 changes: 5 additions & 0 deletions test/fiddle/test_function.rb
Original file line number Diff line number Diff line change
Expand Up @@ -259,6 +259,11 @@ def test_no_memory_leak
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)
Expand Down
5 changes: 5 additions & 0 deletions test/fiddle/test_handle.rb
Original file line number Diff line number Diff line change
Expand Up @@ -226,5 +226,10 @@ def test_fallback_to_ansi
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)
12 changes: 12 additions & 0 deletions test/fiddle/test_memory_view.rb
Original file line number Diff line number Diff line change
Expand Up @@ -159,5 +159,17 @@ def test_to_s
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
8 changes: 7 additions & 1 deletion test/fiddle/test_pinned.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,12 @@ def test_clear
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

8 changes: 8 additions & 0 deletions test/fiddle/test_pointer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -305,5 +305,13 @@ def test_null_pointer
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)
Loading