summaryrefslogtreecommitdiffstats
path: root/bindings
diff options
context:
space:
mode:
authorFelipe Contreras <felipe.contreras@gmail.com>2021-05-17 14:39:15 -0500
committerDavid Bremner <david@tethera.net>2021-07-18 17:08:53 -0300
commit1a7f9fe055fb40b9646bb8efac107601009723bd (patch)
treed404fe8d5c7fe92c18db56f63a2a53ab1ea6d76f /bindings
parent02b162116079a0b2e35823e5590a82056d22c8af (diff)
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>
Diffstat (limited to 'bindings')
-rw-r--r--bindings/ruby/database.c2
-rw-r--r--bindings/ruby/defs.h11
-rw-r--r--bindings/ruby/extconf.rb1
3 files changed, 9 insertions, 5 deletions
diff --git a/bindings/ruby/database.c b/bindings/ruby/database.c
index 0159aaac..1cf4e4e2 100644
--- a/bindings/ruby/database.c
+++ b/bindings/ruby/database.c
@@ -81,7 +81,7 @@ notmuch_rb_database_initialize (int argc, VALUE *argv, VALUE self)
ret = notmuch_database_open (path, mode, &database);
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;
}
diff --git a/bindings/ruby/defs.h b/bindings/ruby/defs.h
index 7ddb5df5..0f39f2d0 100644
--- a/bindings/ruby/defs.h
+++ b/bindings/ruby/defs.h
@@ -23,6 +23,7 @@
#include <notmuch.h>
#include <ruby.h>
+#include <talloc.h>
extern VALUE notmuch_rb_cDatabase;
extern VALUE notmuch_rb_cDirectory;
@@ -83,7 +84,7 @@ extern const rb_data_type_t notmuch_rb_tags_type;
} while (0)
#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) \
Data_Get_Notmuch_Object ((obj), &notmuch_rb_database_type, (ptr))
@@ -117,20 +118,22 @@ typedef struct {
} notmuch_rb_object_t;
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))
return NULL;
rb_wrapper->nm_object = nm_object;
+ talloc_steal (rb_wrapper, nm_object);
return rb_wrapper;
}
static inline void
notmuch_rb_object_free (void *rb_wrapper)
{
- free (rb_wrapper);
+ talloc_free (rb_wrapper);
}
static inline notmuch_status_t
diff --git a/bindings/ruby/extconf.rb b/bindings/ruby/extconf.rb
index 161de5a2..d914537c 100644
--- a/bindings/ruby/extconf.rb
+++ b/bindings/ruby/extconf.rb
@@ -19,6 +19,7 @@ if not ENV['LIBNOTMUCH']
end
$LOCAL_LIBS += ENV['LIBNOTMUCH']
+$LIBS += " -ltalloc"
# Create Makefile
dir_config('notmuch')