1 |
package AnyEvent::Impl::Glib; |
2 |
|
3 |
use Glib (); |
4 |
|
5 |
my $maincontext = Glib::MainContext->default; |
6 |
|
7 |
my %RWE = ( |
8 |
in => 'r', |
9 |
out => 'w', |
10 |
pri => 'e', |
11 |
); |
12 |
|
13 |
sub io { |
14 |
my ($class, %arg) = @_; |
15 |
|
16 |
my $self = \%arg, $class; |
17 |
my $rcb = \$self->{cb}; |
18 |
|
19 |
my @cond; |
20 |
push @cond, "in" if $self->{poll} =~ /r/i; |
21 |
push @cond, "out" if $self->{poll} =~ /w/i; |
22 |
push @cond, "pri" if $self->{poll} =~ /e/i; |
23 |
|
24 |
$self->{source} = add_watch Glib::IO fileno $self->{fh}, \@cond, sub { |
25 |
$$rcb->(join "", map $RWE{$_}, @{ $_[1] }); |
26 |
! ! $$rcb |
27 |
}; |
28 |
|
29 |
$self |
30 |
} |
31 |
|
32 |
sub timer { |
33 |
my ($class, %arg) = @_; |
34 |
|
35 |
my $self = \%arg, $class; |
36 |
my $cb = $self->{cb}; |
37 |
|
38 |
$self->{source} = add Glib::Timeout $self->{after} * 1000, sub { |
39 |
$cb->(); |
40 |
0 |
41 |
}; |
42 |
|
43 |
$self |
44 |
} |
45 |
|
46 |
sub cancel { |
47 |
my ($self) = @_; |
48 |
|
49 |
return unless HASH:: eq ref $self; |
50 |
|
51 |
remove Glib::Source delete $self->{source} if $self->{source}; |
52 |
$self->{cb} = undef; |
53 |
delete $self->{cb}; |
54 |
} |
55 |
|
56 |
sub DESTROY { |
57 |
my ($self) = @_; |
58 |
|
59 |
$self->cancel; |
60 |
} |
61 |
|
62 |
sub condvar { |
63 |
my $class = shift; |
64 |
|
65 |
bless \my $x, $class; |
66 |
} |
67 |
|
68 |
sub broadcast { |
69 |
${$_[0]}++ |
70 |
} |
71 |
|
72 |
sub wait { |
73 |
$maincontext->iteration (1) while !${$_[0]}; |
74 |
} |
75 |
|
76 |
$AnyEvent::MODEL = __PACKAGE__; |
77 |
|
78 |
1; |
79 |
|