unofficial mirror of notmuch@notmuchmail.org
 help / color / mirror / code / Atom feed
From: Felipe Contreras <felipe.contreras@gmail.com>
To: notmuch@notmuchmail.org
Cc: Tomi Ollila <tomi.ollila@iki.fi>
Subject: [PATCH 0/2] ruby: enable garbage collection
Date: Mon, 17 May 2021 14:39:13 -0500	[thread overview]
Message-ID: <20210517193915.1220114-1-felipe.contreras@gmail.com> (raw)

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

             reply	other threads:[~2021-05-17 19:39 UTC|newest]

Thread overview: 15+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2021-05-17 19:39 Felipe Contreras [this message]
2021-05-17 19:39 ` [PATCH 1/2] ruby: create an actual wrapper struct Felipe Contreras
2021-07-18 22:58   ` David Bremner
2021-05-17 19:39 ` [PATCH 2/2] ruby: enable garbage collection using talloc Felipe Contreras
2021-06-11  0:46   ` David Bremner
2021-06-11  8:54     ` David Bremner
2021-06-26 19:07       ` Felipe Contreras
2021-06-26 19:54         ` David Bremner
2021-06-26 20:05           ` Felipe Contreras
2021-06-26 18:56     ` Felipe Contreras
2021-06-26 19:56       ` David Bremner
2021-05-22 10:49 ` [PATCH 0/2] ruby: enable garbage collection David Bremner
2021-05-28  3:10   ` Felipe Contreras
2021-06-26 20:07 ` [PATCH] perf-test: add ruby test Felipe Contreras
2021-07-18 22:54   ` David Bremner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

  List information: https://notmuchmail.org/

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=20210517193915.1220114-1-felipe.contreras@gmail.com \
    --to=felipe.contreras@gmail.com \
    --cc=notmuch@notmuchmail.org \
    --cc=tomi.ollila@iki.fi \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
Code repositories for project(s) associated with this public inbox

	https://yhetil.org/notmuch.git/

This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).