ViewVC Help
View File | Revision Log | Show Annotations | Download File
/cvs/AnyEvent-DBus/DBus.pm
(Generate patch)

Comparing AnyEvent-DBus/DBus.pm (file contents):
Revision 1.5 by root, Mon Jun 21 10:24:44 2010 UTC vs.
Revision 1.7 by root, Mon Jun 21 19:59:28 2010 UTC

29hacking L<Net::DBus::Reactor> so that all dbus connections created after 29hacking L<Net::DBus::Reactor> so that all dbus connections created after
30loading this module will automatically be managed by this module. 30loading this module will automatically be managed by this module.
31 31
32Note that a) a lot inside Net::DBus is still blocking b) if you call a 32Note that a) a lot inside Net::DBus is still blocking b) if you call a
33method that blocks, you again block your process (basically anything 33method that blocks, you again block your process (basically anything
34but calls to the Net::DBus::Binding::Connection objects block, but 34but calls to the Net::DBus::Binding::Connection objects block, but see
35see Net::DBus::Annoation, specifically dbus_call_async) and c) this 35Net::DBus::Annoation, specifically dbus_call_async) c) the underlying
36libdbus is often blocking itself, even with infinite timeouts and d) this
36module only implements the minimum API required to make Net::DBus work - 37module only implements the minimum API required to make Net::DBus work -
37Net::DBus unfortunately has no nice hooking API. 38Net::DBus unfortunately has no nice hooking API.
38 39
39However, unlike L<Net::DBus::Reactor>, this module should be fully 40However, unlike L<Net::DBus::Reactor>, this module should be fully
40non-blocking as long as you only use non-blocking APIs (Net::DBus::Reactor 41non-blocking as long as you only use non-blocking APIs (Net::DBus::Reactor
41blocks on writes). It should also be faster, but Net::DBus is such a 42blocks on writes). It should also be faster, but Net::DBus is such a
42morass os unneeded method calls that speed won't matter much... 43morass so unneeded method calls that speed won't matter much...
43 44
44=head2 EXAMPLE 45=head2 EXAMPLE
45 46
46Here is a simple example. Both work with AnyEvent::DBus and do the same 47Here is a simple example. Both work with AnyEvent::DBus and do the same
47thing, but only the second is actually non-blocking. 48thing, but only the second is actually non-blocking.
116 117
117 $f & Net::DBus::Binding::Watch::READABLE () 118 $f & Net::DBus::Binding::Watch::READABLE ()
118 and 119 and
119 $O{$id}[0] = $on && AE::io $fd, 0, sub { 120 $O{$id}[0] = $on && AE::io $fd, 0, sub {
120 $w->handle (Net::DBus::Binding::Watch::READABLE ()); 121 $w->handle (Net::DBus::Binding::Watch::READABLE ());
121 $con->dispatch; # wtf., we tell it data is ready, but have to call dispatch ourselves??? 122 $con->dispatch;
122 }; 123 };
123 124
124 $f & Net::DBus::Binding::Watch::WRITABLE () 125 $f & Net::DBus::Binding::Watch::WRITABLE ()
125 and 126 and
126 $O{$id}[1] = $on && AE::io $fd, 1, sub { 127 $O{$id}[1] = $on && AE::io $fd, 1, sub {
127 $w->handle (Net::DBus::Binding::Watch::WRITABLE ()); 128 $w->handle (Net::DBus::Binding::Watch::WRITABLE ());
128 # calling flush, as NEt::DBus::Reactor does, is blocking :/ 129 $con->dispatch;
129 }; 130 };
130} 131}
131 132
132sub io_on { 133sub io_on {
133 my ($con, $w) = @_; 134 my ($con, $w) = @_;
142 my ($con, $w) = @_; 143 my ($con, $w) = @_;
143 144
144 my $id = $w->get_data; 145 my $id = $w->get_data;
145 my $i = $w->get_interval * 0.001; 146 my $i = $w->get_interval * 0.001;
146 147
147 $O{$id} = $w->is_enabled && AE::timer $i, $i, sub { $w->handle }; 148 $O{$id} = $w->is_enabled && AE::timer $i, $i, sub {
149 $w->handle;
150 $con->dispatch;
151 };
148} 152}
149 153
150sub timeout_on { 154sub timeout_on {
151 my ($con, $w) = @_; 155 my ($con, $w) = @_;
152 my $id = ++$I; 156 my $id = ++$I;
161 $con->set_watch_callbacks (\&io_on, \&watch_off, \&io_toggle); 165 $con->set_watch_callbacks (\&io_on, \&watch_off, \&io_toggle);
162# if $con->can ("set_watch_callbacks"); 166# if $con->can ("set_watch_callbacks");
163 167
164 $con->set_timeout_callbacks (\&timeout_on, \&watch_off, \&timeout_toggle); 168 $con->set_timeout_callbacks (\&timeout_on, \&watch_off, \&timeout_toggle);
165# if $con->can ("set_timeout_callbacks"); 169# if $con->can ("set_timeout_callbacks");
170
171 $con->dispatch; # for good measure
166} 172}
167 173
168=head1 SEE ALSO 174=head1 SEE ALSO
169 175
170L<AnyEvent>, L<Net::DBus>. 176L<AnyEvent>, L<Net::DBus>.

Diff Legend

Removed lines
+ Added lines
< Changed lines
> Changed lines