summaryrefslogtreecommitdiff
path: root/thr.pl
diff options
context:
space:
mode:
Diffstat (limited to 'thr.pl')
-rw-r--r--thr.pl47
1 files changed, 47 insertions, 0 deletions
diff --git a/thr.pl b/thr.pl
new file mode 100644
index 0000000..c648509
--- /dev/null
+++ b/thr.pl
@@ -0,0 +1,47 @@
+#!/usr/bin/perl
+use strict;
+use warnings;
+use threads;
+use Glib;
+use Queue;
+
+=head1 Signaling across threads to a Glib loop
+
+Looks like the best way is to use a pipe
+
+=cut
+
+my $q=Glib::Thread::Queue->new();
+
+threads->create(
+ sub{
+ print "sleeping\n";
+ sleep 2;
+ print "sending boo\n";
+ $q->enqueue('boo');
+ sleep 2;
+ print "inserting bar & foo\n";
+ $q->insert(0,'bar');
+ $q->insert(1,'foo');
+ print "signaling\n";
+ $q->signal();
+ print "signaling\n";
+ $q->signal();
+ sleep 2;
+ print "sending quit";
+ $q->enqueue('quit');
+});
+
+my $loop=Glib::MainLoop->new();
+$q->add_watch(sub{
+ print "waking up\n";
+ my $foo=$q->dequeue();
+ print "got $foo\n";
+ if ($foo eq 'quit') {
+ print "quitting\n";
+ $loop->quit;
+ }
+ return Glib::SOURCE_CONTINUE;
+ },
+ );
+$loop->run;