Ruby is a gc language, we shouldn't be doing workaround to free memory when Ruby is perfectly capable of doing so.
The problem is that talloc wants to be smart, and Ruby and talloc both fight to free memory. We can let Ruby win by stealing all the objects from talloc control. Thanks to the previous cleanup patches it's now possible to easily do this. In order to test this series I've used the following script: require 'notmuch' $db = Notmuch::Database.new(ENV['HOME'] + '/mail') $do_destroy = true while true query = $db.query('') threads = query.search_threads threads.each do |thread| puts '%s: %s' % [thread.thread_id, thread.subject] thread.destroy! if $do_destroy end threads.destroy! if $do_destroy query.destroy! if $do_destroy end $db.close All threads from the database are fetched over and over with no significant increase in memory. The old method of destroying objects with destroy! still works, but now it's not necessary. I tried other methods, like increasing the reference counter and adding a second parent to talloc objects, but for some reason they didn't work. I investiged why but couldn't reach any conclussion. On the other hand the talloc_steal approach works perfectly fine. Felipe Contreras (2): ruby: create an actual wrapper struct ruby: enable garbage collection using talloc bindings/ruby/database.c | 2 +- bindings/ruby/defs.h | 42 +++++++++++++++++++++++++++++++++++----- bindings/ruby/extconf.rb | 1 + bindings/ruby/init.c | 6 ++++++ 4 files changed, 45 insertions(+), 6 deletions(-) -- 2.31.1 _______________________________________________ notmuch mailing list -- notmuch@notmuchmail.org To unsubscribe send an email to notmuch-le...@notmuchmail.org