mirror of
https://git.notmuchmail.org/git/notmuch
synced 2024-11-21 18:38:08 +01:00
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:
parent
02b1621160
commit
1a7f9fe055
3 changed files with 9 additions and 5 deletions
|
@ -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;
|
||||||
}
|
}
|
||||||
|
|
|
@ -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), ¬much_rb_database_type, (ptr))
|
Data_Get_Notmuch_Object ((obj), ¬much_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
|
||||||
|
|
|
@ -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')
|
||||||
|
|
Loading…
Reference in a new issue