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