diff options
-rw-r--r-- | include/ruby/memory_view.h | 12 | ||||
-rw-r--r-- | memory_view.c | 7 |
2 files changed, 12 insertions, 7 deletions
diff --git a/include/ruby/memory_view.h b/include/ruby/memory_view.h index bac49e363e..83931038a0 100644 --- a/include/ruby/memory_view.h +++ b/include/ruby/memory_view.h @@ -146,8 +146,11 @@ typedef struct { * Or, NULL when this memory view exposes a flat array. */ const ssize_t *sub_offsets; - /** the private data for managing this exported memory */ + /** The private data for managing this exported memory */ void *private_data; + + /** DO NOT TOUCH THIS: The memory view entry for the internal use */ + const struct rb_memory_view_entry *_memory_view_entry; } rb_memory_view_t; /** Type of function of ::rb_memory_view_entry_t::get_func. */ @@ -160,9 +163,10 @@ typedef bool (* rb_memory_view_release_func_t)(VALUE obj, rb_memory_view_t *view typedef bool (* rb_memory_view_available_p_func_t)(VALUE obj); /** Operations applied to a specific kind of a memory view. */ -typedef struct { - - /** Exports a memory view from a Ruby object. */ +typedef struct rb_memory_view_entry { + /** + * Exports a memory view from a Ruby object. + */ rb_memory_view_get_func_t get_func; /** diff --git a/memory_view.c b/memory_view.c index b08f13e286..637d427e86 100644 --- a/memory_view.c +++ b/memory_view.c @@ -108,7 +108,8 @@ static void unregister_exported_object(VALUE obj) { RB_VM_LOCK_ENTER(); - st_update(exported_object_table, (st_data_t)obj, exported_object_dec_ref, 0); + if (exported_object_table) + st_update(exported_object_table, (st_data_t)obj, exported_object_dec_ref, 0); RB_VM_LOCK_LEAVE(); } @@ -822,6 +823,7 @@ rb_memory_view_get(VALUE obj, rb_memory_view_t* view, int flags) bool rv = (*entry->get_func)(obj, view, flags); if (rv) { + view->_memory_view_entry = entry; register_exported_object(view->obj); } return rv; @@ -834,8 +836,7 @@ rb_memory_view_get(VALUE obj, rb_memory_view_t* view, int flags) bool rb_memory_view_release(rb_memory_view_t* view) { - VALUE klass = CLASS_OF(view->obj); - const rb_memory_view_entry_t *entry = lookup_memory_view_entry(klass); + const rb_memory_view_entry_t *entry = view->_memory_view_entry; if (entry) { bool rv = true; if (entry->release_func) { |