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