[libvirt] [PATCH 1/7] domain_event: Add virDomainEventState structure
Daniel P. Berrange
berrange at redhat.com
Fri May 13 09:22:41 UTC 2011
On Thu, May 12, 2011 at 01:14:25PM -0400, Cole Robinson wrote:
> This structure will be used to unify lots of duplicated event handling code
> across the state drivers.
>
> v2:
> Check for state == NULL in StateFree
> Add NONNULL tagging
> Use bool for isDispatching
>
> Signed-off-by: Cole Robinson <crobinso at redhat.com>
> ---
> cfg.mk | 1 +
> src/conf/domain_event.c | 94 ++++++++++++++++++++++++++++++++++++----------
> src/conf/domain_event.h | 48 ++++++++++++++++-------
> src/libvirt_private.syms | 2 +
> 4 files changed, 111 insertions(+), 34 deletions(-)
>
> diff --git a/cfg.mk b/cfg.mk
> index cb059f5..06b638b 100644
> --- a/cfg.mk
> +++ b/cfg.mk
> @@ -103,6 +103,7 @@ useless_free_options = \
> --name=virDomainEventCallbackListFree \
> --name=virDomainEventFree \
> --name=virDomainEventQueueFree \
> + --name=virDomainEventStateFree \
> --name=virDomainFSDefFree \
> --name=virDomainGraphicsDefFree \
> --name=virDomainHostdevDefFree \
> diff --git a/src/conf/domain_event.c b/src/conf/domain_event.c
> index 688bf6c..2771887 100644
> --- a/src/conf/domain_event.c
> +++ b/src/conf/domain_event.c
> @@ -24,6 +24,7 @@
> #include <config.h>
>
> #include "domain_event.h"
> +#include "event.h"
> #include "logging.h"
> #include "datatypes.h"
> #include "memory.h"
> @@ -505,6 +506,25 @@ void virDomainEventFree(virDomainEventPtr event)
> VIR_FREE(event);
> }
>
> +/**
> + * 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;
> + if (!queue)
> + return;
> +
> + for (i = 0; i < queue->count ; i++) {
> + virDomainEventFree(queue->events[i]);
> + }
> + VIR_FREE(queue->events);
> + VIR_FREE(queue);
> +}
>
> virDomainEventQueuePtr virDomainEventQueueNew(void)
> {
> @@ -518,6 +538,60 @@ virDomainEventQueuePtr virDomainEventQueueNew(void)
> return ret;
> }
>
> +/**
> + * virDomainEventStateFree:
> + * @list: virDomainEventStatePtr to free
> + *
> + * Free a virDomainEventStatePtr and its members, and unregister the timer.
> + */
> +void
> +virDomainEventStateFree(virDomainEventStatePtr state)
> +{
> + if (!state)
> + return;
> +
> + virDomainEventCallbackListFree(state->callbacks);
> + virDomainEventQueueFree(state->queue);
> +
> + if (state->timer != -1)
> + virEventRemoveTimeout(state->timer);
> +}
> +
> +virDomainEventStatePtr
> +virDomainEventStateNew(virEventTimeoutCallback timeout_cb,
> + void *timeout_opaque,
> + virFreeCallback timeout_free)
> +{
> + virDomainEventStatePtr state = NULL;
> +
> + if (VIR_ALLOC(state) < 0) {
> + virReportOOMError();
> + goto error;
> + }
> +
> + if (VIR_ALLOC(state->callbacks) < 0) {
> + virReportOOMError();
> + goto error;
> + }
> +
> + if (!(state->queue = virDomainEventQueueNew())) {
> + goto error;
> + }
> +
> + if ((state->timer = virEventAddTimeout(-1,
> + timeout_cb,
> + timeout_opaque,
> + timeout_free)) < 0) {
> + goto error;
> + }
> +
> + return state;
> +
> +error:
> + virDomainEventStateFree(state);
> + return NULL;
> +}
> +
> static virDomainEventPtr virDomainEventNewInternal(int eventID,
> int id,
> const char *name,
> @@ -784,26 +858,6 @@ virDomainEventPtr virDomainEventGraphicsNewFromObj(virDomainObjPtr obj,
>
>
> /**
> - * 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;
> - if (!queue)
> - return;
> -
> - for (i = 0; i < queue->count ; i++) {
> - virDomainEventFree(queue->events[i]);
> - }
> - VIR_FREE(queue->events);
> - VIR_FREE(queue);
> -}
> -
> -/**
> * virDomainEventQueuePop:
> * @evtQueue: the queue of events
> *
> diff --git a/src/conf/domain_event.h b/src/conf/domain_event.h
> index c03a159..2ac3ecc 100644
> --- a/src/conf/domain_event.h
> +++ b/src/conf/domain_event.h
> @@ -25,6 +25,7 @@
> #ifndef __DOMAIN_EVENT_H__
> # define __DOMAIN_EVENT_H__
>
> +# include "event.h"
> # include "domain_conf.h"
>
> typedef struct _virDomainEventCallback virDomainEventCallback;
> @@ -38,6 +39,33 @@ struct _virDomainEventCallbackList {
> typedef struct _virDomainEventCallbackList virDomainEventCallbackList;
> typedef virDomainEventCallbackList *virDomainEventCallbackListPtr;
>
> +/**
> + * Dispatching domain events that come in while
> + * in a call / response rpc
> + */
> +typedef struct _virDomainEvent virDomainEvent;
> +typedef virDomainEvent *virDomainEventPtr;
> +
> +struct _virDomainEventQueue {
> + unsigned int count;
> + virDomainEventPtr *events;
> +};
> +typedef struct _virDomainEventQueue virDomainEventQueue;
> +typedef virDomainEventQueue *virDomainEventQueuePtr;
> +
> +struct _virDomainEventState {
> + /* The list of domain event callbacks */
> + virDomainEventCallbackListPtr callbacks;
> + /* The queue of domain events */
> + virDomainEventQueuePtr queue;
> + /* Timer for flushing events queue */
> + int timer;
> + /* Flag if we're in process of dispatching */
> + bool isDispatching;
> +};
If possible, it would be desirable to make these two struct impls
private in domain_event.c
> +typedef struct _virDomainEventState virDomainEventState;
> +typedef virDomainEventState *virDomainEventStatePtr;
> +
> void virDomainEventCallbackListFree(virDomainEventCallbackListPtr list);
>
> int virDomainEventCallbackListAdd(virConnectPtr conn,
> @@ -91,20 +119,6 @@ int virDomainEventCallbackListEventID(virConnectPtr conn,
> int callbackID)
> ATTRIBUTE_NONNULL(1);
>
> -/**
> - * Dispatching domain events that come in while
> - * in a call / response rpc
> - */
> -typedef struct _virDomainEvent virDomainEvent;
> -typedef virDomainEvent *virDomainEventPtr;
> -
> -struct _virDomainEventQueue {
> - unsigned int count;
> - virDomainEventPtr *events;
> -};
> -typedef struct _virDomainEventQueue virDomainEventQueue;
> -typedef virDomainEventQueue *virDomainEventQueuePtr;
> -
> virDomainEventQueuePtr virDomainEventQueueNew(void);
>
> virDomainEventPtr virDomainEventNew(int id, const char *name, const unsigned char *uuid, int type, int detail);
> @@ -164,6 +178,12 @@ virDomainEventQueuePop(virDomainEventQueuePtr evtQueue);
>
> void virDomainEventFree(virDomainEventPtr event);
> void virDomainEventQueueFree(virDomainEventQueuePtr queue);
> +void virDomainEventStateFree(virDomainEventStatePtr state);
> +virDomainEventStatePtr
> +virDomainEventStateNew(virEventTimeoutCallback timeout_cb,
> + void *timeout_opaque,
> + virFreeCallback timeout_free)
> + ATTRIBUTE_NONNULL(1);
>
> typedef void (*virDomainEventDispatchFunc)(virConnectPtr conn,
> virDomainEventPtr event,
> diff --git a/src/libvirt_private.syms b/src/libvirt_private.syms
> index 7e5b1d7..d4ad0c8 100644
> --- a/src/libvirt_private.syms
> +++ b/src/libvirt_private.syms
> @@ -389,6 +389,8 @@ virDomainEventRTCChangeNewFromObj;
> virDomainEventRebootNew;
> virDomainEventRebootNewFromDom;
> virDomainEventRebootNewFromObj;
> +virDomainEventStateFree;
> +virDomainEventStateNew;
> virDomainEventWatchdogNewFromDom;
> virDomainEventWatchdogNewFromObj;
ACK
Daniel
--
|: http://berrange.com -o- http://www.flickr.com/photos/dberrange/ :|
|: http://libvirt.org -o- http://virt-manager.org :|
|: http://autobuild.org -o- http://search.cpan.org/~danberr/ :|
|: http://entangle-photo.org -o- http://live.gnome.org/gtk-vnc :|
More information about the libvir-list
mailing list