Add a virFreeCallback to event loop APIs

This commit is contained in:
Daniel P. Berrange 2008-11-19 16:24:01 +00:00
parent 6d41cb87d3
commit 6d04effac7
16 changed files with 202 additions and 55 deletions

View File

@ -1,3 +1,15 @@
Wed Nov 19 16:22:00 GMT 2008 Daniel Berrange <berrange@redhat.com>
Add virFreeCallback to event loop APIs.
* include/libvirt/libvirt.h.in: Add a virFreeCallback arg
to the virEventAddHandle and virEventAddTimeout methods.
* qemud/event.c: Invoke the virFreeCallback when releasing
a handle/timer event
* qemud/event.h, qemud/qemud.c, qemud/mdns.c,
src/event.h, src/event.c, src/lxc_driver.c,
src/qemu_driver.c, src/remote_internal.c: Update to pass
around the virFreeCallback where needed
Wed Nov 19 16:15:00 GMT 2008 Daniel Berrange <berrange@redhat.com> Wed Nov 19 16:15:00 GMT 2008 Daniel Berrange <berrange@redhat.com>
* include/libvirt/libvirt.h.in: Change semantics of AddHandle * include/libvirt/libvirt.h.in: Change semantics of AddHandle

View File

@ -24,6 +24,7 @@
int h_fd = 0; int h_fd = 0;
virEventHandleType h_event = 0; virEventHandleType h_event = 0;
virEventHandleCallback h_cb = NULL; virEventHandleCallback h_cb = NULL;
virFreeCallback h_ff = NULL;
void *h_opaque = NULL; void *h_opaque = NULL;
/* timeout globals */ /* timeout globals */
@ -31,6 +32,7 @@ void *h_opaque = NULL;
int t_active = 0; int t_active = 0;
int t_timeout = -1; int t_timeout = -1;
virEventTimeoutCallback t_cb = NULL; virEventTimeoutCallback t_cb = NULL;
virFreeCallback t_ff = NULL;
void *t_opaque = NULL; void *t_opaque = NULL;
@ -41,12 +43,16 @@ int myDomainEventCallback1 (virConnectPtr conn, virDomainPtr dom,
int myDomainEventCallback2 (virConnectPtr conn, virDomainPtr dom, int myDomainEventCallback2 (virConnectPtr conn, virDomainPtr dom,
int event, int detail, void *opaque); int event, int detail, void *opaque);
int myEventAddHandleFunc (int fd, int event, int myEventAddHandleFunc (int fd, int event,
virEventHandleCallback cb, void *opaque); virEventHandleCallback cb,
void *opaque,
virFreeCallback ff);
void myEventUpdateHandleFunc(int watch, int event); void myEventUpdateHandleFunc(int watch, int event);
int myEventRemoveHandleFunc(int watch); int myEventRemoveHandleFunc(int watch);
int myEventAddTimeoutFunc(int timeout, virEventTimeoutCallback cb, int myEventAddTimeoutFunc(int timeout,
void *opaque); virEventTimeoutCallback cb,
void *opaque,
virFreeCallback ff);
void myEventUpdateTimeoutFunc(int timer, int timout); void myEventUpdateTimeoutFunc(int timer, int timout);
int myEventRemoveTimeoutFunc(int timer); int myEventRemoveTimeoutFunc(int timer);
@ -208,12 +214,15 @@ virEventHandleType myPollEventToEventHandleType(int events)
} }
int myEventAddHandleFunc(int fd, int event, int myEventAddHandleFunc(int fd, int event,
virEventHandleCallback cb, void *opaque) virEventHandleCallback cb,
void *opaque,
virFreeCallback ff)
{ {
DEBUG("Add handle %d %d %p %p", fd, event, cb, opaque); DEBUG("Add handle %d %d %p %p", fd, event, cb, opaque);
h_fd = fd; h_fd = fd;
h_event = myEventHandleTypeToPollEvent(event); h_event = myEventHandleTypeToPollEvent(event);
h_cb = cb; h_cb = cb;
h_ff = ff;
h_opaque = opaque; h_opaque = opaque;
return 0; return 0;
} }
@ -229,16 +238,21 @@ int myEventRemoveHandleFunc(int fd)
{ {
DEBUG("Removed Handle %d", fd); DEBUG("Removed Handle %d", fd);
h_fd = 0; h_fd = 0;
if (h_ff)
(h_ff)(h_opaque);
return 0; return 0;
} }
int myEventAddTimeoutFunc(int timeout, virEventTimeoutCallback cb, int myEventAddTimeoutFunc(int timeout,
void *opaque) virEventTimeoutCallback cb,
void *opaque,
virFreeCallback ff)
{ {
DEBUG("Adding Timeout %d %p %p", timeout, cb, opaque); DEBUG("Adding Timeout %d %p %p", timeout, cb, opaque);
t_active = 1; t_active = 1;
t_timeout = timeout; t_timeout = timeout;
t_cb = cb; t_cb = cb;
t_ff = ff;
t_opaque = opaque; t_opaque = opaque;
return 0; return 0;
} }
@ -253,6 +267,8 @@ int myEventRemoveTimeoutFunc(int timer)
{ {
DEBUG("Timeout removed %d", timer); DEBUG("Timeout removed %d", timer);
t_active = 0; t_active = 0;
if (t_ff)
(t_ff)(t_opaque);
return 0; return 0;
} }

