I'm writing high-level rust bindings for notmuch and would like to enable encapsulation of query logic. That is, I'd like to be able to write a function that performs a (set of) query(s) and returns a (or a set of) message(s)/thread(s). I can't do this currently because the messages/threads can't outlive the query. I could use reference counting to store the query until all messages/threads have been freed but that feels messy and shouldn't, strictly speaking, be necessary. On 11-08-15, Jani Nikula wrote: > On Sat, 07 Nov 2015, Steven Allen wrote: > > This allows threads yielded from a query to outlive the query. > > We have a leaky abstraction in the interface. We don't properly define > object lifetimes and ownership, but we have slightly vague references to > them, and the users of the interface pretty much have to respect > them. We try to hide talloc and its concepts. > > I think this patch makes the situation slightly worse. > > I'd like to understand why this change is better than just holding on to > the query object. The memory saving is neglible. > > BR, > Jani. > > > > --- > > lib/notmuch.h | 11 +++++++++++ > > lib/thread.cc | 6 ++++++ > > 2 files changed, 17 insertions(+) > > > > diff --git a/lib/notmuch.h b/lib/notmuch.h > > index 310a8b8..9a2869b 100644 > > --- a/lib/notmuch.h > > +++ b/lib/notmuch.h > > @@ -1188,6 +1188,17 @@ notmuch_tags_t * > > notmuch_thread_get_tags (notmuch_thread_t *thread); > > > > /** > > + * Reparent a notmuch_thread_t object onto the database. > > + * > > + * Calling this function allows a notmuch_thread_t object to outlive its > > + * query. The query will automatically be reclaimed when the database is > > + * destroyed but if you want to free its memory before then, you should call > > + * notmuch_thread_destroy. > > + */ > > +void > > +notmuch_thread_own (notmuch_thread_t *thread); > > + > > +/** > > * Destroy a notmuch_thread_t object. > > */ > > void > > diff --git a/lib/thread.cc b/lib/thread.cc > > index 0c937d7..06fa155 100644 > > --- a/lib/thread.cc > > +++ b/lib/thread.cc > > @@ -623,3 +623,9 @@ notmuch_thread_destroy (notmuch_thread_t *thread) > > { > > talloc_free (thread); > > } > > + > > +void > > +notmuch_thread_own (notmuch_thread_t *thread) > > +{ > > + talloc_steal (thread->notmuch, thread); > > +} > > -- > > 2.6.2 > > > > _______________________________________________ > > notmuch mailing list > > notmuch@notmuchmail.org > > https://notmuchmail.org/mailman/listinfo/notmuch -- Steven Allen (310) 433-5865 ((Do Not Email ))