summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorLars Kanis <lars@greiz-reinsdorf.de>2023-03-03 13:40:53 +0100
committerGitHub <noreply@github.com>2023-03-03 13:40:53 +0100
commit91f5fe284ffa6a833d2ba726342e4f729d89f9bb (patch)
treecec6fe052bd5bbaa62ff9320a1ed59151145b75c
parent3d57a903f2a47fa735e2985a93f11680af2c0eee (diff)
parent902e763b240eeafa15a54a4632c3d528c1c3ae93 (diff)
downloadffi-91f5fe284ffa6a833d2ba726342e4f729d89f9bb.tar.gz
Merge pull request #996 from casperisfine/typed-data-thread-data
Convert FFI::ThreadData to TypedData
-rw-r--r--ext/ffi_c/LastError.c24
1 files changed, 18 insertions, 6 deletions
diff --git a/ext/ffi_c/LastError.c b/ext/ffi_c/LastError.c
index 6beecef..4cef93b 100644
--- a/ext/ffi_c/LastError.c
+++ b/ext/ffi_c/LastError.c
@@ -91,30 +91,42 @@ thread_data_free(void *ptr)
}
#else
+static const rb_data_type_t thread_data_data_type = {
+ .wrap_struct_name = "FFI::ThreadData",
+ .function = {
+ .dmark = NULL,
+ .dfree = RUBY_TYPED_DEFAULT_FREE,
+ .dsize = NULL,
+ },
+ .flags = RUBY_TYPED_FREE_IMMEDIATELY
+};
+
static ID id_thread_data;
static ThreadData*
thread_data_init(void)
{
- ThreadData* td;
+ ThreadData *td;
VALUE obj;
- obj = Data_Make_Struct(rb_cObject, ThreadData, NULL, -1, td);
+ obj = TypedData_Make_Struct(rb_cObject, ThreadData, &thread_data_data_type, td);
rb_thread_local_aset(rb_thread_current(), id_thread_data, obj);
return td;
}
static inline ThreadData*
-thread_data_get()
+thread_data_get(void)
{
VALUE obj = rb_thread_local_aref(rb_thread_current(), id_thread_data);
- if (obj != Qnil && TYPE(obj) == T_DATA) {
- return (ThreadData *) DATA_PTR(obj);
+ if (NIL_P(obj)) {
+ return thread_data_init();
}
- return thread_data_init();
+ ThreadData *td;
+ TypedData_Get_Struct(obj, ThreadData, &thread_data_data_type, td);
+ return td;
}
#endif