On Thu, Oct 09, 2008 at 06:50:15PM +0100, Daniel P. Berrange wrote: > On Thu, Oct 09, 2008 at 11:22:38AM -0400, Ben Guthro wrote: > > diff --git a/src/internal.h b/src/internal.h > > index a3d48fa..67a3e5b 100644 > > --- a/src/internal.h > > +++ b/src/internal.h > > @@ -191,6 +191,18 @@ extern int debugFlag; > > #define VIR_IS_STORAGE_VOL(obj) ((obj) && (obj)->magic==VIR_STORAGE_VOL_MAGIC) > > #define VIR_IS_CONNECTED_STORAGE_VOL(obj) (VIR_IS_STORAGE_VOL(obj) && VIR_IS_CONNECT((obj)->conn)) > > > > +/** > > + * Domain Event Callbacks > > + */ > > +struct _virDomainEventCallbackList { > > + virConnectPtr conn; > > + virConnectDomainEventCallback cb; > > + void *opaque; > > + struct _virDomainEventCallbackList *next; > > +}; > > + > > +typedef struct _virDomainEventCallbackList virDomainEventCallbackList; > > + > > /* > > * arbitrary limitations > > */ > > @@ -237,6 +249,12 @@ struct _virConnect { > > virHashTablePtr storagePools;/* hash table for known storage pools */ > > virHashTablePtr storageVols;/* hash table for known storage vols */ > > int refs; /* reference count */ > > + > > + /* Domain Callbacks */ > > + virDomainEventCallbackList *domainEventCallbacks; > > + > > + /* link to next conn of this driver type */ > > + struct _virConnect *next; > > }; > > This doesn't make any sense to me - you're making all the virConnect > objects cross reference each other. Each object only needs to know > about the callbacks registered to itself - it doesn't care about > callbacks other virConnect objects have. I'd expect something > more like > > struct _virDomainEventCallback { > virConnectDomainEventCallback cb; > void *opaque; > }; > typedef struct _virDomainEventCallback virDomainEventCallback; > typedef virDomainEventCallback *virDomainEventCallbackPtr; > > struct _virDomainEventCallbackList { > unsigned int ndomainCallbacks; > struct __virDomainEventCallbackPtr *domainCallbacks; > } > typedef struct _virDomainEventCallbackList virDomainEventCallbackList; > > I used a explicit array here, because we're trying to kill off the linked > lists, since it simplifies thread safety work, to be able to lock individual > objects, and not worry about its peers pointing to it - only its parent. > > The internal drivers would then have virDomainEventCallbackList intances > as they need - eg, in the _xenUnifiedPrivate struct for Xen drivers, or > in the 'struct qemud_driver' for QEMU, etc. Correcting myself here - the _virDomainEventCallback struct does actually need to keep a copy of the virConnectPtr object. Since if we're storing it in the individual drivers, that's the only link back to the connection. It can be treated opaquely though in this instance - merely another pointer to be fed back into the callback. Which reminds me, when registering the callback it will be neccessary to increment the ref count on the virconnect object to make sure it won't be de-allocated while an event calback is still present. 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 :| -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list