On Mon, Jan 30, 2012 at 12:48:32PM +0000, Dave Mitchell wrote:
> On Sun, Jan 29, 2012 at 10:06:58PM +0000, Tim Bunce wrote:
> > On Sun, Jan 29, 2012 at 06:12:50PM +0000, Dave Mitchell wrote:
> > > The code itself (see diff below) just attaches some magic to the outer CV
> > > that caches the GV of the corresponding inner method.
> > 
> > Any reason for not using the existing 'internal method attribute'
> > mechanism? _install_method() already allocates a structure and
> > attaches it the the CV using CvXSUBANY(cv).any_ptr.  You could add the
> > three elements of method_cache_t directly into dbi_ima_t.  Then, since
> > the dispatch code already has the structure pointer (ima) handy, your
> > cache code could avoid the mg_findext call and use ima->method_cache
> > directly.
> 
> Well, the original reason was that I wasn't aware of dbi_ima_t :-)
> 
> However, on further reflection, I'm not sure that would work, as
> ima->method_cache would contain reference-counted SV pointers that would
> need to be freed when the CV is freed, and be duped when the CV is cloned
> in a new thread.  But there is no specific mechanism to allow this to
> happen, so I'd have to mess with CLONE (and maintain a list of special CVs
> that need cloning), and attach magic that has a free() method to ensure
> that ima is freed when the CV is. Which is all beginning to sound rather
> complex.

*nods*

> So I'm tempted to stick with the magic approach. I could optimise
> it to assume the cache magic is always the first one (and if not, take a
> slower route that finds and then moves it to the top).

That would be neat. Thanks.

dbih_getcom2 does the first part of that when looking up DBI hande
magic. I never added the "move to the top" because I figured it would be
very rare for magic to get added to the inner hash of a DBI handle.
It seems even less likely that someone would add magic to a DBI method,
but you never know. Unless you can think of a plausible case I'd be
happy if you just added the short-cut+fallback and skipped the shuffle.

> That's also caused me to realise that my current code isn't threadsafe, as
> it it doesn't dup the cache entries. Easily fixed, though.

Ah. I scratched my head for a while looking for threadafe issues and
missed that one. I'm glad you found it.

Thanks again Dave.

Tim.

Reply via email to