From fc2e454e91daec9854302431f48b31f2181d03c9 Mon Sep 17 00:00:00 2001 From: dakkar Date: Thu, 6 Aug 2009 14:49:44 +0200 Subject: refactor to roles --- lib/Thread/Queue/Event.pm | 84 +++++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 84 insertions(+) create mode 100644 lib/Thread/Queue/Event.pm (limited to 'lib/Thread/Queue/Event.pm') diff --git a/lib/Thread/Queue/Event.pm b/lib/Thread/Queue/Event.pm new file mode 100644 index 0000000..3d82c4d --- /dev/null +++ b/lib/Thread/Queue/Event.pm @@ -0,0 +1,84 @@ +package Thread::Queue::Event; +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(); +} + +sub _pipe_write { + return syswrite $_[0]->pipes->[1],'0'; +} + +sub _pipe_read { + my $foo;sysread $_[0]->pipes->[0],$foo,1; + return $foo; +} + +sub event_fh { + return $_[0]->pipes->[0]; +} + +sub event_fileno { + return fileno($_[0]->event_fh); +} + +after enqueue => \&_pipe_write; + +before dequeue => \&_pipe_read; + +sub signal { + my ($self)=@_; + + croak "Not signaling on an empty queue, would block" + unless $self->pending; + + $self->_pipe_write(); +} + +sub with_role { + my ($self,$role)=@_; + + if ($role !~ /::/) { + $role="Thread::Queue::Event::$role"; + } + + Class::MOP::load_class($role); + + $role->meta->apply($self); + + return $self; +} + +no Moose; +1; -- cgit v1.2.3