NAME
AnyEvent::DBus - adapt Net::DBus to AnyEvent
SYNOPSIS
use
AnyEvent::DBus;
# now use the Net::DBus API, preferably the non-blocking variants:
$bus
->get_object (...)
->Method (dbus_call_async,
$arg1
, ...)
->set_notify (
sub
{
my
@data
=
$_
[0]->get_result
...
});
$bus
->get_connection->
send
(...);
DESCRIPTION
This module is an AnyEvent user, you need to make sure that you use and run a supported event loop.
Loading this module will install the necessary magic to seamlessly integrate Net::DBus into AnyEvent. It does this by quite brutally hacking Net::DBus::Reactor so that all dbus connections created after loading this module will automatically be managed by this module.
Note that a) a lot inside Net::DBus is still blocking b) if you call a method that blocks, you again block your process (basically anything but calls to the Net::DBus::Binding::Connection objects block, but see Net::DBus::Annoation, specifically dbus_call_async) c) the underlying libdbus is often blocking itself, even with infinite timeouts and d) this module only implements the minimum API required to make Net::DBus work - Net::DBus unfortunately has no nice hooking API.
However, unlike Net::DBus::Reactor, this module should be fully non-blocking as long as you only use non-blocking APIs (Net::DBus::Reactor blocks on writes). It should also be faster, but Net::DBus is such a morass so unneeded method calls that speed won't matter much...
EXAMPLE
Here is a simple example. Both work with AnyEvent::DBus and do the same thing, but only the second is actually non-blocking.
Example 1: list registered named, blocking version.
use
AnyEvent::DBus;
my
$conn
= Net::DBus->find;
my
$bus
=
$conn
->get_bus_object;
for
my
$name
(@{
$bus
->ListNames }) {
" $name\n"
;
}
Example 1: list registered named, somewhat non-blocking version.
use
AnyEvent;
use
AnyEvent::DBus;
my
$conn
= Net::DBus->find;
# always blocks :/
my
$bus
=
$conn
->get_bus_object;
my
$quit
= AE::cv;
# the trick here is to prepend dbus_call_async to any method
# arguments and then to call the set_notify method on the
# returned Net::DBus::AsyncReply object
$bus
->ListNames (dbus_call_async)->set_notify (
sub
{
for
my
$name
(@{
$_
[0]->get_result }) {
" $name\n"
;
}
$quit
->
send
;
});
$quit
->
recv
;
SEE ALSO
AUTHOR
Marc Lehmann <schmorp
@schmorp
.de>