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;