From f747336ecc953fd9f0339e74fd1e245bc6278b06 Mon Sep 17 00:00:00 2001 From: dakkar Date: Wed, 5 Aug 2009 15:34:52 +0200 Subject: first draft --- Queue.pm | 65 ++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 65 insertions(+) create mode 100644 Queue.pm (limited to 'Queue.pm') diff --git a/Queue.pm b/Queue.pm new file mode 100644 index 0000000..bf83a0d --- /dev/null +++ b/Queue.pm @@ -0,0 +1,65 @@ +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; -- cgit v1.2.3