This is a re-diff of the patch I sent yesterday to just move the domain events code into its own separate file. 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 | 72 --------------- src/libvirt.c | 203 -------------------------------------------- src/qemu_conf.h | 1 src/remote_internal.c | 1 9 files changed, 327 insertions(+), 278 deletions(-) Daniel diff -r f9233a3621e6 qemud/event.c --- a/qemud/event.c Wed Oct 29 15:51:13 2008 +0000 +++ b/qemud/event.c Wed Oct 29 15:58:26 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 f9233a3621e6 qemud/event.h --- a/qemud/event.h Wed Oct 29 15:51:13 2008 +0000 +++ b/qemud/event.h Wed Oct 29 15:58:26 2008 +0000 @@ -105,4 +105,11 @@ */ int virEventRunOnce(void); +int +virEventHandleTypeToPollEvent(int events); +int +virPollEventToEventHandleType(int events); + + + #endif /* __VIRTD_EVENT_H__ */ diff -r f9233a3621e6 src/Makefile.am --- a/src/Makefile.am Wed Oct 29 15:51:13 2008 +0000 +++ b/src/Makefile.am Wed Oct 29 15:58:26 2008 +0000 @@ -150,6 +150,7 @@ driver.h \ internal.h \ datatypes.c datatypes.h \ + domain_event.c domain_event.h \ libvirt.c libvirt_internal.h \ $(GENERIC_LIB_SOURCES) \ $(DOMAIN_CONF_SOURCES) \ diff -r f9233a3621e6 src/domain_event.c --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/domain_event.c Wed Oct 29 15:58:26 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 "datatypes.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 f9233a3621e6 src/domain_event.h --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/src/domain_event.h Wed Oct 29 15:58:26 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 f9233a3621e6 src/internal.h --- a/src/internal.h Wed Oct 29 15:51:13 2008 +0000 +++ b/src/internal.h Wed Oct 29 15:58:26 2008 +0000 @@ -139,76 +139,4 @@ fprintf(stderr, "Unimplemented block at %s:%d\n", \ __FILE__, __LINE__); -/** - * 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 f9233a3621e6 src/libvirt.c --- a/src/libvirt.c Wed Oct 29 15:51:13 2008 +0000 +++ b/src/libvirt.c Wed Oct 29 15:58:26 2008 +0000 @@ -5364,205 +5364,4 @@ 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 f9233a3621e6 src/qemu_conf.h --- a/src/qemu_conf.h Wed Oct 29 15:51:13 2008 +0000 +++ b/src/qemu_conf.h Wed Oct 29 15:58:26 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 f9233a3621e6 src/remote_internal.c --- a/src/remote_internal.c Wed Oct 29 15:51:13 2008 +0000 +++ b/src/remote_internal.c Wed Oct 29 15:58:26 2008 +0000 @@ -75,6 +75,7 @@ #include "virterror_internal.h" #include "datatypes.h" +#include "domain_event.h" #include "driver.h" #include "buf.h" #include "qparams.h" -- |: 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