1 |
root |
1.1 |
package AnyEvent::Impl::Glib; |
2 |
|
|
|
3 |
|
|
use Glib (); |
4 |
|
|
|
5 |
|
|
my $maincontext = Glib::MainContext->default; |
6 |
|
|
|
7 |
root |
1.2 |
my %RWE = ( |
8 |
|
|
in => 'r', |
9 |
|
|
out => 'w', |
10 |
|
|
pri => 'e', |
11 |
|
|
); |
12 |
|
|
|
13 |
|
|
sub io { |
14 |
|
|
my ($class, %arg) = @_; |
15 |
|
|
|
16 |
root |
1.3 |
my $self = bless \%arg, $class; |
17 |
root |
1.2 |
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 |
root |
1.1 |
|
29 |
root |
1.2 |
$self |
30 |
root |
1.1 |
} |
31 |
|
|
|
32 |
root |
1.2 |
sub timer { |
33 |
|
|
my ($class, %arg) = @_; |
34 |
root |
1.1 |
|
35 |
root |
1.3 |
my $self = bless \%arg, $class; |
36 |
root |
1.2 |
my $cb = $self->{cb}; |
37 |
root |
1.1 |
|
38 |
root |
1.2 |
$self->{source} = add Glib::Timeout $self->{after} * 1000, sub { |
39 |
|
|
$cb->(); |
40 |
|
|
0 |
41 |
root |
1.1 |
}; |
42 |
|
|
|
43 |
root |
1.2 |
$self |
44 |
root |
1.1 |
} |
45 |
|
|
|
46 |
root |
1.2 |
sub cancel { |
47 |
root |
1.1 |
my ($self) = @_; |
48 |
|
|
|
49 |
|
|
remove Glib::Source delete $self->{source} if $self->{source}; |
50 |
root |
1.2 |
$self->{cb} = undef; |
51 |
|
|
delete $self->{cb}; |
52 |
root |
1.1 |
} |
53 |
|
|
|
54 |
root |
1.2 |
sub DESTROY { |
55 |
|
|
my ($self) = @_; |
56 |
root |
1.1 |
|
57 |
root |
1.2 |
$self->cancel; |
58 |
|
|
} |
59 |
|
|
|
60 |
|
|
sub condvar { |
61 |
root |
1.1 |
my $class = shift; |
62 |
|
|
|
63 |
root |
1.3 |
bless \my $x, AnyEvent::Impl::Glib::CondVar:: |
64 |
root |
1.1 |
} |
65 |
|
|
|
66 |
root |
1.3 |
sub AnyEvent::Impl::Glib::CondVar::broadcast { |
67 |
|
|
${$_[0]}++; |
68 |
root |
1.1 |
} |
69 |
|
|
|
70 |
root |
1.3 |
sub AnyEvent::Impl::Glib::CondVar::wait { |
71 |
root |
1.1 |
$maincontext->iteration (1) while !${$_[0]}; |
72 |
|
|
} |
73 |
|
|
|
74 |
root |
1.2 |
$AnyEvent::MODEL = __PACKAGE__; |
75 |
|
|
|
76 |
root |
1.1 |
1; |
77 |
|
|
|