From 4de7ff82b202dbef8c57954126932710fe1a82bd Mon Sep 17 00:00:00 2001 From: dakkar Date: Thu, 6 Aug 2009 15:15:03 +0200 Subject: AnyEvent (untested), method rename, proper structure --- Makefile.PL | 17 +++++++++++ lib/Thread/Queue/Event/AnyEvent.pm | 17 +++++++++++ lib/Thread/Queue/Event/Glib.pm | 2 +- t/01-glib.t | 60 ++++++++++++++++++++++++++++++++++++++ thr.pl | 60 -------------------------------------- 5 files changed, 95 insertions(+), 61 deletions(-) create mode 100644 Makefile.PL create mode 100644 lib/Thread/Queue/Event/AnyEvent.pm create mode 100644 t/01-glib.t delete mode 100644 thr.pl diff --git a/Makefile.PL b/Makefile.PL new file mode 100644 index 0000000..5aa2d49 --- /dev/null +++ b/Makefile.PL @@ -0,0 +1,17 @@ +use inc::Module::Install; + +name 'Thread-Queue-Event'; +license 'perl'; +all_from 'lib/Thread/Queue/Event.pm'; + +requires 'Thread::Queue' => 0, + 'Moose' => 0, + 'Class::MOP' => 0, + 'perl' => '5.8.0', +; + +test_requires 'Test::Most' => 0, + 'Glib' => 0, +; + +WriteAll; diff --git a/lib/Thread/Queue/Event/AnyEvent.pm b/lib/Thread/Queue/Event/AnyEvent.pm new file mode 100644 index 0000000..1435708 --- /dev/null +++ b/lib/Thread/Queue/Event/AnyEvent.pm @@ -0,0 +1,17 @@ +package Thread::Queue::Event::AnyEvent; +use Moose::Role; +use AnyEvent; + +requires 'event_fh'; + +sub callback { + my ($self,$sub)=@_; + + AnyEvent->io( + fh => $self->event_fh, + poll=>'r', + cb => $sub); +} + +no Moose; +1; diff --git a/lib/Thread/Queue/Event/Glib.pm b/lib/Thread/Queue/Event/Glib.pm index 1c36c99..ed97efa 100644 --- a/lib/Thread/Queue/Event/Glib.pm +++ b/lib/Thread/Queue/Event/Glib.pm @@ -4,7 +4,7 @@ use Glib; requires 'event_fileno'; -sub add_watch { +sub callback { my ($self,$sub)=@_; Glib::IO->add_watch($self->event_fileno,'in',$sub); diff --git a/t/01-glib.t b/t/01-glib.t new file mode 100644 index 0000000..491e4b3 --- /dev/null +++ b/t/01-glib.t @@ -0,0 +1,60 @@ +#!/usr/bin/perl +use strict; +use warnings; +use threads; +use Glib; +use Thread::Queue::Event; +use Thread::Queue::Event::Glib; + +=head1 Signaling across threads to a Glib loop + +Looks like the best way is to use a pipe + +=cut + +my $q=Thread::Queue::Event->new()->with_role('Glib'); +my $q2=Thread::Queue::Event->new(); + +threads->create( + sub{ + print "(1) sleeping\n"; + sleep 2; + print "(1) sending boo\n"; + $q->enqueue('boo'); + sleep 2; + threads->create( + sub{ + print "(2) inserting bar & foo\n"; + $q->insert(0,'bar'); + $q->insert(1,'foo'); + print "(2) signaling\n"; + $q->signal(); + print "(2) signaling\n"; + $q->signal(); + }); + sleep 2; + print "(1) waiting for command\n"; + my $cmd=$q2->dequeue; + print "(1) got $cmd\n"; + print "(1) sending quit"; + $q->enqueue('quit'); +}); + +my $loop=Glib::MainLoop->new(); +$q->callback(sub{ + print "(m) waking up\n"; + my $foo=$q->dequeue(); + print "(m) got $foo\n"; + if ($foo eq 'quit') { + print "(m) quitting\n"; + $loop->quit; + } + elsif ($foo eq 'foo') { + print "(m) sending command\n"; + $q2->enqueue('the command'); + print "(m) sent command\n"; + } + return Glib::SOURCE_CONTINUE; + }, + ); +$loop->run; diff --git a/thr.pl b/thr.pl deleted file mode 100644 index a2e1386..0000000 --- a/thr.pl +++ /dev/null @@ -1,60 +0,0 @@ -#!/usr/bin/perl -use strict; -use warnings; -use threads; -use Glib; -use Thread::Queue::Event; -use Thread::Queue::Event::Glib; - -=head1 Signaling across threads to a Glib loop - -Looks like the best way is to use a pipe - -=cut - -my $q=Thread::Queue::Event->new()->with_role('Glib'); -my $q2=Thread::Queue::Event->new(); - -threads->create( - sub{ - print "(1) sleeping\n"; - sleep 2; - print "(1) sending boo\n"; - $q->enqueue('boo'); - sleep 2; - threads->create( - sub{ - print "(2) inserting bar & foo\n"; - $q->insert(0,'bar'); - $q->insert(1,'foo'); - print "(2) signaling\n"; - $q->signal(); - print "(2) signaling\n"; - $q->signal(); - }); - sleep 2; - print "(1) waiting for command\n"; - my $cmd=$q2->dequeue; - print "(1) got $cmd\n"; - print "(1) sending quit"; - $q->enqueue('quit'); -}); - -my $loop=Glib::MainLoop->new(); -$q->add_watch(sub{ - print "(m) waking up\n"; - my $foo=$q->dequeue(); - print "(m) got $foo\n"; - if ($foo eq 'quit') { - print "(m) quitting\n"; - $loop->quit; - } - elsif ($foo eq 'foo') { - print "(m) sending command\n"; - $q2->enqueue('the command'); - print "(m) sent command\n"; - } - return Glib::SOURCE_CONTINUE; - }, - ); -$loop->run; -- cgit v1.2.3