Re: [CAUTION] Thread-saving modules

2002-07-22 Thread Arthur Bergman

Huh,

Huh

Huh

I think I will find this is not really a threads bug, will look at it.

Arthur

On söndag, juli 21, 2002, at 08:22 , Elizabeth Mattijsen wrote:

 This may be of interest to module authors who are looking at making 
 their modules thread-safe.  This is particularly important if your 
 module has a DESTROY subroutine that actually does something, such as 
 DBI drivers.

 Because of a bug in 5.8.0, the DESTROY method will be called too many 
 times when you have created threads in a threaded environment.  The 
 extra times (by the looks, once for each thread created + once for the 
 main thread) it _is_ called, the first parameter to DESTROY is 
 defective (by the looks of it, pointing to some random item).

 Please note that this problem only exists when threads have actually 
 been created.  It does not seem to occur when you are just executing 
 your program in a Perl built with thread-support, but without actually 
 starting any threads.  But since any module can start a thread without 
 it being visible to the outside world, it _is_ something to be aware of 
 nonetheless.

 You should therefore _always_ check the validity of the first value 
 passed to DESTROY and make sure it is what you expect it to be.  If you 
 don't, you're looking at indeterminate (strange) execution errors or 
 segfaults.

 The check could be as simple as:

   return if ref($_[0]) ne 'your::class::name';

 Please note that you cannot use the isa() method, as you may not be 
 dealing with an object anymore at this stage.  So this makes it tough 
 for sub-classes.  So maybe:

   return unless ref($_[0]);

 could be enough, but as value passed to DESTROY seems to be random, it 
 _could_ conceivably be pointing to another (valid) object.


 Hope this will save some people some time as it cost me most of today 
 to figure this one out...  ;-(


 Liz





Re: [CAUTION] Thread-saving modules

2002-07-22 Thread Ken Williams


On Monday, July 22, 2002, at 04:22  AM, Elizabeth Mattijsen wrote:
 You should therefore _always_ check the validity of the first value 
 passed to DESTROY and make sure it is what you expect it to be.  If you 
 don't, you're looking at indeterminate (strange) execution errors or 
 segfaults.

 The check could be as simple as:

   return if ref($_[0]) ne 'your::class::name';

 Please note that you cannot use the isa() method, as you may not be 
 dealing with an object anymore at this stage.  So this makes it tough 
 for sub-classes.  So maybe:

   return unless ref($_[0]);

I usually just call UNIVERSAL::isa($_[0], 'your::class::name') in these 
cases.


  -Ken




Re: [CAUTION] Thread-saving modules

2002-07-22 Thread Elizabeth Mattijsen

At 04:03 AM 7/23/02 +1000, Ken Williams wrote:
   return unless ref($_[0]);
I usually just call UNIVERSAL::isa($_[0], 'your::class::name') in these cases.

That's a good tip.

I actually generalized this to:

   return unless UNIVERSAL::isa( $_[0],__PACKAGE__ );

This will be implemented in Thread::Pool 0.17...  ;-)


Liz