diff options
Diffstat (limited to 'memory_view.c')
| -rw-r--r-- | memory_view.c | 66 |
1 files changed, 34 insertions, 32 deletions
diff --git a/memory_view.c b/memory_view.c index a1ab240656..2de756d681 100644 --- a/memory_view.c +++ b/memory_view.c @@ -9,8 +9,8 @@ #include "internal.h" #include "internal/hash.h" #include "internal/variable.h" -#include "internal/util.h" #include "ruby/memory_view.h" +#include "ruby/util.h" #include "vm_sync.h" #if SIZEOF_INTPTR_T == SIZEOF_LONG_LONG @@ -51,21 +51,21 @@ exported_object_registry_mark(void *ptr) static void exported_object_registry_free(void *ptr) { - RB_VM_LOCK_ENTER(); - st_clear(exported_object_table); - st_free_table(exported_object_table); - exported_object_table = NULL; - RB_VM_LOCK_LEAVE(); + RB_VM_LOCKING() { + st_clear(exported_object_table); + st_free_table(exported_object_table); + exported_object_table = NULL; + } } const rb_data_type_t rb_memory_view_exported_object_registry_data_type = { "memory_view/exported_object_registry", { - exported_object_registry_mark, - exported_object_registry_free, - 0, + exported_object_registry_mark, + exported_object_registry_free, + 0, }, - 0, 0, RUBY_TYPED_FREE_IMMEDIATELY + 0, 0, RUBY_TYPED_FREE_IMMEDIATELY | RUBY_TYPED_WB_PROTECTED }; static int @@ -99,17 +99,19 @@ exported_object_dec_ref(st_data_t *key, st_data_t *val, st_data_t arg, int exist static void register_exported_object(VALUE obj) { - RB_VM_LOCK_ENTER(); - st_update(exported_object_table, (st_data_t)obj, exported_object_add_ref, 0); - RB_VM_LOCK_LEAVE(); + RB_VM_LOCKING() { + st_update(exported_object_table, (st_data_t)obj, exported_object_add_ref, 0); + RB_OBJ_WRITTEN(rb_memory_view_exported_object_registry, Qundef, obj); + } } 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); - RB_VM_LOCK_LEAVE(); + RB_VM_LOCKING() { + if (exported_object_table) + st_update(exported_object_table, (st_data_t)obj, exported_object_dec_ref, 0); + } } // MemoryView @@ -119,16 +121,17 @@ static ID id_memory_view; static const rb_data_type_t memory_view_entry_data_type = { "memory_view/entry", { - 0, - 0, - 0, + 0, + 0, + 0, }, 0, 0, RUBY_TYPED_FREE_IMMEDIATELY }; /* Register memory view functions for the given class */ bool -rb_memory_view_register(VALUE klass, const rb_memory_view_entry_t *entry) { +rb_memory_view_register(VALUE klass, const rb_memory_view_entry_t *entry) +{ Check_Type(klass, T_CLASS); VALUE entry_obj = rb_ivar_lookup(klass, id_memory_view, Qnil); if (! NIL_P(entry_obj)) { @@ -209,7 +212,7 @@ rb_memory_view_init_as_byte_array(rb_memory_view_t *view, VALUE obj, void *data, view->shape = NULL; view->strides = NULL; view->sub_offsets = NULL; - *((void **)&view->private) = NULL; + view->private_data = NULL; return true; } @@ -372,7 +375,8 @@ get_format_size(const char *format, bool *native_p, ssize_t *alignment, endianne } static inline ssize_t -calculate_padding(ssize_t total, ssize_t alignment_size) { +calculate_padding(ssize_t total, ssize_t alignment_size) +{ if (alignment_size > 1) { ssize_t res = total % alignment_size; if (res > 0) { @@ -396,7 +400,7 @@ rb_memory_view_parse_item_format(const char *format, ssize_t max_alignment_size = 0; const char *p = format; - if (*p == '|') { // alginment specifier + if (*p == '|') { // alignment specifier alignment = true; ++format; ++p; @@ -671,7 +675,7 @@ extract_item_member(const uint8_t *ptr, const rb_memory_view_item_component_t *m return LL2NUM(val.ll); } else { -#if SIZEOF_INT64_t == SIZEOF_LONG +#if SIZEOF_INT64_T == SIZEOF_LONG return LONG2NUM(val.i64); #else return LL2NUM(val.i64); @@ -683,7 +687,7 @@ extract_item_member(const uint8_t *ptr, const rb_memory_view_item_component_t *m return ULL2NUM(val.ull); } else { -#if SIZEOF_UINT64_t == SIZEOF_LONG +#if SIZEOF_UINT64_T == SIZEOF_LONG return ULONG2NUM(val.u64); #else return ULL2NUM(val.u64); @@ -781,7 +785,7 @@ lookup_memory_view_entry(VALUE klass) { VALUE entry_obj = rb_ivar_lookup(klass, id_memory_view, Qnil); while (NIL_P(entry_obj)) { - klass = rb_class_get_superclass(klass); + klass = rb_class_superclass(klass); if (klass == rb_cBasicObject || klass == rb_cObject) return NULL; @@ -820,6 +824,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; @@ -832,8 +837,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) { @@ -842,9 +846,7 @@ rb_memory_view_release(rb_memory_view_t* view) if (rv) { unregister_exported_object(view->obj); view->obj = Qnil; - if (view->item_desc.components) { - xfree((void *)view->item_desc.components); - } + SIZED_FREE_N((rb_memory_view_item_component_t *)view->item_desc.components, view->item_desc.length); } return rv; } @@ -862,7 +864,7 @@ Init_MemoryView(void) VALUE obj = TypedData_Wrap_Struct( 0, &rb_memory_view_exported_object_registry_data_type, exported_object_table); - rb_gc_register_mark_object(obj); + rb_vm_register_global_object(obj); rb_memory_view_exported_object_registry = obj; id_memory_view = rb_intern_const("__memory_view__"); |
