summaryrefslogtreecommitdiff
path: root/t/01-glib.t
diff options
context:
space:
mode:
Diffstat (limited to 't/01-glib.t')
-rw-r--r--t/01-glib.t60
1 files changed, 60 insertions, 0 deletions
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;