Jerry D. Hedden wrote:

I've attached my reworked version of T::Q that I think takes
care of circular references.  Would you mind giving it a
going over?  (It passes all the currents tests in its test
suite, so I know I didn't break anything.)  Thanks.

My sample worked OK *after* I removed the Data::Dumper
print; apparently, it has some issues w/ circular
references as well (I tried setting Deepcopy and
Purity, to no avail); I suspect its due to the fact
that references to shared elements don't have the same
stringified value, so it doesn't actually look like
a circular ref.

Anyway, my updated version of the test follows.

- Dean

use strict;
use warnings;
use threads;
use threads::shared;
use Thread::Queue;
use Data::Dumper;

my $q = Thread::Queue->new();

my $x = [ { 'complex' => 'aggregate' },
        [ qw/ currently not sharable / ] ];

my $thrd = threads->create(\&receiver, $q);

$q->enqueue($x);

$thrd->join();

print "*** non-recursive OK\n";

#
#       Make it a recursive structure
#       (!!! this will choke)
#
push @$x, $x;

$thrd = threads->create(\&receiver, $q);

$q->enqueue($x);

print "*** enq'd\n";

$thrd->join();

print "*** recursive OK\n";


sub receiver {
        my $q = shift;
        print "*** starting child\n";
        my $data = $q->dequeue();
        print "*** deq'd\n";

        if ($#$data == 1) {
                print "** in child:\n", Dumper($data), "\n";
        }
        elsif (($#$data != 2) || (ref $data->[2] ne 'ARRAY')) {
                print "NOT OK: $#$data $data $data->[2]\n";
        }
        else {
                print "** in child:\n", Dumper($data->[0], $data->[1]), "\n";
        }
}


Reply via email to