ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent/lib/AnyEvent/Impl/Glib.pm
(Generate patch)

Comparing AnyEvent/lib/AnyEvent/Impl/Glib.pm (file contents):
Revision 1.27 by root, Tue Aug 2 20:02:44 2011 UTC vs.
Revision 1.28 by root, Tue Aug 2 22:07:16 2011 UTC

33=cut 33=cut
34 34
35package AnyEvent::Impl::Glib; 35package AnyEvent::Impl::Glib;
36 36
37use AnyEvent (); BEGIN { AnyEvent::common_sense } 37use AnyEvent (); BEGIN { AnyEvent::common_sense }
38use Glib (); 38use Glib 1.210 (); # (stable 1.220 2009, also Glib 2.4+ required, 2004)
39 39
40our $mainloop = Glib::MainContext->default; 40our $mainloop = Glib::MainContext->default;
41 41
42my %io_cond = ( 42my %io_cond = (
43 r => ["in" , "hup"], 43 r => ["in" , "hup"],
80sub idle { 80sub idle {
81 my ($class, %arg) = @_; 81 my ($class, %arg) = @_;
82 82
83 my $cb = $arg{cb}; 83 my $cb = $arg{cb};
84 my $source = add Glib::Idle sub { &$cb; 1 }; 84 my $source = add Glib::Idle sub { &$cb; 1 };
85
85 bless \\$source, $class 86 bless \\$source, $class
86} 87}
87 88
88sub DESTROY { 89sub DESTROY {
89 remove Glib::Source $${$_[0]}; 90 remove Glib::Source $${$_[0]};
91}
92
93our %pid_w;
94our %pid_cb;
95
96sub child {
97 my ($class, %arg) = @_;
98
99 $arg{pid} > 0
100 or Carp::croak "Glib does not support watching for all pids (pid == 0) as attempted";
101
102 my $pid = $arg{pid};
103 my $cb = $arg{cb};
104
105 $pid_cb{$pid}{$cb+0} = $cb;
106
107 $pid_w{$pid} ||= Glib::Child->watch_add ($pid, sub {
108 $_->($_[0], $_[1])
109 for values %{ $pid_cb{$pid} };
110
111 1
112 });
113
114 bless [$pid, $cb+0], "AnyEvent::Impl::Glib::child"
115}
116
117sub AnyEvent::Impl::Glib::child::DESTROY {
118 my ($pid, $icb) = @{ $_[0] };
119
120 delete $pid_cb{$pid}{$icb};
121 unless (%{ $pid_cb{$pid} }) {
122 delete $pid_cb{$pid};
123 remove Glib::Source delete $pid_w{$pid};
124 }
90} 125}
91 126
92sub AnyEvent::CondVar::_wait { 127sub AnyEvent::CondVar::_wait {
93 $mainloop->iteration (1) until $_[0]{_ae_sent}; 128 $mainloop->iteration (1) until $_[0]{_ae_sent};
94} 129}

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines