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

Open
wants to merge 2 commits into
base: master
Choose a base branch
from
Open
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_FALGS,
};

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 @@ -218,6 +218,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,5 +236,15 @@ 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_FALGS = (
Copy link
Contributor

Choose a reason for hiding this comment

The reason will be displayed to describe this comment to others. Learn more.

s/FALGS/FLAGS

RUBY_TYPED_FREE_IMMEDIATELY |
RUBY_TYPED_WB_PROTECTED |
#ifdef RUBY_TYPED_FROZEN_SHAREABLE
RUBY_TYPED_FROZEN_SHAREABLE |
#endif
0)
};

#endif
/* vim: set noet sws=4 sw=4: */
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_FALGS,
};

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

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_FALGS,
};

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_FALGS,
};

#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 @@ -180,5 +180,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
6 changes: 6 additions & 0 deletions test/fiddle/test_closure.rb
Original file line number Diff line number Diff line change
Expand Up @@ -149,5 +149,11 @@ def test_memsize_ruby_dev_42480
end
end
end

ractor def test_ractor_shareable
Closure.create(:int, [:void]) do |c|
assert_ractor_shareable(c)
end
end
end
end if defined?(Fiddle)
4 changes: 4 additions & 0 deletions test/fiddle/test_function.rb
Original file line number Diff line number Diff line change
Expand Up @@ -225,6 +225,10 @@ def test_no_memory_leak
end
end

ractor def test_ractor_shareable
assert_ractor_shareable(Function.new(@libm['sin'], [TYPE_DOUBLE], TYPE_DOUBLE))
end

private

def perror(m)
Expand Down
4 changes: 4 additions & 0 deletions test/fiddle/test_handle.rb
Original file line number Diff line number Diff line change
Expand Up @@ -214,5 +214,9 @@ def test_fallback_to_ansi
assert_equal(ansi, k["GetFileAttributes"], "should fallback to ANSI version")
end
end

ractor def test_ractor_shareable
assert_ractor_shareable(Fiddle::Handle.new(LIBC_SO))
end
end
end if defined?(Fiddle)
6 changes: 6 additions & 0 deletions test/fiddle/test_memory_view.rb
Original file line number Diff line number Diff line change
Expand Up @@ -139,5 +139,11 @@ def test_to_s
assert_equal([data.b, true],
[string, string.frozen?])
end

ractor def test_ractor_shareable
ptr = Pointer["hello world"]
assert_ractor_shareable MemoryView.new(ptr)
assert_predicate ptr, :frozen?
end
end
end
7 changes: 6 additions & 1 deletion test/fiddle/test_pinned.rb
Original file line number Diff line number Diff line change
Expand Up @@ -23,6 +23,11 @@ def test_clear
end
assert_match "called on", ex.message
end

ractor def test_ractor_shareable
obj = Object.new
assert_ractor_shareable(Pinned.new(obj))
assert_predicate obj, :frozen?
end
end
end

7 changes: 7 additions & 0 deletions test/fiddle/test_pointer.rb
Original file line number Diff line number Diff line change
Expand Up @@ -302,5 +302,12 @@ def test_no_memory_leak
assert_no_memory_leak(%w[-W0 -rfiddle.so], '', '100_000.times {Fiddle::Pointer.allocate}', rss: true)
end
end

ractor def test_ractor_shareable
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)