summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
-rw-r--r--include/ruby/memory_view.h12
-rw-r--r--memory_view.c7
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) {