in reply to Re^2: Shared variables between threads
in thread Shared variables between threads

From that it seems that you are receiving a bless scalar reference. Older versions of threads shared did not allow you to assign bless references (objects) to shared variables for technical reasons.

A recent change by jdhedden alleviated this restriction, but (unless you've already done so) you will need to download the latest versions from CPAN to be able to do this:

print $threads::VERSION, $threads::shared::VERSION;; 1.67 1.14

Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
"Science is about questioning the status quo. Questioning authority".
In the absence of evidence, opinion is indistinguishable from prejudice.
"Too many [] have been sedated by an oppressive environment of political correctness and risk aversion."

Replies are listed 'Best First'.
Re^4: Shared variables between threads
by Saladino (Beadle) on Nov 05, 2007 at 10:36 UTC
    I have updated my threads and threads::shared packages but no way.
    threads version -> 1.67 threads::shared version -> 1.14 Invalid value for shared scalar at RTP_media.pl line 23.
    lines 22-23
    my $capobj:shared; $capobj = Net::Pcap::open_live($dev,1024,0,0,\$err);

      You will need to threads::shared::share it before you'll be able to assign it to a shared variable.

      #! perl -slw use strict; use threads; use threads::shared; print "threads: $threads::VERSION threads::shared:$threads::shared::VE +RSION"; { my $scalar = 0xdeadbeef; my $blessed = bless \$scalar, 'main'; print 'Scalar: ', $blessed; my $shared :shared = &share( $blessed ); print 'Scalar: ', $shared; } __END__ C:\test>t-blessed.pl threads: 1.67 threads::shared:1.14 Scalar: main=SCALAR(0x1824624) Scalar: main=SCALAR(0x1824624)

      For your case that should look something like:

      my $capobj:shared; $capobj = &share( Net::Pcap::open_live($dev,1024,0,0,\$err) );

      Or just

      my $capobj:shared = &share( Net::Pcap::open_live($dev,1024,0,0,\$err) +);

      The ampasand on &share() is necessary to defeat the prototype.


      Examine what is said, not who speaks -- Silence betokens consent -- Love the truth but pardon error.
      "Science is about questioning the status quo. Questioning authority".
      In the absence of evidence, opinion is indistinguishable from prejudice.
        Am I doing something wrong? Here is a full script and its output.
        #!/usr/bin/perl use strict; use warnings; use threads; use threads::shared; use Net::Pcap; my $err; my $dev = Net::Pcap::lookupdev(\&err); my ($address,$netmask); Net::Pcap::lookupnet($dev,\$address,\$netmask,\$err); my $filter; print "threads version -> ".$threads::VERSION." threads::shared versio +n -> ".$threads::shared::VERSION."\n"; my $capobj:shared = &share(Net::Pcap::open_live($dev,1024,0,0,\$err)) +; print "shared $capobj\n"; my $capthread = threads->new(\&capture); sleep 5; Net::Pcap::breakloop($capobj); print "$capobj breakloop\n"; $capthread->join(); print "Capture thread finalized\n"; sub capture { print "capture->$capobj\n"; Net::Pcap::compile($capobj,\$filter,'host XX.XX.XX.XX && port +7777 && udp',1,$netmask); Net::Pcap::setfilter($capobj,$filter); Net::Pcap::loop($capobj,0,\&capture_callback, 0); print "Outside the loop\n"; Net::Pcap::close($capobj); } sub capture_callback { }
        And the output:
        $perl test3.pl threads version -> 1.67 threads::shared version -> 1.14 shared pcap_tPtr=SCALAR(0x8ee08f8) capture->pcap_tPtr=SCALAR(0x8f223b4)