From fc2e454e91daec9854302431f48b31f2181d03c9 Mon Sep 17 00:00:00 2001 From: dakkar Date: Thu, 6 Aug 2009 14:49:44 +0200 Subject: refactor to roles --- Queue.pm | 76 -------------------------------------- lib/Thread/Queue/Event.pm | 84 ++++++++++++++++++++++++++++++++++++++++++ lib/Thread/Queue/Event/Glib.pm | 14 +++++++ thr.pl | 7 ++-- 4 files changed, 102 insertions(+), 79 deletions(-) delete mode 100644 Queue.pm create mode 100644 lib/Thread/Queue/Event.pm create mode 100644 lib/Thread/Queue/Event/Glib.pm diff --git a/Queue.pm b/Queue.pm deleted file mode 100644 index cd978e5..0000000 --- a/Queue.pm +++ /dev/null @@ -1,76 +0,0 @@ -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(); -} - -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 add_watch { - my ($self,$sub)=@_; - - Glib::IO->add_watch($self->event_fileno,'in',$sub); -} - -sub signal { - my ($self)=@_; - - croak "Not signaling on an empty queue, would block" - unless $self->pending; - - $self->_pipe_write(); -} - -no Moose; -1; 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; diff --git a/thr.pl b/thr.pl index 4831f29..a2e1386 100644 --- a/thr.pl +++ b/thr.pl @@ -3,7 +3,8 @@ use strict; use warnings; use threads; use Glib; -use Queue; +use Thread::Queue::Event; +use Thread::Queue::Event::Glib; =head1 Signaling across threads to a Glib loop @@ -11,8 +12,8 @@ Looks like the best way is to use a pipe =cut -my $q=Glib::Thread::Queue->new(); -my $q2=Glib::Thread::Queue->new(); +my $q=Thread::Queue::Event->new()->with_role('Glib'); +my $q2=Thread::Queue::Event->new(); threads->create( sub{ -- cgit v1.2.3