diff options
author | Jean Boussier <jean.boussier@gmail.com> | 2023-03-02 14:06:48 +0100 |
---|---|---|
committer | Jean Boussier <jean.boussier@gmail.com> | 2023-03-02 14:06:48 +0100 |
commit | 902e763b240eeafa15a54a4632c3d528c1c3ae93 (patch) | |
tree | 71174cd8e1c348d5fc407047c783a31e42ad0436 /ext | |
parent | 227d1ce472ec90144249f8cf85b52d85cbab925c (diff) | |
download | ffi-902e763b240eeafa15a54a4632c3d528c1c3ae93.tar.gz |
Convert FFI::ThreadData to TypedData
Ref: https://github.com/ffi/ffi/pull/991
The old untyped DATA API is soft deprecated and
this new one open the door to write barriers, compaction, memsize etc.
Diffstat (limited to 'ext')
-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 |