[libvirt] [PATCH 1/1] Support for Callbacks and VirtualBox Version 3.

Daniel P. Berrange berrange at redhat.com
Wed Jul 22 16:15:28 UTC 2009


On Fri, Jul 17, 2009 at 03:39:07PM +0200, Pritesh Kothari wrote:
> 
> > I think your .gitconfig needs email addr fixing :-)
> 
> thanks did it ;)
> 
> > I'm thinking it is going to get rather painful to #if/else/endif this
> > stuff throughout the file.
> >
> > Perhaps it wouldbe better to define some wrapper datatypes / functions
> >
> >
> >   #if VBOX_API_VERSION == 2002
> >   typedef vboxIID  nsID;
> >   void vboxIIDFromDom(virDomainPtr dom, vboxIID *iid) {
> >        nsIDFromChar(iid, dom->uuid);
> >   }
> >   void vboxIIDFree(vboxIID *iid) {
> >       VIR_FREE(iid);
> >   }
> >
> >   #else
> >
> >   typedef vboxIID  PRUnichar;
> >   void vboxIIDFromDom(virDomainPtr dom, vboxIID *iid) {
> >       char iidUtf8[VIR_UUID_STRING_BUFLEN];
> >       virUUIDFormat(dom->uuid, iidUtf8);
> >       data->pFuncs->pfnUtf8ToUtf16(iidUtf8, iid);
> >   }
> >   void vboxIIDFree(vboxIID *iid) {
> >       data->pFuncs->pfnUtf16Free(iidUtf16);
> >   }
> >
> >   #endif
> >
> > So, then the code could simply do
> >
> >           vboxIIDFromDom(dom, &iid);
> >           rc = data->vboxObj->vtbl->GetMachine(data->vboxObj, iid,
> > &machine); vboxIIDRelease(iid);
> 
> Did this.
> 
> > > +                event  = VIR_DOMAIN_EVENT_SUSPENDED;
> > > +                detail = VIR_DOMAIN_EVENT_SUSPENDED_PAUSED;
> > > +            } else if (state == MachineState_Running) {
> > > +                event  = VIR_DOMAIN_EVENT_RESUMED;
> > > +                detail = VIR_DOMAIN_EVENT_RESUMED_UNPAUSED;
> >
> > Does 'MachineState_Running' only occur upon unpausing the VM ?
> > The 'RESUMED' even is only intended to occur in that case.
> 
> No it also occurs when the machine is being restored from a saved state, but 
> then again the machine was paused while saving it so I guess it is safe to 
> consider it occurs only after unpausing the machine.
> 
> > > +    (void)error; /* so that the compiler doesn't complain about unsed
> > > variables */ +
> > > +    return NS_OK;
> > > +}
> >
> > Just add ATTRIBUTE_UNUSED to the parameter declaration instead of
> > (void)error;
> 
> done.
> 
> > > +
> > > +            /* CURRENT LIMITATION: we never get the
> > > VIR_DOMAIN_EVENT_UNDEFINED +             * event becuase the when the
> > > machine is de-registered the call +             * to
> > > vboxDomainLookupByUUID fails and thus we don't get any +             *
> > > dom pointer which is necessary (null dom pointer doesn't work) +         
> > >    * to show the VIR_DOMAIN_EVENT_UNDEFINED event
> > > +             */
> >
> > Hmm, that's a little annoying. You already have the UUID, and 'id' is
> > obviously -1 for inactive guests. So only missing thing is the name :-(
> 
> the main problem here is that since we are in the callback of the machine 
> which was just de-registered, we can't get back to virtualbox and ask for the 
> name of the machine cause the machine is no more :( and thus the problem. i am 
> trying to update this part so that the callback also gives the machine name, 
> but it will take some time.
> 
> 
> > > +        if (vboxRet == 0) {
> > > +            PRInt32 vboxFileHandle;
> > > +            vboxFileHandle =
> > > g_pVBoxGlobalData->vboxQueue->vtbl->GetEventQueueSelectFD(g_pVBoxGlobalDa
> > >ta->vboxQueue); +
> > > +            eventRet = virEventAddHandle(vboxFileHandle,
> > > VIR_EVENT_HANDLE_READABLE, vboxReadCallback, NULL, NULL); +
> > > +            if (eventRet >= 0) {
> >
> > You need to storage 'eventRet' in your virConnectPtr's privateData
> > so that later......
> >
> > I'm also surprised you can pass in 'NULL' to the 'opaque' parameter of
> > virEventAddHandle(), because I'd expect your vboxReadCallback()
> > function to need to have a reference to the your 'data' object
> > or virConnectPtr object later.
> 
> fixing this..
> 
> > > +
> > > +    virEventRemoveHandle(0);
> >
> > .....here you can pass a real handle ID, instead of '0' which will
> > unregister some random callback that isn't neccessarily yours.
> 
> and this..
> 
> > I don't know how hard it'd be to unpick this now, but it'd be nice to
> > have this in 2 patches, one adding support for version 3, and the 2nd
> > then implementing the event callbacks.
> 
> will surely try this, but not sure if it'd be easy, too many #if's :(
> 
> the patch with above changes is attached below:

ACK, this looks way better with many of the #if's removed. We could
probably remove some more in a similar manner, but I think this is
OK to commit as is now.

Daniel
-- 
|: Red Hat, Engineering, London   -o-   http://people.redhat.com/berrange/ :|
|: http://libvirt.org  -o-  http://virt-manager.org  -o-  http://ovirt.org :|
|: http://autobuild.org       -o-         http://search.cpan.org/~danberr/ :|
|: GnuPG: 7D3B9505  -o-  F3C9 553F A1DA 4AC2 5648 23C1 B3DF F742 7D3B 9505 :|




More information about the libvir-list mailing list