diff options
author | dakkar <dakkar@sardina.(none)> | 2009-08-06 14:49:44 +0200 |
---|---|---|
committer | dakkar <dakkar@sardina.(none)> | 2009-08-06 14:50:29 +0200 |
commit | fc2e454e91daec9854302431f48b31f2181d03c9 (patch) | |
tree | ed6a0867152a4be8f9b26dc6fd1cbbe49563cd40 /lib/Thread/Queue | |
parent | refactor and expose more methods (diff) | |
download | Thread-Queue-Event-fc2e454e91daec9854302431f48b31f2181d03c9.tar.gz Thread-Queue-Event-fc2e454e91daec9854302431f48b31f2181d03c9.tar.bz2 Thread-Queue-Event-fc2e454e91daec9854302431f48b31f2181d03c9.zip |
refactor to roles
Diffstat (limited to 'lib/Thread/Queue')
-rw-r--r-- | lib/Thread/Queue/Event.pm | 84 | ||||
-rw-r--r-- | lib/Thread/Queue/Event/Glib.pm | 14 |
2 files changed, 98 insertions, 0 deletions
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; diff --git a/lib/Thread/Queue/Event/Glib.pm b/lib/Thread/Queue/Event/Glib.pm new file mode 100644 index 0000000..1c36c99 --- /dev/null +++ b/lib/Thread/Queue/Event/Glib.pm @@ -0,0 +1,14 @@ +package Thread::Queue::Event::Glib; +use Moose::Role; +use Glib; + +requires 'event_fileno'; + +sub add_watch { + my ($self,$sub)=@_; + + Glib::IO->add_watch($self->event_fileno,'in',$sub); +} + +no Moose; +1; |