summaryrefslogtreecommitdiff
path: root/Queue.pm
blob: bf83a0dc0e41d50b386f91d2e9c028814619b88d (plain)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
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;