[sf-perl] conditional "no warnings 'threads'"

Joseph Brenner doomvox at gmail.com
Sat Aug 1 16:12:33 PDT 2020


This sort of thing works:

my $test_mode = 0;
{
   no if $test_mode, 'uninitialized';
   my $nada = undef;
   my $string = "Nothing much: $nada";
   say "$string";
}


On 8/1/20, David Christensen <dpchrist at holgerdanske.com> wrote:
> sanfrancisco-pm:
>
> I have a Linux computer:
>
> 2020-07-31 23:24:49 dpchrist at tinkywinky ~/sandbox/perl
> $ cat /etc/debian_version ; uname -a ; perl -v | head -n 3
> 9.13
> Linux tinkywinky 4.9.0-12-amd64 #1 SMP Debian 4.9.210-1+deb9u1
> (2020-06-07) x86_64 GNU/Linux
>
> This is perl 5, version 24, subversion 1 (v5.24.1) built for
> x86_64-linux-gnu-thread-multi
> (with 90 registered patches, see perl -V for more detail)
>
>
> I am working on a Perl 5 library that uses threads.  If code in a child
> thread throws an exception, I want the exception message to be printed;
> except during testing.
>
>
> I have found that:
>
>      no warnings 'threads'
>
> when placed before, and in the same block as, threads->create() will
> suppress printing of the exception message:
>
> 2020-07-31 23:43:08 dpchrist at tinkywinky ~/sandbox/perl
> $ cat thread-exception.pl
> #!perl
>
> use strict;
> use warnings;
> use threads;
>
> use Test::More;
> use Test::Exception;
>
> our $thr;
> our $test_mode;
>
> sub foo
> {
>      if ($test_mode) {
> 	no warnings 'threads';
>
> 	$thr = threads->create(
> 	    sub { die "hello, world!" }
> 	);
>      } else {
> 	$thr = threads->create(
> 	    sub { die "hello, world!" }
> 	);
>      }
> }
>
> ok foo, __FILE__ . __LINE__;				# 1
>
> is $thr->join, undef, __FILE__ . __LINE__;		# 2
>
> like $thr->error, qr/hello/, __FILE__ . __LINE__;	# 3
>
> $test_mode = 1;
>
> ok foo, __FILE__ . __LINE__;				# 4
>
> is $thr->join, undef, __FILE__ . __LINE__;		# 5
>
> like $thr->error, qr/hello/, __FILE__ . __LINE__;	# 6
>
> done_testing;
>
> 2020-07-31 23:43:11 dpchrist at tinkywinky ~/sandbox/perl
> $ perl thread-exception.pl
> Thread 1 terminated abnormally: hello, world! at thread-exception.pl
> line 23.
> ok 1 - thread-exception.pl28
> ok 2 - thread-exception.pl30
> ok 3 - thread-exception.pl32
> ok 4 - thread-exception.pl36
> ok 5 - thread-exception.pl38
> ok 6 - thread-exception.pl40
> 1..6
>
>
> I was unable to figure out how to conditionally perform "no warnings
> 'threads'" in the body of foo(), so I had to copy-and-paste the body
> into both halves of an if-else conditional and disable warnings in one
> block.  This is an ugly work-around.
>
>
> I was hoping for:
>
>      no warnings 'threads' if $test_mode;	# BAD CODE
>
>
> But, that code does not work;
>
> 2020-07-31 23:56:50 dpchrist at tinkywinky ~/sandbox/perl
> $ cat no-warnings-threads-if-1.pl
> #!perl
>
> use strict;
> use warnings;
>
> no warnings 'threads' if 1;
>
> 2020-07-31 23:56:53 dpchrist at tinkywinky ~/sandbox/perl
> $ perl no-warnings-threads-if-1.pl
> syntax error at no-warnings-threads-if-1.pl line 6, near "'threads' if"
> Execution of no-warnings-threads-if-1.pl aborted due to compilation errors.
>
>
> Any comments or suggestions?
>
>
> David
> _______________________________________________
> SanFrancisco-pm mailing list
> SanFrancisco-pm at pm.org
> https://mail.pm.org/mailman/listinfo/sanfrancisco-pm
>


More information about the SanFrancisco-pm mailing list