memory_view.c: Add _memory_view_entry member in rb_memory_view_t (#5088)

This commit is contained in:
Kenta Murata 2021-11-08 12:52:09 +09:00 committed by GitHub
parent e0a5c3d2b7
commit 3501e0cbb5
No known key found for this signature in database
GPG Key ID: 4AEE18F83AFDEB23
Notes: git 2021-11-08 12:52:35 +09:00
Merged-By: mrkn <mrkn@ruby-lang.org>
2 changed files with 12 additions and 7 deletions

View File

@ -146,8 +146,11 @@ typedef struct {
* Or, NULL when this memory view exposes a flat array. */ * Or, NULL when this memory view exposes a flat array. */
const ssize_t *sub_offsets; const ssize_t *sub_offsets;
/** the private data for managing this exported memory */ /** The private data for managing this exported memory */
void *private_data; 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; } rb_memory_view_t;
/** Type of function of ::rb_memory_view_entry_t::get_func. */ /** 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); typedef bool (* rb_memory_view_available_p_func_t)(VALUE obj);
/** Operations applied to a specific kind of a memory view. */ /** Operations applied to a specific kind of a memory view. */
typedef struct { typedef struct rb_memory_view_entry {
/**
/** Exports a memory view from a Ruby object. */ * Exports a memory view from a Ruby object.
*/
rb_memory_view_get_func_t get_func; rb_memory_view_get_func_t get_func;
/** /**

View File

@ -108,7 +108,8 @@ static void
unregister_exported_object(VALUE obj) unregister_exported_object(VALUE obj)
{ {
RB_VM_LOCK_ENTER(); 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(); 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); bool rv = (*entry->get_func)(obj, view, flags);
if (rv) { if (rv) {
view->_memory_view_entry = entry;
register_exported_object(view->obj); register_exported_object(view->obj);
} }
return rv; return rv;
@ -834,8 +836,7 @@ rb_memory_view_get(VALUE obj, rb_memory_view_t* view, int flags)
bool bool
rb_memory_view_release(rb_memory_view_t* view) rb_memory_view_release(rb_memory_view_t* view)
{ {
VALUE klass = CLASS_OF(view->obj); const rb_memory_view_entry_t *entry = view->_memory_view_entry;
const rb_memory_view_entry_t *entry = lookup_memory_view_entry(klass);
if (entry) { if (entry) {
bool rv = true; bool rv = true;
if (entry->release_func) { if (entry->release_func) {