diff options
author | Lars Kanis <lars@greiz-reinsdorf.de> | 2023-03-03 13:40:53 +0100 |
---|---|---|
committer | GitHub <noreply@github.com> | 2023-03-03 13:40:53 +0100 |
commit | 91f5fe284ffa6a833d2ba726342e4f729d89f9bb (patch) | |
tree | cec6fe052bd5bbaa62ff9320a1ed59151145b75c | |
parent | 3d57a903f2a47fa735e2985a93f11680af2c0eee (diff) | |
parent | 902e763b240eeafa15a54a4632c3d528c1c3ae93 (diff) | |
download | ffi-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.c | 24 |
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 |