Subject: | Add CLONE and CLONE_SKIP to default list of private functions |
As of Perl 5.8, the special CLONE method is used to allow package a hook
into the thread-cloning process or CLONE_SKIP to avoid cloning. From
perlmod ( http://perldoc.perl.org/perlmod.html ):
Show quoted text
> Since 5.6.0, Perl has had support for a new type of threads called
> interpreter threads (ithreads). These threads can be used explicitly and
> implicitly.
>
> Ithreads work by cloning the data tree so that no data is shared between
> different threads. These threads can be used by using the threads module
> or by doing fork() on win32 (fake fork() support). When a thread is
> cloned all Perl data is cloned, however non-Perl data cannot be cloned
> automatically. Perl after 5.7.2 has support for the CLONE special
> subroutine. In CLONE you can do whatever you need to do, like for
> example handle the cloning of non-Perl data, if necessary. CLONE will be
> called once as a class method for every package that has it defined (or
> inherits it). It will be called in the context of the new thread, so all
> modifications are made in the new area. Currently CLONE is called with
> no parameters other than the invocant package name, but code should not
> assume that this will remain unchanged, as it is likely that in future
> extra parameters will be passed in to give more information about the
> state of cloning.
>
> If you want to CLONE all objects you will need to keep track of them per
> package. This is simply done using a hash and Scalar::Util::weaken().
>
> Perl after 5.8.7 has support for the CLONE_SKIP special subroutine. Like
> CLONE , CLONE_SKIP is called once per package; however, it is called
> just before cloning starts, and in the context of the parent thread. If
> it returns a true value, then no objects of that class will be cloned;
> or rather, they will be copied as unblessed, undef values. This provides
> a simple mechanism for making a module threadsafe; just add sub
> CLONE_SKIP { 1 } at the top of the class, and DESTROY() will be now only
> be called once per object. Of course, if the child thread needs to make
> use of the objects, then a more sophisticated approach is needed.
>
> Like CLONE , CLONE_SKIP is currently called with no parameters other
> than the invocant package name, although that may change. Similarly, to
> allow for future expansion, the return value should be a single 0 or 1
> value.