View File

@ -1138,18 +1138,25 @@ typedef void (*virEventHandleCallback)(int watch, int fd, int events, void *opaq
* virEventAddHandleFunc: * virEventAddHandleFunc:
* @fd: file descriptor to listen on * @fd: file descriptor to listen on
* @event: bitset of events on which to fire the callback * @event: bitset of events on which to fire the callback
* @cb: the callback to be called * @cb: the callback to be called when an event occurrs
* @opaque: user data to pass to the callback * @opaque: user data to pass to the callback
* @ff: the callback invoked to free opaque data blob
* *
* Part of the EventImpl, this callback Adds a file handle callback to * Part of the EventImpl, this callback Adds a file handle callback to
* listen for specific events. The same file handle can be registered * listen for specific events. The same file handle can be registered
* multiple times provided the requested event sets are non-overlapping * multiple times provided the requested event sets are non-overlapping
* *
* If the opaque user data requires free'ing when the handle
* is unregistered, then a 2nd callback can be supplied for
* this purpose.
*
* Returns a handle watch number to be used for updating * Returns a handle watch number to be used for updating
* and unregistering for events * and unregistering for events
*/ */
typedef int (*virEventAddHandleFunc)(int fd, int event, typedef int (*virEventAddHandleFunc)(int fd, int event,
virEventHandleCallback cb, void *opaque); virEventHandleCallback cb,
void *opaque,
virFreeCallback ff);
/** /**
* virEventUpdateHandleFunc: * virEventUpdateHandleFunc:
@ -1166,7 +1173,11 @@ typedef void (*virEventUpdateHandleFunc)(int watch, int event);
* @watch: file descriptor watch to stop listening on * @watch: file descriptor watch to stop listening on
* *
* Part of the EventImpl, this user-provided callback is notified when * Part of the EventImpl, this user-provided callback is notified when
* an fd is no longer being listened on * an fd is no longer being listened on.
*
* If a virEventHandleFreeFunc was supplied when the handle was
* registered, it will be invoked some time during, or after this
* function call, when it is safe to release the user data.
*/ */
typedef int (*virEventRemoveHandleFunc)(int watch); typedef int (*virEventRemoveHandleFunc)(int watch);
@ -1185,14 +1196,21 @@ typedef void (*virEventTimeoutCallback)(int timer, void *opaque);
* @timeout: The timeout to monitor * @timeout: The timeout to monitor
* @cb: the callback to call when timeout has expired * @cb: the callback to call when timeout has expired
* @opaque: user data to pass to the callback * @opaque: user data to pass to the callback
* @ff: the callback invoked to free opaque data blob
* *
* Part of the EventImpl, this user-defined callback handles adding an * Part of the EventImpl, this user-defined callback handles adding an
* event timeout. * event timeout.
* *
* If the opaque user data requires free'ing when the handle
* is unregistered, then a 2nd callback can be supplied for
* this purpose.
*
* Returns a timer value * Returns a timer value
*/ */
typedef int (*virEventAddTimeoutFunc)(int timeout, virEventTimeoutCallback cb, typedef int (*virEventAddTimeoutFunc)(int timeout,
void *opaque); virEventTimeoutCallback cb,
void *opaque,
virFreeCallback ff);
/** /**
* virEventUpdateTimeoutFunc: * virEventUpdateTimeoutFunc:
@ -1210,6 +1228,10 @@ typedef void (*virEventUpdateTimeoutFunc)(int timer, int timeout);
* *
* Part of the EventImpl, this user-defined callback removes a timer * Part of the EventImpl, this user-defined callback removes a timer
* *
* If a virEventTimeoutFreeFunc was supplied when the handle was
* registered, it will be invoked some time during, or after this
* function call, when it is safe to release the user data.
*
* Returns 0 on success, -1 on failure * Returns 0 on success, -1 on failure
*/ */
typedef int (*virEventRemoveTimeoutFunc)(int timer); typedef int (*virEventRemoveTimeoutFunc)(int timer);

View File

@ -1138,18 +1138,25 @@ typedef void (*virEventHandleCallback)(int watch, int fd, int events, void *opaq
* virEventAddHandleFunc: * virEventAddHandleFunc:
* @fd: file descriptor to listen on * @fd: file descriptor to listen on
* @event: bitset of events on which to fire the callback * @event: bitset of events on which to fire the callback
* @cb: the callback to be called * @cb: the callback to be called when an event occurrs
* @opaque: user data to pass to the callback * @opaque: user data to pass to the callback
* @ff: the callback invoked to free opaque data blob
* *
* Part of the EventImpl, this callback Adds a file handle callback to * Part of the EventImpl, this callback Adds a file handle callback to
* listen for specific events. The same file handle can be registered * listen for specific events. The same file handle can be registered
* multiple times provided the requested event sets are non-overlapping * multiple times provided the requested event sets are non-overlapping
* *
* If the opaque user data requires free'ing when the handle
* is unregistered, then a 2nd callback can be supplied for
* this purpose.
*
* Returns a handle watch number to be used for updating * Returns a handle watch number to be used for updating
* and unregistering for events * and unregistering for events
*/ */
typedef int (*virEventAddHandleFunc)(int fd, int event, typedef int (*virEventAddHandleFunc)(int fd, int event,
virEventHandleCallback cb, void *opaque); virEventHandleCallback cb,
void *opaque,
virFreeCallback ff);
/** /**
* virEventUpdateHandleFunc: * virEventUpdateHandleFunc:
@ -1166,7 +1173,11 @@ typedef void (*virEventUpdateHandleFunc)(int watch, int event);
* @watch: file descriptor watch to stop listening on * @watch: file descriptor watch to stop listening on
* *
* Part of the EventImpl, this user-provided callback is notified when * Part of the EventImpl, this user-provided callback is notified when
* an fd is no longer being listened on * an fd is no longer being listened on.
*
* If a virEventHandleFreeFunc was supplied when the handle was
* registered, it will be invoked some time during, or after this
* function call, when it is safe to release the user data.
*/ */
typedef int (*virEventRemoveHandleFunc)(int watch); typedef int (*virEventRemoveHandleFunc)(int watch);
@ -1185,14 +1196,21 @@ typedef void (*virEventTimeoutCallback)(int timer, void *opaque);
* @timeout: The timeout to monitor * @timeout: The timeout to monitor
* @cb: the callback to call when timeout has expired * @cb: the callback to call when timeout has expired
* @opaque: user data to pass to the callback * @opaque: user data to pass to the callback
* @ff: the callback invoked to free opaque data blob
* *
* Part of the EventImpl, this user-defined callback handles adding an * Part of the EventImpl, this user-defined callback handles adding an
* event timeout. * event timeout.
* *
* If the opaque user data requires free'ing when the handle
* is unregistered, then a 2nd callback can be supplied for
* this purpose.
*
* Returns a timer value * Returns a timer value
*/ */
typedef int (*virEventAddTimeoutFunc)(int timeout, virEventTimeoutCallback cb, typedef int (*virEventAddTimeoutFunc)(int timeout,
void *opaque); virEventTimeoutCallback cb,
void *opaque,
virFreeCallback ff);
/** /**
* virEventUpdateTimeoutFunc: * virEventUpdateTimeoutFunc:
@ -1210,6 +1228,10 @@ typedef void (*virEventUpdateTimeoutFunc)(int timer, int timeout);
* *
* Part of the EventImpl, this user-defined callback removes a timer * Part of the EventImpl, this user-defined callback removes a timer
* *
* If a virEventTimeoutFreeFunc was supplied when the handle was
* registered, it will be invoked some time during, or after this
* function call, when it is safe to release the user data.
*
* Returns 0 on success, -1 on failure * Returns 0 on success, -1 on failure
*/ */
typedef int (*virEventRemoveTimeoutFunc)(int timer); typedef int (*virEventRemoveTimeoutFunc)(int timer);

View File

@ -1704,12 +1704,16 @@ static PyObject *removeTimeoutObj = NULL;
static int static int
libvirt_virEventAddHandleFunc (int fd ATTRIBUTE_UNUSED, int event ATTRIBUTE_UNUSED, libvirt_virEventAddHandleFunc (int fd,
virEventHandleCallback cb, void *opaque) int event,
virEventHandleCallback cb,
void *opaque,
virFreeCallback ff)
{ {
PyObject *result = NULL; PyObject *result = NULL;
PyObject *python_cb; PyObject *python_cb;
PyObject *cb_obj; PyObject *cb_obj;
PyObject *ff_obj;
PyObject *opaque_obj; PyObject *opaque_obj;
PyObject *cb_args; PyObject *cb_args;
PyObject *pyobj_args; PyObject *pyobj_args;
@ -1730,11 +1734,13 @@ libvirt_virEventAddHandleFunc (int fd ATTRIBUTE_UNUSED, int event ATTRIBUTE_UNU
/* create tuple for cb */ /* create tuple for cb */
cb_obj = libvirt_virEventHandleCallbackWrap(cb); cb_obj = libvirt_virEventHandleCallbackWrap(cb);
ff_obj = libvirt_virFreeCallbackWrap(ff);
opaque_obj = libvirt_virVoidPtrWrap(opaque); opaque_obj = libvirt_virVoidPtrWrap(opaque);
cb_args = PyTuple_New(2); cb_args = PyTuple_New(3);
PyTuple_SetItem(cb_args, 0, cb_obj); PyTuple_SetItem(cb_args, 0, cb_obj);
PyTuple_SetItem(cb_args, 1, opaque_obj); PyTuple_SetItem(cb_args, 1, opaque_obj);
PyTuple_SetItem(cb_args, 2, ff_obj);
pyobj_args = PyTuple_New(4); pyobj_args = PyTuple_New(4);
PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(fd)); PyTuple_SetItem(pyobj_args, 0, libvirt_intWrap(fd));
@ -1799,14 +1805,17 @@ libvirt_virEventRemoveHandleFunc(int fd)
} }
static int static int
libvirt_virEventAddTimeoutFunc(int timeout, virEventTimeoutCallback cb, libvirt_virEventAddTimeoutFunc(int timeout,
void *opaque) virEventTimeoutCallback cb,
void *opaque,
virFreeCallback ff)
{ {
PyObject *result = NULL; PyObject *result = NULL;
PyObject *python_cb; PyObject *python_cb;
PyObject *cb_obj; PyObject *cb_obj;
PyObject *ff_obj;
PyObject *opaque_obj; PyObject *opaque_obj;
PyObject *cb_args; PyObject *cb_args;
PyObject *pyobj_args; PyObject *pyobj_args;
@ -1827,11 +1836,13 @@ libvirt_virEventAddTimeoutFunc(int timeout, virEventTimeoutCallback cb,
/* create tuple for cb */ /* create tuple for cb */
cb_obj = libvirt_virEventTimeoutCallbackWrap(cb); cb_obj = libvirt_virEventTimeoutCallbackWrap(cb);
ff_obj = libvirt_virFreeCallbackWrap(ff);
opaque_obj = libvirt_virVoidPtrWrap(opaque); opaque_obj = libvirt_virVoidPtrWrap(opaque);
cb_args = PyTuple_New(2); cb_args = PyTuple_New(3);
PyTuple_SetItem(cb_args, 0, cb_obj); PyTuple_SetItem(cb_args, 0, cb_obj);
PyTuple_SetItem(cb_args, 1, opaque_obj); PyTuple_SetItem(cb_args, 1, opaque_obj);
PyTuple_SetItem(cb_args, 2, ff_obj);
pyobj_args = PyTuple_New(3); pyobj_args = PyTuple_New(3);

View File

@ -103,6 +103,7 @@ PyObject * libvirt_virStoragePoolPtrWrap(virStoragePoolPtr node);
PyObject * libvirt_virStorageVolPtrWrap(virStorageVolPtr node); PyObject * libvirt_virStorageVolPtrWrap(virStorageVolPtr node);
PyObject * libvirt_virEventHandleCallbackWrap(virEventHandleCallback node); PyObject * libvirt_virEventHandleCallbackWrap(virEventHandleCallback node);
PyObject * libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node); PyObject * libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node);
PyObject * libvirt_virFreeCallbackWrap(virFreeCallback node);
PyObject * libvirt_virVoidPtrWrap(void* node); PyObject * libvirt_virVoidPtrWrap(void* node);
/* Provide simple macro statement wrappers (adapted from GLib, in turn from Perl): /* Provide simple macro statement wrappers (adapted from GLib, in turn from Perl):

View File

@ -195,6 +195,22 @@ libvirt_virEventTimeoutCallbackWrap(virEventTimeoutCallback node)
return (ret); return (ret);
} }
PyObject *
libvirt_virFreeCallbackWrap(virFreeCallback node)
{
PyObject *ret;
if (node == NULL) {
printf("%s: WARNING - Wrapping None\n", __FUNCTION__);
Py_INCREF(Py_None);
return (Py_None);
}
ret =
PyCObject_FromVoidPtrAndDesc((void *) node, (char *) "virFreeCallback",
NULL);
return (ret);
}
PyObject * PyObject *
libvirt_virVoidPtrWrap(void* node) libvirt_virVoidPtrWrap(void* node)
{ {

View File

@ -41,6 +41,7 @@ struct virEventHandle {
int fd; int fd;
int events; int events;
virEventHandleCallback cb; virEventHandleCallback cb;
virFreeCallback ff;
void *opaque; void *opaque;
int deleted; int deleted;
}; };
@ -51,6 +52,7 @@ struct virEventTimeout {
int frequency; int frequency;
unsigned long long expiresAt; unsigned long long expiresAt;
virEventTimeoutCallback cb; virEventTimeoutCallback cb;
virFreeCallback ff;
void *opaque; void *opaque;
int deleted; int deleted;
}; };
@ -83,8 +85,10 @@ static int nextTimer = 0;
* NB, it *must* be safe to call this from within a callback * NB, it *must* be safe to call this from within a callback
* For this reason we only ever append to existing list. * For this reason we only ever append to existing list.
*/ */
int virEventAddHandleImpl(int fd, int events, virEventHandleCallback cb, int virEventAddHandleImpl(int fd, int events,
void *opaque) { virEventHandleCallback cb,
void *opaque,
virFreeCallback ff) {
EVENT_DEBUG("Add handle %d %d %p %p", fd, events, cb, opaque); EVENT_DEBUG("Add handle %d %d %p %p", fd, events, cb, opaque);
if (eventLoop.handlesCount == eventLoop.handlesAlloc) { if (eventLoop.handlesCount == eventLoop.handlesAlloc) {
EVENT_DEBUG("Used %d handle slots, adding %d more", EVENT_DEBUG("Used %d handle slots, adding %d more",
@ -100,6 +104,7 @@ int virEventAddHandleImpl(int fd, int events, virEventHandleCallback cb,
eventLoop.handles[eventLoop.handlesCount].events = eventLoop.handles[eventLoop.handlesCount].events =
virEventHandleTypeToPollEvent(events); virEventHandleTypeToPollEvent(events);
eventLoop.handles[eventLoop.handlesCount].cb = cb; eventLoop.handles[eventLoop.handlesCount].cb = cb;
eventLoop.handles[eventLoop.handlesCount].ff = ff;
eventLoop.handles[eventLoop.handlesCount].opaque = opaque; eventLoop.handles[eventLoop.handlesCount].opaque = opaque;
eventLoop.handles[eventLoop.handlesCount].deleted = 0; eventLoop.handles[eventLoop.handlesCount].deleted = 0;
@ -147,7 +152,10 @@ int virEventRemoveHandleImpl(int watch) {
* NB, it *must* be safe to call this from within a callback * NB, it *must* be safe to call this from within a callback
* For this reason we only ever append to existing list. * For this reason we only ever append to existing list.
*/ */
int virEventAddTimeoutImpl(int frequency, virEventTimeoutCallback cb, void *opaque) { int virEventAddTimeoutImpl(int frequency,
virEventTimeoutCallback cb,
void *opaque,
virFreeCallback ff) {
struct timeval now; struct timeval now;
EVENT_DEBUG("Adding timer %d with %d ms freq", nextTimer, frequency); EVENT_DEBUG("Adding timer %d with %d ms freq", nextTimer, frequency);
if (gettimeofday(&now, NULL) < 0) { if (gettimeofday(&now, NULL) < 0) {
@ -166,6 +174,7 @@ int virEventAddTimeoutImpl(int frequency, virEventTimeoutCallback cb, void *opaq
eventLoop.timeouts[eventLoop.timeoutsCount].timer = nextTimer++; eventLoop.timeouts[eventLoop.timeoutsCount].timer = nextTimer++;
eventLoop.timeouts[eventLoop.timeoutsCount].frequency = frequency; eventLoop.timeouts[eventLoop.timeoutsCount].frequency = frequency;
eventLoop.timeouts[eventLoop.timeoutsCount].cb = cb; eventLoop.timeouts[eventLoop.timeoutsCount].cb = cb;
eventLoop.timeouts[eventLoop.timeoutsCount].ff = ff;
eventLoop.timeouts[eventLoop.timeoutsCount].opaque = opaque; eventLoop.timeouts[eventLoop.timeoutsCount].opaque = opaque;
eventLoop.timeouts[eventLoop.timeoutsCount].deleted = 0; eventLoop.timeouts[eventLoop.timeoutsCount].deleted = 0;
eventLoop.timeouts[eventLoop.timeoutsCount].expiresAt = eventLoop.timeouts[eventLoop.timeoutsCount].expiresAt =
@ -393,6 +402,9 @@ static int virEventCleanupTimeouts(void) {
} }
EVENT_DEBUG("Purging timeout %d with id %d", i, eventLoop.timeouts[i].timer); EVENT_DEBUG("Purging timeout %d with id %d", i, eventLoop.timeouts[i].timer);
if (eventLoop.timeouts[i].ff)
(eventLoop.timeouts[i].ff)(eventLoop.timeouts[i].opaque);
if ((i+1) < eventLoop.timeoutsCount) { if ((i+1) < eventLoop.timeoutsCount) {
memmove(eventLoop.timeouts+i, memmove(eventLoop.timeouts+i,
eventLoop.timeouts+i+1, eventLoop.timeouts+i+1,
@ -429,6 +441,9 @@ static int virEventCleanupHandles(void) {
continue; continue;
} }
if (eventLoop.handles[i].ff)
(eventLoop.handles[i].ff)(eventLoop.handles[i].opaque);
if ((i+1) < eventLoop.handlesCount) { if ((i+1) < eventLoop.handlesCount) {
memmove(eventLoop.handles+i, memmove(eventLoop.handles+i,
eventLoop.handles+i+1, eventLoop.handles+i+1,

View File

@ -36,8 +36,10 @@
* *
* returns -1 if the file handle cannot be registered, 0 upon success * returns -1 if the file handle cannot be registered, 0 upon success
*/ */
int virEventAddHandleImpl(int fd, int events, virEventHandleCallback cb, int virEventAddHandleImpl(int fd, int events,
void *opaque); virEventHandleCallback cb,
void *opaque,
virFreeCallback ff);
/** /**
* virEventUpdateHandleImpl: change event set for a monitored file handle * virEventUpdateHandleImpl: change event set for a monitored file handle
@ -71,7 +73,10 @@ int virEventRemoveHandleImpl(int watch);
* returns -1 if the file handle cannot be registered, a positive * returns -1 if the file handle cannot be registered, a positive
* integer timer id upon success * integer timer id upon success
*/ */
int virEventAddTimeoutImpl(int frequency, virEventTimeoutCallback cb, void *opaque); int virEventAddTimeoutImpl(int frequency,
virEventTimeoutCallback cb,
void *opaque,
virFreeCallback ff);
/** /**
* virEventUpdateTimeoutImpl: change frequency for a timer * virEventUpdateTimeoutImpl: change frequency for a timer

View File

@ -238,6 +238,12 @@ static void libvirtd_mdns_watch_dispatch(int watch, int fd, int events, void *op
w->callback(w, fd, fd_events, w->userdata); w->callback(w, fd, fd_events, w->userdata);
} }
static void libvirtd_mdns_watch_dofree(void *w)
{
VIR_FREE(w);
}
static AvahiWatch *libvirtd_mdns_watch_new(const AvahiPoll *api ATTRIBUTE_UNUSED, static AvahiWatch *libvirtd_mdns_watch_new(const AvahiPoll *api ATTRIBUTE_UNUSED,
int fd, AvahiWatchEvent event, int fd, AvahiWatchEvent event,
AvahiWatchCallback cb, void *userdata) { AvahiWatchCallback cb, void *userdata) {
@ -254,7 +260,9 @@ static AvahiWatch *libvirtd_mdns_watch_new(const AvahiPoll *api ATTRIBUTE_UNUSED
AVAHI_DEBUG("New handle %p FD %d Event %d", w, w->fd, event); AVAHI_DEBUG("New handle %p FD %d Event %d", w, w->fd, event);
hEvents = virPollEventToEventHandleType(event); hEvents = virPollEventToEventHandleType(event);
if ((w->watch = virEventAddHandleImpl(fd, hEvents, if ((w->watch = virEventAddHandleImpl(fd, hEvents,
libvirtd_mdns_watch_dispatch, w)) < 0) { libvirtd_mdns_watch_dispatch,
w,
libvirtd_mdns_watch_dofree)) < 0) {
VIR_FREE(w); VIR_FREE(w);
return NULL; return NULL;
} }
@ -278,7 +286,6 @@ static void libvirtd_mdns_watch_free(AvahiWatch *w)
{ {
AVAHI_DEBUG("Free handle %p %d", w, w->fd); AVAHI_DEBUG("Free handle %p %d", w, w->fd);
virEventRemoveHandleImpl(w->watch); virEventRemoveHandleImpl(w->watch);
VIR_FREE(w);
} }
static void libvirtd_mdns_timeout_dispatch(int timer ATTRIBUTE_UNUSED, void *opaque) static void libvirtd_mdns_timeout_dispatch(int timer ATTRIBUTE_UNUSED, void *opaque)
@ -289,6 +296,11 @@ static void libvirtd_mdns_timeout_dispatch(int timer ATTRIBUTE_UNUSED, void *opa
t->callback(t, t->userdata); t->callback(t, t->userdata);
} }
static void libvirtd_mdns_timeout_dofree(void *t)
{
VIR_FREE(t);
}
static AvahiTimeout *libvirtd_mdns_timeout_new(const AvahiPoll *api ATTRIBUTE_UNUSED, static AvahiTimeout *libvirtd_mdns_timeout_new(const AvahiPoll *api ATTRIBUTE_UNUSED,
const struct timeval *tv, const struct timeval *tv,
AvahiTimeoutCallback cb, AvahiTimeoutCallback cb,
@ -319,7 +331,10 @@ static AvahiTimeout *libvirtd_mdns_timeout_new(const AvahiPoll *api ATTRIBUTE_UN
timeout = -1; timeout = -1;
} }
t->timer = virEventAddTimeoutImpl(timeout, libvirtd_mdns_timeout_dispatch, t); t->timer = virEventAddTimeoutImpl(timeout,
libvirtd_mdns_timeout_dispatch,
t,
libvirtd_mdns_timeout_dofree);
t->callback = cb; t->callback = cb;
t->userdata = userdata; t->userdata = userdata;
@ -358,7 +373,6 @@ static void libvirtd_mdns_timeout_free(AvahiTimeout *t)
{ {
AVAHI_DEBUG("Free timeout %p", t); AVAHI_DEBUG("Free timeout %p", t);
virEventRemoveTimeoutImpl(t->timer); virEventRemoveTimeoutImpl(t->timer);
VIR_FREE(t);
} }

View File

@ -540,7 +540,7 @@ static int qemudListenUnix(struct qemud_server *server,
VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_ERROR |
VIR_EVENT_HANDLE_HANGUP, VIR_EVENT_HANDLE_HANGUP,
qemudDispatchServerEvent, qemudDispatchServerEvent,
server)) < 0) { server, NULL)) < 0) {
qemudLog(QEMUD_ERR, "%s", qemudLog(QEMUD_ERR, "%s",
_("Failed to add server event callback")); _("Failed to add server event callback"));
goto cleanup; goto cleanup;
@ -672,7 +672,7 @@ remoteListenTCP (struct qemud_server *server,
VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_ERROR |
VIR_EVENT_HANDLE_HANGUP, VIR_EVENT_HANDLE_HANGUP,
qemudDispatchServerEvent, qemudDispatchServerEvent,
server)) < 0) { server, NULL)) < 0) {
qemudLog(QEMUD_ERR, "%s", _("Failed to add server event callback")); qemudLog(QEMUD_ERR, "%s", _("Failed to add server event callback"));
goto cleanup; goto cleanup;
} }
@ -1655,7 +1655,7 @@ static int qemudRegisterClientEvent(struct qemud_server *server,
mode | VIR_EVENT_HANDLE_ERROR | mode | VIR_EVENT_HANDLE_ERROR |
VIR_EVENT_HANDLE_HANGUP, VIR_EVENT_HANDLE_HANGUP,
qemudDispatchClientEvent, qemudDispatchClientEvent,
server)) < 0) server, NULL)) < 0)
return -1; return -1;
return 0; return 0;
@ -1721,7 +1721,9 @@ static int qemudRunLoop(struct qemud_server *server) {
* shutdown after timeout seconds * shutdown after timeout seconds
*/ */
if (timeout > 0 && !virStateActive() && !server->clients) { if (timeout > 0 && !virStateActive() && !server->clients) {
timerid = virEventAddTimeoutImpl(timeout*1000, qemudInactiveTimer, server); timerid = virEventAddTimeoutImpl(timeout*1000,
qemudInactiveTimer,
server, NULL);
qemudDebug("Scheduling shutdown timer %d", timerid); qemudDebug("Scheduling shutdown timer %d", timerid);
} }
@ -2270,7 +2272,7 @@ int main(int argc, char **argv) {
if (virEventAddHandleImpl(sigpipe[0], if (virEventAddHandleImpl(sigpipe[0],
VIR_EVENT_HANDLE_READABLE, VIR_EVENT_HANDLE_READABLE,
qemudDispatchSignalEvent, qemudDispatchSignalEvent,
server) < 0) { server, NULL) < 0) {
qemudLog(QEMUD_ERR, qemudLog(QEMUD_ERR,
"%s", _("Failed to register callback for signal pipe")); "%s", _("Failed to register callback for signal pipe"));
ret = 3; ret = 3;

View File

@ -34,12 +34,15 @@ static virEventAddTimeoutFunc addTimeoutImpl = NULL;
static virEventUpdateTimeoutFunc updateTimeoutImpl = NULL; static virEventUpdateTimeoutFunc updateTimeoutImpl = NULL;
static virEventRemoveTimeoutFunc removeTimeoutImpl = NULL; static virEventRemoveTimeoutFunc removeTimeoutImpl = NULL;
int virEventAddHandle(int fd, int events, virEventHandleCallback cb, int virEventAddHandle(int fd,
void *opaque) { int events,
virEventHandleCallback cb,
void *opaque,
virFreeCallback ff) {
if (!addHandleImpl) if (!addHandleImpl)
return -1; return -1;
return addHandleImpl(fd, events, cb, opaque); return addHandleImpl(fd, events, cb, opaque, ff);
} }
void virEventUpdateHandle(int watch, int events) { void virEventUpdateHandle(int watch, int events) {
@ -53,11 +56,14 @@ int virEventRemoveHandle(int watch) {
return removeHandleImpl(watch); return removeHandleImpl(watch);
} }
int virEventAddTimeout(int timeout, virEventTimeoutCallback cb, void *opaque) { int virEventAddTimeout(int timeout,
virEventTimeoutCallback cb,
void *opaque,
virFreeCallback ff) {
if (!addTimeoutImpl) if (!addTimeoutImpl)
return -1; return -1;
return addTimeoutImpl(timeout, cb, opaque); return addTimeoutImpl(timeout, cb, opaque, ff);
} }
void virEventUpdateTimeout(int timer, int timeout) { void virEventUpdateTimeout(int timer, int timeout) {

View File

@ -34,8 +34,10 @@
* *
* returns -1 if the file handle cannot be registered, 0 upon success * returns -1 if the file handle cannot be registered, 0 upon success
*/ */
int virEventAddHandle(int fd, int events, virEventHandleCallback cb, int virEventAddHandle(int fd, int events,
void *opaque); virEventHandleCallback cb,
void *opaque,
virFreeCallback ff);
/** /**
* virEventUpdateHandle: change event set for a monitored file handle * virEventUpdateHandle: change event set for a monitored file handle
@ -69,7 +71,10 @@ int virEventRemoveHandle(int watch);
* returns -1 if the file handle cannot be registered, a positive * returns -1 if the file handle cannot be registered, a positive
* integer timer id upon success * integer timer id upon success
*/ */
int virEventAddTimeout(int frequency, virEventTimeoutCallback cb, void *opaque); int virEventAddTimeout(int frequency,
virEventTimeoutCallback cb,
void *opaque,
virFreeCallback ff);
/** /**
* virEventUpdateTimeoutImpl: change frequency for a timer * virEventUpdateTimeoutImpl: change frequency for a timer

View File

@ -820,7 +820,7 @@ static int lxcVmStart(virConnectPtr conn,
vm->monitor, vm->monitor,
VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_HANGUP, VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_HANGUP,
lxcMonitorEvent, lxcMonitorEvent,
driver)) < 0) { driver, NULL)) < 0) {
lxcVmTerminate(conn, driver, vm, 0); lxcVmTerminate(conn, driver, vm, 0);
goto cleanup; goto cleanup;
} }

View File

@ -952,13 +952,13 @@ static int qemudStartVMDaemon(virConnectPtr conn,
VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_ERROR |
VIR_EVENT_HANDLE_HANGUP, VIR_EVENT_HANDLE_HANGUP,
qemudDispatchVMEvent, qemudDispatchVMEvent,
driver)) < 0) || driver, NULL)) < 0) ||
((vm->stderr_watch = virEventAddHandle(vm->stderr_fd, ((vm->stderr_watch = virEventAddHandle(vm->stderr_fd,
VIR_EVENT_HANDLE_READABLE | VIR_EVENT_HANDLE_READABLE |
VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_ERROR |
VIR_EVENT_HANDLE_HANGUP, VIR_EVENT_HANDLE_HANGUP,
qemudDispatchVMEvent, qemudDispatchVMEvent,
driver)) < 0) || driver, NULL)) < 0) ||
(qemudWaitForMonitor(conn, driver, vm) < 0) || (qemudWaitForMonitor(conn, driver, vm) < 0) ||
(qemudDetectVcpuPIDs(conn, driver, vm) < 0) || (qemudDetectVcpuPIDs(conn, driver, vm) < 0) ||
(qemudInitCpus(conn, driver, vm, migrateFrom) < 0)) { (qemudInitCpus(conn, driver, vm, migrateFrom) < 0)) {

View File

@ -762,7 +762,7 @@ doRemoteOpen (virConnectPtr conn,
VIR_EVENT_HANDLE_ERROR | VIR_EVENT_HANDLE_ERROR |
VIR_EVENT_HANDLE_HANGUP, VIR_EVENT_HANDLE_HANGUP,
remoteDomainEventFired, remoteDomainEventFired,
conn)) < 0) { conn, NULL)) < 0) {
DEBUG0("virEventAddHandle failed: No addHandleImpl defined." DEBUG0("virEventAddHandle failed: No addHandleImpl defined."
" continuing without events."); " continuing without events.");
} else { } else {
@ -770,7 +770,7 @@ doRemoteOpen (virConnectPtr conn,
DEBUG0("Adding Timeout for remote event queue flushing"); DEBUG0("Adding Timeout for remote event queue flushing");
if ( (priv->eventFlushTimer = virEventAddTimeout(-1, if ( (priv->eventFlushTimer = virEventAddTimeout(-1,
remoteDomainEventQueueFlush, remoteDomainEventQueueFlush,
conn)) < 0) { conn, NULL)) < 0) {
DEBUG0("virEventAddTimeout failed: No addTimeoutImpl defined. " DEBUG0("virEventAddTimeout failed: No addTimeoutImpl defined. "
"continuing without events."); "continuing without events.");
} }