1 |
package AnyEvent::Impl::Glib; |
2 |
|
3 |
no warnings; |
4 |
|
5 |
use Glib (); |
6 |
|
7 |
my $maincontext = Glib::MainContext->default; |
8 |
|
9 |
sub io { |
10 |
my ($class, %arg) = @_; |
11 |
|
12 |
my $self = bless \%arg, $class; |
13 |
my $rcb = \$self->{cb}; |
14 |
|
15 |
# some glibs need hup, others error with it, YMMV |
16 |
push @cond, "in", "hup" if $self->{poll} eq "r"; |
17 |
push @cond, "out", "hup" if $self->{poll} eq "w"; |
18 |
|
19 |
$self->{source} = add_watch Glib::IO fileno $self->{fh}, \@cond, sub { |
20 |
$$rcb->(); |
21 |
! ! $$rcb |
22 |
}; |
23 |
|
24 |
$self |
25 |
} |
26 |
|
27 |
sub timer { |
28 |
my ($class, %arg) = @_; |
29 |
|
30 |
my $self = bless \%arg, $class; |
31 |
my $cb = $self->{cb}; |
32 |
|
33 |
$self->{source} = add Glib::Timeout $self->{after} * 1000, sub { |
34 |
$cb->(); |
35 |
0 |
36 |
}; |
37 |
|
38 |
$self |
39 |
} |
40 |
|
41 |
sub DESTROY { |
42 |
my ($self) = @_; |
43 |
|
44 |
remove Glib::Source delete $self->{source} if $self->{source}; |
45 |
# need to undef $cb because we hold references to it |
46 |
$self->{cb} = undef; |
47 |
%$self = (); |
48 |
} |
49 |
|
50 |
sub condvar { |
51 |
my $class = shift; |
52 |
|
53 |
bless \my $flag, $class |
54 |
} |
55 |
|
56 |
sub broadcast { |
57 |
${$_[0]}++; |
58 |
} |
59 |
|
60 |
sub wait { |
61 |
$maincontext->iteration (1) while !${$_[0]}; |
62 |
} |
63 |
|
64 |
sub one_event { |
65 |
$maincontext->iteration (1); |
66 |
} |
67 |
|
68 |
1 |
69 |
|