I like this much better than where I had put everything. Makes much more sense to encapsulate it in its own file/header +1 Daniel P. Berrange wrote on 10/29/2008 08:06 AM: > There are a bunch of helper functions relating to domain events, which > are only used internally by hypervisor drivers. Following the principle > that libvirt.c should only contain functions exported in the API, and > internal.h should not define any function signatures, these helpers > need to move. > > So I'm inventing a domain_events.c, and domain_events.h file to contain > the domain events helper code, in much same way as domain_conf.c and > domain_conf.h contain the domain XML helper code. > > Again no functional change here. With this patch applied, the cleanup > of internal.h is basically complete - at least more than good enough > for now. It'd be nice to move the struct definitions of virDomainPtr, > etc elsewhere, perhaps to src/libvirt.h because they're public API, > but not exported publically. > > b/src/domain_event.c | 229 ++++++++++++++++++++++++++++++++++++++++++++++++++ > b/src/domain_event.h | 83 ++++++++++++++++++ > qemud/event.c | 8 - > qemud/event.h | 7 + > src/Makefile.am | 1 > src/internal.h | 73 --------------- > src/libvirt.c | 201 ------------------------------------------- > src/qemu_conf.h | 1 > src/remote_internal.c | 1 > 9 files changed, 326 insertions(+), 278 deletions(-) > > Daniel > > diff -r 0325a25d1762 qemud/event.c > --- a/qemud/event.c Wed Oct 29 11:48:08 2008 +0000 > +++ b/qemud/event.c Wed Oct 29 12:03:29 2008 +0000 > @@ -489,7 +489,7 @@ > } > > int > -__virEventHandleTypeToPollEvent(virEventHandleType events) > +virEventHandleTypeToPollEvent(int events) > { > int ret = 0; > if(events & VIR_EVENT_HANDLE_READABLE) > @@ -503,10 +503,10 @@ > return ret; > } > > -virEventHandleType > -__virPollEventToEventHandleType(int events) > +int > +virPollEventToEventHandleType(int events) > { > - virEventHandleType ret = 0; > + int ret = 0; > if(events & POLLIN) > ret |= VIR_EVENT_HANDLE_READABLE; > if(events & POLLOUT) > diff -r 0325a25d1762 qemud/event.h > --- a/qemud/event.h Wed Oct 29 11:48:08 2008 +0000 > +++ b/qemud/event.h Wed Oct 29 12:03:29 2008 +0000 > @@ -105,4 +105,11 @@ > */ > int virEventRunOnce(void); > > +int > +virEventHandleTypeToPollEvent(int events); > +int > +virPollEventToEventHandleType(int events); > + > + > + > #endif /* __VIRTD_EVENT_H__ */ > diff -r 0325a25d1762 src/Makefile.am > --- a/src/Makefile.am Wed Oct 29 11:48:08 2008 +0000 > +++ b/src/Makefile.am Wed Oct 29 12:03:29 2008 +0000 > @@ -150,6 +150,7 @@ > hash.c hash.h \ > internal.h \ > libvirt.c \ > + domain_event.c domain_event.h \ > $(GENERIC_LIB_SOURCES) \ > $(DOMAIN_CONF_SOURCES) \ > $(NETWORK_CONF_SOURCES) \ > diff -r 0325a25d1762 src/domain_event.c > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/src/domain_event.c Wed Oct 29 12:03:29 2008 +0000 > @@ -0,0 +1,229 @@ > +/* > + * domain_event.c: domain event queue processing helpers > + * > + * Copyright (C) 2008 VirtualIron > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > + * > + * Author: Ben Guthro > + */ > + > +#include <config.h> > + > +#include "domain_event.h" > +#include "libvirt.h" > +#include "memory.h" > + > + > +/** > + * virDomainEventCallbackListFree: > + * @list: event callback list head > + * > + * Free the memory in the domain event callback list > + */ > +void > +virDomainEventCallbackListFree(virDomainEventCallbackListPtr list) > +{ > + int i; > + for (i=0; i<list->count; i++) { > + VIR_FREE(list->callbacks[i]); > + } > + VIR_FREE(list); > +} > +/** > + * virDomainEventCallbackListRemove: > + * @conn: pointer to the connection > + * @cbList: the list > + * @callback: the callback to remove > + * > + * Internal function to remove a callback from a virDomainEventCallbackListPtr > + */ > +int > +virDomainEventCallbackListRemove(virConnectPtr conn, > + virDomainEventCallbackListPtr cbList, > + virConnectDomainEventCallback callback) > +{ > + int i; > + for (i = 0 ; i < cbList->count ; i++) { > + if(cbList->callbacks[i]->cb == callback && > + cbList->callbacks[i]->conn == conn) { > + virUnrefConnect(cbList->callbacks[i]->conn); > + VIR_FREE(cbList->callbacks[i]); > + > + if (i < (cbList->count - 1)) > + memmove(cbList->callbacks + i, > + cbList->callbacks + i + 1, > + sizeof(*(cbList->callbacks)) * > + (cbList->count - (i + 1))); > + > + if (VIR_REALLOC_N(cbList->callbacks, > + cbList->count - 1) < 0) { > + ; /* Failure to reduce memory allocation isn't fatal */ > + } > + cbList->count--; > + > + return 0; > + } > + } > + return -1; > +} > + > +/** > + * virDomainEventCallbackListAdd: > + * @conn: pointer to the connection > + * @cbList: the list > + * @callback: the callback to add > + * @opaque: opaque data tio pass to callback > + * > + * Internal function to add a callback from a virDomainEventCallbackListPtr > + */ > +int > +virDomainEventCallbackListAdd(virConnectPtr conn, > + virDomainEventCallbackListPtr cbList, > + virConnectDomainEventCallback callback, > + void *opaque) > +{ > + virDomainEventCallbackPtr event; > + int n; > + > + /* Check incoming */ > + if ( !cbList ) { > + return -1; > + } > + > + /* check if we already have this callback on our list */ > + for (n=0; n < cbList->count; n++) { > + if(cbList->callbacks[n]->cb == callback && > + conn == cbList->callbacks[n]->conn) { > + DEBUG0("WARNING: Callback already tracked"); > + return -1; > + } > + } > + /* Allocate new event */ > + if (VIR_ALLOC(event) < 0) { > + DEBUG0("Error allocating event"); > + return -1; > + } > + event->conn = conn; > + event->cb = callback; > + event->opaque = opaque; > + > + /* Make space on list */ > + n = cbList->count; > + if (VIR_REALLOC_N(cbList->callbacks, n + 1) < 0) { > + DEBUG0("Error reallocating list"); > + VIR_FREE(event); > + return -1; > + } > + > + event->conn->refs++; > + > + cbList->callbacks[n] = event; > + cbList->count++; > + return 0; > +} > + > +/** > + * virDomainEventQueueFree: > + * @queue: pointer to the queue > + * > + * Free the memory in the queue. We process this like a list here > + */ > +void > +virDomainEventQueueFree(virDomainEventQueuePtr queue) > +{ > + int i; > + for ( i=0 ; i<queue->count ; i++ ) { > + VIR_FREE(queue->events[i]); > + } > + VIR_FREE(queue); > +} > + > +/** > + * virDomainEventCallbackQueuePop: > + * @evtQueue: the queue of events > + * > + * Internal function to pop off, and return the front of the queue > + * NOTE: The caller is responsible for freeing the returned object > + * > + * Returns: virDomainEventPtr on success NULL on failure. > + */ > +virDomainEventPtr > +virDomainEventCallbackQueuePop(virDomainEventQueuePtr evtQueue) > +{ > + virDomainEventPtr ret; > + > + if(!evtQueue || evtQueue->count == 0 ) > + return NULL; > + > + ret = evtQueue->events[0]; > + > + memmove(evtQueue->events, > + evtQueue->events + 1, > + sizeof(*(evtQueue->events)) * > + (evtQueue->count - 1)); > + > + if (VIR_REALLOC_N(evtQueue->events, > + evtQueue->count - 1) < 0) { > + ; /* Failure to reduce memory allocation isn't fatal */ > + } > + evtQueue->count--; > + > + return ret; > +} > + > +/** > + * virDomainEventCallbackQueuePush: > + * @evtQueue: the dom event queue > + * @dom: the domain to add > + * @event: the event to add > + * > + * Internal function to push onto the back of an virDomainEventQueue > + * > + * Returns: 0 on success, -1 on failure > + */ > +int > +virDomainEventCallbackQueuePush(virDomainEventQueuePtr evtQueue, > + virDomainPtr dom, > + virDomainEventType event) > +{ > + virDomainEventPtr domEvent; > + > + /* Check incoming */ > + if ( !evtQueue ) { > + return -1; > + } > + > + /* Allocate new event */ > + if (VIR_ALLOC(domEvent) < 0) { > + DEBUG0("Error allocating event"); > + return -1; > + } > + domEvent->dom = dom; > + domEvent->event = event; > + > + /* Make space on queue */ > + if (VIR_REALLOC_N(evtQueue->events, > + evtQueue->count + 1) < 0) { > + DEBUG0("Error reallocating queue"); > + VIR_FREE(domEvent); > + return -1; > + } > + > + evtQueue->events[evtQueue->count] = domEvent; > + evtQueue->count++; > + return 0; > +} > + > diff -r 0325a25d1762 src/domain_event.h > --- /dev/null Thu Jan 01 00:00:00 1970 +0000 > +++ b/src/domain_event.h Wed Oct 29 12:03:29 2008 +0000 > @@ -0,0 +1,83 @@ > +/* > + * domain_event.h: domain event queue processing helpers > + * > + * Copyright (C) 2008 VirtualIron > + * > + * This library is free software; you can redistribute it and/or > + * modify it under the terms of the GNU Lesser General Public > + * License as published by the Free Software Foundation; either > + * version 2.1 of the License, or (at your option) any later version. > + * > + * This library is distributed in the hope that it will be useful, > + * but WITHOUT ANY WARRANTY; without even the implied warranty of > + * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU > + * Lesser General Public License for more details. > + * > + * You should have received a copy of the GNU Lesser General Public > + * License along with this library; if not, write to the Free Software > + * Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA > + * > + * Author: Ben Guthro > + */ > + > +#include "internal.h" > + > + > +#ifndef __DOMAIN_EVENT_H__ > +#define __DOMAIN_EVENT_H__ > + > +struct _virDomainEventCallback { > + virConnectPtr conn; > + virConnectDomainEventCallback cb; > + void *opaque; > +}; > +typedef struct _virDomainEventCallback virDomainEventCallback; > +typedef virDomainEventCallback *virDomainEventCallbackPtr; > + > +struct _virDomainEventCallbackList { > + unsigned int count; > + virDomainEventCallbackPtr *callbacks; > +}; > +typedef struct _virDomainEventCallbackList virDomainEventCallbackList; > +typedef virDomainEventCallbackList *virDomainEventCallbackListPtr; > + > +void virDomainEventCallbackListFree(virDomainEventCallbackListPtr list); > + > +int virDomainEventCallbackListAdd(virConnectPtr conn, > + virDomainEventCallbackListPtr cbList, > + virConnectDomainEventCallback callback, > + void *opaque); > + > +int virDomainEventCallbackListRemove(virConnectPtr conn, > + virDomainEventCallbackListPtr cbList, > + virConnectDomainEventCallback callback); > + > +/** > + * Dispatching domain events that come in while > + * in a call / response rpc > + */ > +struct _virDomainEvent { > + virDomainPtr dom; > + virDomainEventType event; > +}; > +typedef struct _virDomainEvent virDomainEvent; > +typedef virDomainEvent *virDomainEventPtr; > + > +struct _virDomainEventQueue { > + unsigned int count; > + virDomainEventPtr *events; > +}; > +typedef struct _virDomainEventQueue virDomainEventQueue; > +typedef virDomainEventQueue *virDomainEventQueuePtr; > + > +int virDomainEventCallbackQueuePush(virDomainEventQueuePtr evtQueue, > + virDomainPtr dom, > + virDomainEventType event); > + > +virDomainEventPtr > +virDomainEventCallbackQueuePop(virDomainEventQueuePtr evtQueue); > + > +void virDomainEventQueueFree(virDomainEventQueuePtr queue); > + > + > +#endif > diff -r 0325a25d1762 src/internal.h > --- a/src/internal.h Wed Oct 29 11:48:08 2008 +0000 > +++ b/src/internal.h Wed Oct 29 12:03:29 2008 +0000 > @@ -294,77 +294,4 @@ > char key[PATH_MAX]; /* unique key for storage vol */ > }; > > - > -/** > - * Domain Event Notification > - */ > - > -struct _virDomainEventCallback { > - virConnectPtr conn; > - virConnectDomainEventCallback cb; > - void *opaque; > -}; > -typedef struct _virDomainEventCallback virDomainEventCallback; > -typedef virDomainEventCallback *virDomainEventCallbackPtr; > - > -struct _virDomainEventCallbackList { > - unsigned int count; > - virDomainEventCallbackPtr *callbacks; > -}; > -typedef struct _virDomainEventCallbackList virDomainEventCallbackList; > -typedef virDomainEventCallbackList *virDomainEventCallbackListPtr; > - > -void __virDomainEventCallbackListFree(virDomainEventCallbackListPtr list); > -#define virDomainEventCallbackListFree(x) __virDomainEventCallbackListFree(x) > - > -int __virDomainEventCallbackListAdd(virConnectPtr conn, > - virDomainEventCallbackListPtr cbList, > - virConnectDomainEventCallback callback, > - void *opaque); > -#define virDomainEventCallbackListAdd(a,b,c,d) \ > - __virDomainEventCallbackListAdd((a),(b),(c),(d)) > - > -int __virDomainEventCallbackListRemove(virConnectPtr conn, > - virDomainEventCallbackListPtr cbList, > - virConnectDomainEventCallback callback); > -#define virDomainEventCallbackListRemove(a,b,c) \ > - __virDomainEventCallbackListRemove((a),(b),(c)) > - > -int __virEventHandleTypeToPollEvent(virEventHandleType events); > -#define virEventHandleTypeToPollEvent(x) __virEventHandleTypeToPollEvent(x) > - > -virEventHandleType __virPollEventToEventHandleType(int events); > -#define virPollEventToEventHandleType(x) __virPollEventToEventHandleType(x) > - > -/** > - * Dispatching domain events that come in while > - * in a call / response rpc > - */ > -struct _virDomainEvent { > - virDomainPtr dom; > - virDomainEventType event; > -}; > -typedef struct _virDomainEvent virDomainEvent; > -typedef virDomainEvent *virDomainEventPtr; > - > -struct _virDomainEventQueue { > - unsigned int count; > - virDomainEventPtr *events; > -}; > -typedef struct _virDomainEventQueue virDomainEventQueue; > -typedef virDomainEventQueue *virDomainEventQueuePtr; > - > -int __virDomainEventCallbackQueuePush(virDomainEventQueuePtr evtQueue, > - virDomainPtr dom, > - virDomainEventType event); > -#define virDomainEventCallbackQueuePush(a,b,c) \ > - __virDomainEventCallbackQueuePush((a),(b),(c)) > - > -virDomainEventPtr > -__virDomainEventCallbackQueuePop(virDomainEventQueuePtr evtQueue); > -#define virDomainEventCallbackQueuePop(x) __virDomainEventCallbackQueuePop(x) > - > -void __virDomainEventQueueFree(virDomainEventQueuePtr queue); > -#define virDomainEventQueueFree(x) __virDomainEventQueueFree(x) > - > #endif /* __VIR_INTERNAL_H__ */ > diff -r 0325a25d1762 src/libvirt.c > --- a/src/libvirt.c Wed Oct 29 11:48:08 2008 +0000 > +++ b/src/libvirt.c Wed Oct 29 12:03:29 2008 +0000 > @@ -5371,207 +5371,6 @@ > return -1; > } > > -/** > - * __virDomainEventCallbackListFree: > - * @list: event callback list head > - * > - * Free the memory in the domain event callback list > - */ > -void > -__virDomainEventCallbackListFree(virDomainEventCallbackListPtr list) > -{ > - int i; > - for (i=0; i<list->count; i++) { > - VIR_FREE(list->callbacks[i]); > - } > - VIR_FREE(list); > -} > -/** > - * __virDomainEventCallbackListRemove: > - * @conn: pointer to the connection > - * @cbList: the list > - * @callback: the callback to remove > - * > - * Internal function to remove a callback from a virDomainEventCallbackListPtr > - */ > -int > -__virDomainEventCallbackListRemove(virConnectPtr conn, > - virDomainEventCallbackListPtr cbList, > - virConnectDomainEventCallback callback) > -{ > - int i; > - for (i = 0 ; i < cbList->count ; i++) { > - if(cbList->callbacks[i]->cb == callback && > - cbList->callbacks[i]->conn == conn) { > - virUnrefConnect(cbList->callbacks[i]->conn); > - VIR_FREE(cbList->callbacks[i]); > - > - if (i < (cbList->count - 1)) > - memmove(cbList->callbacks + i, > - cbList->callbacks + i + 1, > - sizeof(*(cbList->callbacks)) * > - (cbList->count - (i + 1))); > - > - if (VIR_REALLOC_N(cbList->callbacks, > - cbList->count - 1) < 0) { > - ; /* Failure to reduce memory allocation isn't fatal */ > - } > - cbList->count--; > - > - return 0; > - } > - } > - return -1; > -} > - > -/** > - * __virDomainEventCallbackListAdd: > - * @conn: pointer to the connection > - * @cbList: the list > - * @callback: the callback to add > - * @opaque: opaque data tio pass to callback > - * > - * Internal function to add a callback from a virDomainEventCallbackListPtr > - */ > -int > -__virDomainEventCallbackListAdd(virConnectPtr conn, > - virDomainEventCallbackListPtr cbList, > - virConnectDomainEventCallback callback, > - void *opaque) > -{ > - virDomainEventCallbackPtr event; > - int n; > - > - /* Check incoming */ > - if ( !cbList ) { > - return -1; > - } > - > - /* check if we already have this callback on our list */ > - for (n=0; n < cbList->count; n++) { > - if(cbList->callbacks[n]->cb == callback && > - conn == cbList->callbacks[n]->conn) { > - DEBUG0("WARNING: Callback already tracked"); > - return -1; > - } > - } > - /* Allocate new event */ > - if (VIR_ALLOC(event) < 0) { > - DEBUG0("Error allocating event"); > - return -1; > - } > - event->conn = conn; > - event->cb = callback; > - event->opaque = opaque; > - > - /* Make space on list */ > - n = cbList->count; > - if (VIR_REALLOC_N(cbList->callbacks, n + 1) < 0) { > - DEBUG0("Error reallocating list"); > - VIR_FREE(event); > - return -1; > - } > - > - event->conn->refs++; > - > - cbList->callbacks[n] = event; > - cbList->count++; > - return 0; > -} > - > -/** > - * __virDomainEventQueueFree: > - * @queue: pointer to the queue > - * > - * Free the memory in the queue. We process this like a list here > - */ > -void > -__virDomainEventQueueFree(virDomainEventQueuePtr queue) > -{ > - int i; > - for ( i=0 ; i<queue->count ; i++ ) { > - VIR_FREE(queue->events[i]); > - } > - VIR_FREE(queue); > -} > - > -/** > - * __virDomainEventCallbackQueuePop: > - * @evtQueue: the queue of events > - * > - * Internal function to pop off, and return the front of the queue > - * NOTE: The caller is responsible for freeing the returned object > - * > - * Returns: virDomainEventPtr on success NULL on failure. > - */ > -virDomainEventPtr > -__virDomainEventCallbackQueuePop(virDomainEventQueuePtr evtQueue) > -{ > - virDomainEventPtr ret; > - > - if(!evtQueue || evtQueue->count == 0 ) > - return NULL; > - > - ret = evtQueue->events[0]; > - > - memmove(evtQueue->events, > - evtQueue->events + 1, > - sizeof(*(evtQueue->events)) * > - (evtQueue->count - 1)); > - > - if (VIR_REALLOC_N(evtQueue->events, > - evtQueue->count - 1) < 0) { > - ; /* Failure to reduce memory allocation isn't fatal */ > - } > - evtQueue->count--; > - > - return ret; > -} > - > -/** > - * __virDomainEventCallbackQueuePush: > - * @evtQueue: the dom event queue > - * @dom: the domain to add > - * @event: the event to add > - * > - * Internal function to push onto the back of an virDomainEventQueue > - * > - * Returns: 0 on success, -1 on failure > - */ > -int > -__virDomainEventCallbackQueuePush(virDomainEventQueuePtr evtQueue, > - virDomainPtr dom, > - virDomainEventType event) > -{ > - virDomainEventPtr domEvent; > - > - /* Check incoming */ > - if ( !evtQueue ) { > - return -1; > - } > - > - /* Allocate new event */ > - if (VIR_ALLOC(domEvent) < 0) { > - DEBUG0("Error allocating event"); > - return -1; > - } > - domEvent->dom = dom; > - domEvent->event = event; > - > - /* Make space on queue */ > - if (VIR_REALLOC_N(evtQueue->events, > - evtQueue->count + 1) < 0) { > - DEBUG0("Error reallocating queue"); > - VIR_FREE(domEvent); > - return -1; > - } > - > - evtQueue->events[evtQueue->count] = domEvent; > - evtQueue->count++; > - return 0; > -} > - > - > > /************************************************************************ > * * > diff -r 0325a25d1762 src/qemu_conf.h > --- a/src/qemu_conf.h Wed Oct 29 11:48:08 2008 +0000 > +++ b/src/qemu_conf.h Wed Oct 29 12:03:29 2008 +0000 > @@ -31,6 +31,7 @@ > #include "capabilities.h" > #include "network_conf.h" > #include "domain_conf.h" > +#include "domain_event.h" > > #define qemudDebug(fmt, ...) do {} while(0) > > diff -r 0325a25d1762 src/remote_internal.c > --- a/src/remote_internal.c Wed Oct 29 11:48:08 2008 +0000 > +++ b/src/remote_internal.c Wed Oct 29 12:03:29 2008 +0000 > @@ -75,6 +75,7 @@ > > #include "virterror.h" > #include "libvirt.h" > +#include "domain_event.h" > #include "driver.h" > #include "buf.h" > #include "qparams.h" > > -- Libvir-list mailing list Libvir-list@xxxxxxxxxx https://www.redhat.com/mailman/listinfo/libvir-list