aboutsummaryrefslogtreecommitdiffhomepage
path: root/bindings/ruby/messages.c
diff options
context:
space:
mode:
authorGravatar Ali Polatel <alip@exherbo.org>2010-05-26 18:54:25 +0300
committerGravatar Ali Polatel <alip@exherbo.org>2010-06-06 09:17:47 +0300
commitc7893408bbe6904ae7da97aa203587af4ec2fac7 (patch)
tree9139c51aff243eb0fdfaac35d75c557c0f7de29e /bindings/ruby/messages.c
parent35925e6e5be58ca33d8f40f1d6ec44b4e7799713 (diff)
ruby: Kill garbage collection related cruft.
Let the user destroy objects that she wants explicitly. It's not possible to specify the order objects are garbage collected. See id:86y6f8v838.fsf@harikalardiyari.ev on ruby-talk for more information.
Diffstat (limited to 'bindings/ruby/messages.c')
-rw-r--r--bindings/ruby/messages.c55
1 files changed, 31 insertions, 24 deletions
diff --git a/bindings/ruby/messages.c b/bindings/ruby/messages.c
index 6b296b32..94b0b0da 100644
--- a/bindings/ruby/messages.c
+++ b/bindings/ruby/messages.c
@@ -20,6 +20,23 @@
#include "defs.h"
+/*
+ * call-seq: MESSAGES.destroy => nil
+ *
+ * Destroys the messages, freeing all resources allocated for it.
+ */
+VALUE
+notmuch_rb_messages_destroy(VALUE self)
+{
+ notmuch_messages_t *fnames;
+
+ Data_Get_Struct(self, notmuch_messages_t, fnames);
+
+ notmuch_messages_destroy(fnames);
+
+ return Qnil;
+}
+
/* call-seq: MESSAGES.each {|item| block } => MESSAGES
*
* Calls +block+ once for each message in +self+, passing that element as a
@@ -28,22 +45,16 @@
VALUE
notmuch_rb_messages_each(VALUE self)
{
- notmuch_rb_message_t *message;
- notmuch_rb_messages_t *messages;
- VALUE messagev;
+ notmuch_message_t *message;
+ notmuch_messages_t *messages;
- Data_Get_Struct(self, notmuch_rb_messages_t, messages);
- if (!messages->nm_messages)
+ Data_Get_Struct(self, notmuch_messages_t, messages);
+ if (!messages)
return self;
- for (; notmuch_messages_valid(messages->nm_messages);
- notmuch_messages_move_to_next(messages->nm_messages))
- {
- messagev = Data_Make_Struct(notmuch_rb_cMessage, notmuch_rb_message_t,
- notmuch_rb_message_mark, notmuch_rb_message_free, message);
- message->nm_message = notmuch_messages_get(messages->nm_messages);
- message->parent = self;
- rb_yield(messagev);
+ for (; notmuch_messages_valid(messages); notmuch_messages_move_to_next(messages)) {
+ message = notmuch_messages_get(messages);
+ rb_yield(Data_Wrap_Struct(notmuch_rb_cMessage, NULL, NULL, message));
}
return self;
@@ -57,18 +68,14 @@ notmuch_rb_messages_each(VALUE self)
VALUE
notmuch_rb_messages_collect_tags(VALUE self)
{
- notmuch_rb_tags_t *tags;
- notmuch_rb_messages_t *messages;
- VALUE tagsv;
+ notmuch_tags_t *tags;
+ notmuch_messages_t *messages;
- Data_Get_Struct(self, notmuch_rb_messages_t, messages);
+ Data_Get_Struct(self, notmuch_messages_t, messages);
- tagsv = Data_Make_Struct(notmuch_rb_cTags, notmuch_rb_tags_t,
- notmuch_rb_tags_mark, notmuch_rb_tags_free, tags);
- tags->nm_tags = notmuch_messages_collect_tags(messages->nm_messages);
- tags->parent = self;
- if (!tags->nm_tags)
- rb_raise(notmuch_rb_eMemoryError, "out of memory");
+ tags = notmuch_messages_collect_tags(messages);
+ if (!tags)
+ rb_raise(notmuch_rb_eMemoryError, "Out of memory");
- return tagsv;
+ return Data_Wrap_Struct(notmuch_rb_cTags, NULL, NULL, tags);
}