Hi,

the attached patch wraps ckWARN_d around the Perl_warn calls in
threads.xs so that these default warnings can be switched off using "no
warnings 'threads'" or the -X switch. Also included the corresponding
changes to perldiag.pod.

I wasn't quite sure what to do with

    Perl_warn(aTHX_ "CLONE %" SVf,obj);

For now I added ckWARN_d there, too. But I think a real and descriptive
warning message is needed there, something like "Attempt to clone
non-thread object" or so. Then again, I am not even sure this warning is
ever emitted.

Cheers,
Tassilo
-- 
use bigint;
$n=71423350343770280161397026330337371139054411854220053437565440;
$m=-8,;;$_=$n&(0xff)<<$m,,$_>>=$m,,print+chr,,while(($m+=8)<=200);
--- perl-current/ext/threads/threads.xs~        2005-08-07 06:48:14.000000000 
+0200
+++ perl-current/ext/threads/threads.xs 2005-08-07 06:52:15.000000000 +0200
@@ -168,8 +168,9 @@ Perl_ithread_hook(pTHX)
     int veto_cleanup = 0;
     MUTEX_LOCK(&create_destruct_mutex);
     if (aTHX == PL_curinterp && active_threads != 1) {
-       Perl_warn(aTHX_ "A thread exited while %" IVdf " threads were running",
-                                               (IV)active_threads);
+       if (ckWARN_d(WARN_THREADS))
+           Perl_warn(aTHX_ "A thread exited while %" IVdf " threads were 
running",
+                                                     (IV)active_threads);
        veto_cleanup = 1;
     }
     MUTEX_UNLOCK(&create_destruct_mutex);
@@ -304,7 +305,7 @@ Perl_ithread_run(void * arg) {
                  SV *sv = POPs;
                  av_store(params, i, SvREFCNT_inc(sv));
                }
-               if (SvTRUE(ERRSV)) {
+               if (SvTRUE(ERRSV) && ckWARN_d(WARN_THREADS)) {
                    Perl_warn(aTHX_ "thread failed to start: %" SVf, ERRSV);
                }
                FREETMPS;
@@ -566,14 +567,12 @@ Perl_ithread_self (pTHX_ SV *obj, char* 
 void
 Perl_ithread_CLONE(pTHX_ SV *obj)
 {
- if (SvROK(obj))
-  {
-   ithread *thread = SV_to_ithread(aTHX_ obj);
-  }
- else
-  {
-   Perl_warn(aTHX_ "CLONE %" SVf,obj);
-  }
+    if (SvROK(obj)) {
+       ithread *thread = SV_to_ithread(aTHX_ obj);
+    }
+    else if (ckWARN_d(WARN_THREADS)) {
+       Perl_warn(aTHX_ "CLONE %" SVf,obj);
+    }
 }
 
 AV*
--- perl-current/ext/threads/threads.pm~        2005-08-07 07:07:12.000000000 
+0200
+++ perl-current/ext/threads/threads.pm 2005-08-07 07:07:39.000000000 +0200
@@ -50,7 +50,7 @@ our @EXPORT_OK = ( @{ $EXPORT_TAGS{'all'
 our @EXPORT = qw(
 async  
 );
-our $VERSION = '1.06';
+our $VERSION = '1.07';
 
 
 # || 0 to ensure compatibility with previous versions
--- perl-current/pod/perldiag.pod~      2005-08-07 06:52:24.000000000 +0200
+++ perl-current/pod/perldiag.pod       2005-08-07 06:54:01.000000000 +0200
@@ -193,7 +193,7 @@ know which context to supply to the righ
 
 =item A thread exited while %d threads were running
 
-(W) When using threaded Perl, a thread (not necessarily the main
+(W threads)(S) When using threaded Perl, a thread (not necessarily the main
 thread) exited while there were still other threads running.
 Usually it's a good idea to first collect the return values of the
 created threads by joining them, and only then exit from the main
@@ -3875,7 +3875,7 @@ target of the change to
 
 =item thread failed to start: %s
 
-(S) The entry point function of threads->create() failed for some reason.
+(W threads)(S) The entry point function of threads->create() failed for some 
reason.
 
 =item times not implemented
 

Reply via email to