package Glib::Thread::Queue;
use Moose;
use Glib;
use Thread::Queue;
use Carp;
has queue => (
is => 'ro',
isa => 'Thread::Queue',
init_arg => undef,
builder => '_build_queue',
handles => [qw(
enqueue
dequeue
dequeue_nb
pending
peek
insert
extract
)],
);
has pipes => (
isa => 'ArrayRef',
is => 'ro',
builder => '_build_pipes',
);
sub _build_pipes {
my ($main,$thread);pipe($main,$thread);
return [$main,$thread];
}
sub _build_queue {
return Thread::Queue->new();
}
after enqueue => sub {
my ($self)=shift;
syswrite $self->pipes->[1],'0';
};
before dequeue => sub {
my ($self)=shift;
my $foo;sysread $self->pipes->[0],$foo,1;
};
sub add_watch {
my ($self,$sub)=@_;
Glib::IO->add_watch(fileno($self->pipes->[0]),'in',$sub);
}
sub signal {
my ($self)=@_;
croak "Not signaling on an empty queue, would block"
unless $self->pending;
syswrite $self->pipes->[1],'0';
}
no Moose;
1;