On Fri, Oct 21, 2011 at 06:44:50AM +0000, YangXi wrote:
> I've got a more nasty idea: all I need is refcount and garbage collection,
> so I can just embed an perl HV inside my object, and use the reference count
> of that HV.  Woo! Too ugly!

Haha, this is a technique that we use in Clownfish, the object model used by
Apache Lucy (which is C rather than C++, but needs to solve similar problems).

Your C++ refcount manipulation methods will need to wrap invocations of
SvREFCNT_dec(), SvREFCNT_inc(), and SvREFCNT(), and you need an XS DESTROY
method which invokes the C++ destructor.  

The key is, as you have surmised, maintaining a unified refcount for the
combination of a Perl object and a C++ object which point to each other.

Here's the code which implements our refcount manipulation routines:

    
http://svn.apache.org/repos/asf/incubator/lucy/trunk/perl/xs/Lucy/Object/Obj.c

And here's a thread on the Lucy developer's list where the design was
discussed:

    http://lucy.markmail.org/message/jkst23okksyynzss

Our code is probably more complex than than yours will be because we lazily
create the Perl object only when the refcount reaches 4 or it's needed because
access has been requested from Perl-space.  We also use only the inner portion
of a Perl blessed scalar, avoiding the outer RV.

Marvin Humphrey

Reply via email to