summaryrefslogtreecommitdiff
path: root/Queue.pm
diff options
context:
space:
mode:
Diffstat (limited to 'Queue.pm')
-rw-r--r--Queue.pm65
1 files changed, 65 insertions, 0 deletions
diff --git a/Queue.pm b/Queue.pm
new file mode 100644
index 0000000..bf83a0d
--- /dev/null
+++ b/Queue.pm
@@ -0,0 +1,65 @@
+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();
+}
+
+after enqueue => sub {
+ my ($self)=shift;
+ syswrite $self->pipes->[1],'0';
+};
+
+before dequeue => sub {
+ my ($self)=shift;
+ my $foo;sysread $self->pipes->[0],$foo,1;
+};
+
+sub add_watch {
+ my ($self,$sub)=@_;
+
+ Glib::IO->add_watch(fileno($self->pipes->[0]),'in',$sub);
+}
+
+sub signal {
+ my ($self)=@_;
+
+ croak "Not signaling on an empty queue, would block"
+ unless $self->pending;
+
+ syswrite $self->pipes->[1],'0';
+}
+
+no Moose;
+1;