[libvirt-users] Sys::Virt integration into other event loops

Scott Wiersdorf scott at betterservers.com
Mon Mar 17 19:46:08 UTC 2014


On Mar 14, 2014, at 9:32 AM, Daniel P. Berrange <berrange at redhat.com> wrote:
> - Register and run your own event loop impl by calling the method
>   Sys::Virt::Event::register(), passing in a custom subclass of
>   the Sys::Virt::Event class. This is what you should do to integrate
>   with existing event loop impls like AnyEvent.
> 
> If you're set on using AnyEvent, then you want todo option 2 here. There's
> no particularly good docs or example code here, but you can see how todo
> this by looking at the Perl test suite. eg the t/800-events.t file.
> This test suite does a pure perl event loop based on select(). You'd
> probably want to adapt that and call into AnyEvent, instead of select().
> The add_handle/remove_handle/update_handle/add_timeout/update_timeout/
> remove_timeout methods should all call into appropriate AnyEvent APIs.
> Then you just need to run AnyEvent as normal.

I’ve borrowed a little bit from t/800-events.t and have the following package:

package Sys::Virt::AnyEvent;

use parent 'Sys::Virt::Event';

sub new {
    my $proto = shift;
    my $class = ref($proto) || $proto;
    my $self = {};
    bless $self, $class;
    $self->register;
    return $self;
}

sub add_handle {
    my $self = shift;
    my $fd = shift;
    my $events = shift;
    my $cb = shift;
    my $opaque = shift;
    my $ff = shift;

    AnyEvent->io(
        fh   => $fd,
        poll => 'r',
        cb   => $cb );
}

When I try to use this package (since it’s in the same lexical scope, so I don’t use() it):

use EV;
use AnyEvent;
use Sys::Virt;
use Sys::Virt::Domain;

my $ev = Sys::Virt::AnyEvent->new();
my $c = Sys::Virt->new(uri => "remote:///system", readonly => 1);

my $w = AnyEvent->timer(after => 1, interval => 1, cb => sub { say scalar localtime } );
my $cv; $cv = AnyEvent->condvar(cb => sub { say "cv fired: " . $_[0]->recv;
                                            $cv = AnyEvent->condvar(cb => __SUB__) });

$c->domain_event_register_any(undef,
                              Sys::Virt::Domain::EVENT_ID_LIFECYCLE,
                              sub { my ($sv, $dom, $evt, $detail) = @_;
                                    $cv->send($dom->get_name);
                                    say STDERR "Domain: " . $dom->get_name;
                                    say STDERR Dumper($evt) . $detail });

EV::run;

I get this:

Not a subroutine reference at local/lib/perl5/x86_64-linux-thread-multi/AnyEvent/Impl/EV.pm line 55.

EV.pm line 55 is this:

     52 sub io {
     53    my ($class, %arg) = @_;
     54
     55    EV::io
     56       $arg{fh},
     57       $arg{poll} eq "r" ? EV::READ : EV::WRITE,
     58       $arg{cb}
     59 }

If I dump $arg{cb} it looks like this:

cb:     $VAR1 = \'222528336192';

Definitely not a subroutine reference. I know there’s a lot more going on here than I’m understanding, but I’m out of ideas of how to get Sys::Virt to play well in an AnyEvent environment.

I see that add_handle() in t/800-events.t returns a unique watch id, but AnyEvent doesn’t have that same notion. What should I be doing instead of returning an AnyEvent::io object?

Scott

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://listman.redhat.com/archives/libvirt-users/attachments/20140317/f224f0e9/attachment.htm>
-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 496 bytes
Desc: Message signed with OpenPGP using GPGMail
URL: <http://listman.redhat.com/archives/libvirt-users/attachments/20140317/f224f0e9/attachment.sig>


More information about the libvirt-users mailing list