Quoth Ben Gamari on Sep 11 at 5:47 pm: > Sorry I've been so quiet on this recently. I've been a little under the > weather.
No worries. > On Fri, 9 Sep 2011 13:53:28 -0400, Austin Clements <amdragon at MIT.EDU> > wrote: > > Hence my suggestion that, rather than trying to emulate C-style memory > > management in bindings, bindings should create an additional talloc > > reference to the underlying objects and rather than calling > > notmuch_*_destroy during finalization, they should simply unlink this > > additional reference. > > Currently talloc's reference counting interface is hidden behind > _destroy. While this might be a fairly intrusive change, perhaps notmuch > wants to juse expose a pair of reference counting *_ref/unref functions > instead of the *_destroy. Most users would simply need to change > existing *_destroy()s to _unref()s. Furthermore, this would allow > bindings authors to easily ensure non-broken GC behavior. I think the _destroy functions are silly. They all just call talloc_free and, indeed, it would arguably be incorrect for them to do anything more (any additional cleanup should be in a talloc destructor). talloc is never explicitly mentioned in lib/notmuch.h (intentionally, I would assume) but talloc-style notions of "ownership" pervade the library documentation. IMO, the library should just admit to using talloc, rather than try to wrap all of the not-insubstantial talloc functionality a caller may need. In the language of talloc, it's very natural to express the needs of bindings in terms talloc_reference and talloc_unlink. The bindings could maintain a per-Database context and track their own ownership by adding a talloc reference from this context to each object returned from the bindings; the finalizer would simply unlink the finalized object from this context. Bindings could also use a global context (though that would obviously be awkward in Haskell without biting the unsafePerformIO bullet). Alternatively, bindings could use the NULL context, which has the advantage of not actually tracking ownership in talloc, but the disadvantage of making it harder to track down bugs (since any code can reference or unlink from NULL).