summaryrefslogtreecommitdiff
path: root/ext/ffi_c/Pointer.c
diff options
context:
space:
mode:
Diffstat (limited to 'ext/ffi_c/Pointer.c')
-rw-r--r--ext/ffi_c/Pointer.c11
1 files changed, 10 insertions, 1 deletions
diff --git a/ext/ffi_c/Pointer.c b/ext/ffi_c/Pointer.c
index c926fe9..a6e8eb7 100644
--- a/ext/ffi_c/Pointer.c
+++ b/ext/ffi_c/Pointer.c
@@ -43,6 +43,7 @@ VALUE rbffi_NullPointerSingleton = Qnil;
static void ptr_release(void *data);
static void ptr_mark(void *data);
+static void ptr_compact(void *data);
static size_t ptr_memsize(const void *data);
const rb_data_type_t rbffi_pointer_data_type = { /* extern */
@@ -51,6 +52,7 @@ const rb_data_type_t rbffi_pointer_data_type = { /* extern */
.dmark = ptr_mark,
.dfree = ptr_release,
.dsize = ptr_memsize,
+ ffi_compact_callback( ptr_compact )
},
.parent = &rbffi_abstract_memory_data_type,
// IMPORTANT: WB_PROTECTED objects must only use the RB_OBJ_WRITE()
@@ -471,7 +473,14 @@ static void
ptr_mark(void *data)
{
Pointer *ptr = (Pointer *)data;
- rb_gc_mark(ptr->rbParent);
+ rb_gc_mark_movable(ptr->rbParent);
+}
+
+static void
+ptr_compact(void *data)
+{
+ Pointer *ptr = (Pointer *)data;
+ ffi_gc_location(ptr->rbParent);
}
static size_t