On Thu, 30 Oct 2003, Elizabeth Mattijsen wrote:

> The "inventory" approach is the one that Thread::Pool uses.  But it
> may be simpler than you think:

Seen it; liked it; can't use it.  :-)

IIUC, this prevents an object from being DESTROYed in a thread other than the
one which invoked the constructor (equivalent to storing/checking the value of
threads->tid rather than our unshared, incrementing $cloned).  But this isn't
necessarily the _final_ destruction (and, besides, I might want to get rid of
an object in a thread other than the one which created it).

<digression>
Also, one can sidestep the bookkeeping by returning the object from a thread
join():

  my $orig = new TrackWithThreadPoolTechnique;
  my $copy = threads->new( sub { return $orig; } );
  # $orig and $copy will be DESTROYed in this thread; bummer

</digression>

Suppose my constructor allocates memory in XS and opens a file descriptor.  I
want the object to be useable by threads, but I can't tolerate DESTROYing it
multiple times -- even if I avoid double-free()ing the memory, the object is
ruined prematurely for other threads if I free the mem and close the fd.

(IO::File doesn't have this problem, shared or not.  The underlying fd is
closed only when the last object referring to it vanishes.  However, I think
this is done by maintaining an "fd refcount" table under the hood.)

Never mind non-shared objects for the moment; does it make sense to repeatedly
DESTROY a shared object?  The reason I share $obj is so that this thread's
$obj and that thread's $obj are the same, not copies.  Given that, I expected
the destructor to be called once, and feel like I'm kludging around with
_refcnt() and CLONE.

Would it be sensible to have DESTROY called only once in this case (or
introduce an ANNIHILO method or something)?  IIUC, that'd mean hacking
Perl_sv_clear to be sharedsv-refcount-aware (or swap in an appropriate routine
when threads::shared is used, ala Pl_lockhook).

Regards,
Mike
-- 
Michael J. Pomraning
[EMAIL PROTECTED]
http://pilcrow.madison.wi.us

Reply via email to