while( my $node = $Qjob->dequeue ) {
if( $node->{canBeSet} ) {
## deal with this node
}
else {
$node->{canBeSet} = 1;
$Q->enqueue( $node ); ## push back for next time.
}
}
####
sub killThread{
my $self = shift;
{ lock $self->{threadDone}; $self->{threadDone} = 1; }
return $self->{thread};
}
sub manageQueue{
my $self = shift;
while(1){
my $done;
{ lock $self->{threadDone}; $done = $self->{threadDone}; }
my $amtInQ = $queue->pending();
last if $done && $amtInQ == 0;
...
##
##
sub killThread{
$queue->enqueue( undef );
}
##
##
while( 1 ) {
my $node = $queue->dequeue;
if( !defined $node and $queue->pending ){
$queue->enqueue( undef );
next;
}
else {
last;
}
if( $node->{canBeSet} ) {
## deal with this node
}
else {
$node->{canBeSet} = 1;
$Q->enqueue( $node ); ## push back for next time.
}
}