ruby: enable garbage collection using talloc

We basically steal all the objects from their notmuch parents, therefore
they are completely under Ruby's gc control.

The order at which these objects are freed does not matter any more,
because destroying the database does not destroy all the children
objects, since they belong to Ruby now.

Signed-off-by: Felipe Contreras <felipe.contreras@gmail.com>
This commit is contained in:
Felipe Contreras 2021-05-17 14:39:15 -05:00 committed by David Bremner
parent 02b1621160
commit 1a7f9fe055
3 changed files with 9 additions and 5 deletions

View file

@ -81,7 +81,7 @@ notmuch_rb_database_initialize (int argc, VALUE *argv, VALUE self)
ret = notmuch_database_open (path, mode, &database); ret = notmuch_database_open (path, mode, &database);
notmuch_rb_status_raise (ret); notmuch_rb_status_raise (ret);
DATA_PTR (self) = notmuch_rb_object_create (database); DATA_PTR (self) = notmuch_rb_object_create (database, "notmuch_rb_database");
return self; return self;
} }

View file

@ -23,6 +23,7 @@
#include <notmuch.h> #include <notmuch.h>
#include <ruby.h> #include <ruby.h>
#include <talloc.h>
extern VALUE notmuch_rb_cDatabase; extern VALUE notmuch_rb_cDatabase;
extern VALUE notmuch_rb_cDirectory; extern VALUE notmuch_rb_cDirectory;
@ -83,7 +84,7 @@ extern const rb_data_type_t notmuch_rb_tags_type;
} while (0) } while (0)
#define Data_Wrap_Notmuch_Object(klass, type, ptr) \ #define Data_Wrap_Notmuch_Object(klass, type, ptr) \
TypedData_Wrap_Struct ((klass), (type), notmuch_rb_object_create ((ptr))) TypedData_Wrap_Struct ((klass), (type), notmuch_rb_object_create ((ptr), "notmuch_rb_object: " __location__))
#define Data_Get_Notmuch_Database(obj, ptr) \ #define Data_Get_Notmuch_Database(obj, ptr) \
Data_Get_Notmuch_Object ((obj), &notmuch_rb_database_type, (ptr)) Data_Get_Notmuch_Object ((obj), &notmuch_rb_database_type, (ptr))
@ -117,20 +118,22 @@ typedef struct {
} notmuch_rb_object_t; } notmuch_rb_object_t;
static inline void * static inline void *
notmuch_rb_object_create (void *nm_object) notmuch_rb_object_create (void *nm_object, const char *name)
{ {
notmuch_rb_object_t *rb_wrapper = malloc (sizeof (*rb_wrapper)); notmuch_rb_object_t *rb_wrapper = talloc_named_const (NULL, sizeof (*rb_wrapper), name);
if (RB_UNLIKELY (!rb_wrapper)) if (RB_UNLIKELY (!rb_wrapper))
return NULL; return NULL;
rb_wrapper->nm_object = nm_object; rb_wrapper->nm_object = nm_object;
talloc_steal (rb_wrapper, nm_object);
return rb_wrapper; return rb_wrapper;
} }
static inline void static inline void
notmuch_rb_object_free (void *rb_wrapper) notmuch_rb_object_free (void *rb_wrapper)
{ {
free (rb_wrapper); talloc_free (rb_wrapper);
} }
static inline notmuch_status_t static inline notmuch_status_t

View file

@ -19,6 +19,7 @@ if not ENV['LIBNOTMUCH']
end end
$LOCAL_LIBS += ENV['LIBNOTMUCH'] $LOCAL_LIBS += ENV['LIBNOTMUCH']
$LIBS += " -ltalloc"
# Create Makefile # Create Makefile
dir_config('notmuch') dir_config('notmuch')