GSP
Quick Navigator

Search Site

Unix VPS
A - Starter
B - Basic
C - Preferred
D - Commercial
MPS - Dedicated
Previous VPSs
* Sign Up! *

Support
Contact Us
Online Help
Handbooks
Domain Status
Man Pages

FAQ
Virtual Servers
Pricing
Billing
Technical

Network
Facilities
Connectivity
Topology Map

Miscellaneous
Server Agreement
Year 2038
Credits
 

USA Flag

 

 

Man Pages
DBus(3) User Contributed Perl Documentation DBus(3)

AnyEvent::DBus - adapt Net::DBus to AnyEvent

   use AnyEvent::DBus;

   # now use the Net::DBus API, preferably the non-blocking variants:

   use Net::DBus::Annotation qw(:call);

   $bus->get_object (...)
       ->Method (dbus_call_async, $arg1, ...)
       ->set_notify (sub {
          my @data = $_[0]->get_result
          ...
       });

   $bus->get_connection->send (...);

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...

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 }) {
      print "  $name\n";
   }

Example 1: list registered named, somewhat non-blocking version.

   use AnyEvent;
   use AnyEvent::DBus;
   use Net::DBus::Annotation qw(:call);

   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 }) {
         print "  $name\n";
      }
      $quit->send;
   });

   $quit->recv;

AnyEvent, Net::DBus.

 Marc Lehmann <schmorp@schmorp.de>
 http://home.schmorp.de/
2010-06-22 perl v5.32.1

Search for    or go to Top of page |  Section 3 |  Main Index

Powered by GSP Visit the GSP FreeBSD Man Page Interface.
Output converted with ManDoc.