+Wed Nov 19 15:25:00 GMT 2008 Daniel Berrange <berrange@redhat.com>
+
+ Add a callback for freeing the user data for callbacks
+ (patch from David Lively)
+ * include/libvirt/libvirt.h.in: Add a virFreeCallback type
+ and add it to virDomainEventRegister
+ * qemud/remote.c, src/domain_event.h, src/domain_event.c,
+ src/driver.h, src/qemu_driver.c, src/remote_internal.c,
+ python/libvirt.c: Update to call the virFreeCallback where
+ needed
+ * examples/domain-events/events-c/event-test.c: use the
+ virFreeCallback for releasing data
+
Mon Nov 18 12:24:00 GMT 2008 Daniel Berrange <berrange@redhat.com>
* src/Makefile.am: Fix build on MinGW where linker flags
#include <config.h>
#include <stdio.h>
+#include <stdlib.h>
#include <string.h>
+#include <signal.h>
#if HAVE_SYS_POLL_H
#include <sys/types.h>
return 0;
}
+static void myFreeFunc(void *opaque)
+{
+ char *str = opaque;
+ printf("%s: Freeing [%s]\n", __FUNCTION__, str);
+ free(str);
+}
+
/* EventImpl Functions */
int myEventHandleTypeToPollEvent(virEventHandleType events)
printf("%s uri\n", pname);
}
+int run = 1;
+
+static void stop(int sig)
+{
+ printf("Exiting on signal %d\n", sig);
+ run = 0;
+}
+
+
int main(int argc, char **argv)
{
- int run=1;
int sts;
+ struct sigaction action_stop = {
+ .sa_handler = stop
+ };
if(argc > 1 && STREQ(argv[1],"--help")) {
usage(argv[0]);
return -1;
}
+
virEventRegisterImpl( myEventAddHandleFunc,
myEventUpdateHandleFunc,
myEventRemoveHandleFunc,
return -1;
}
+ sigaction(SIGTERM, &action_stop, NULL);
+ sigaction(SIGINT, &action_stop, NULL);
+
DEBUG0("Registering domain event cbs");
/* Add 2 callbacks to prove this works with more than just one */
- virConnectDomainEventRegister(dconn, myDomainEventCallback1, NULL);
- virConnectDomainEventRegister(dconn, myDomainEventCallback2, NULL);
+ virConnectDomainEventRegister(dconn, myDomainEventCallback1,
+ strdup("callback 1"), myFreeFunc);
+ virConnectDomainEventRegister(dconn, myDomainEventCallback2,
+ strdup("callback 2"), myFreeFunc);
while(run) {
struct pollfd pfd = { .fd = h_fd,
}
+ DEBUG0("Deregistering event handlers");
+ virConnectDomainEventDeregister(dconn, myDomainEventCallback1);
+ virConnectDomainEventDeregister(dconn, myDomainEventCallback2);
+
+ DEBUG0("Closing connection");
if( dconn && virConnectClose(dconn)<0 ) {
printf("error closing\n");
}
+
printf("done\n");
return 0;
}
int detail,
void *opaque);
+typedef void (*virFreeCallback)(void *opaque);
+
int virConnectDomainEventRegister(virConnectPtr conn,
virConnectDomainEventCallback cb,
- void *opaque);
+ void *opaque,
+ virFreeCallback freecb);
int virConnectDomainEventDeregister(virConnectPtr conn,
virConnectDomainEventCallback cb);
int detail,
void *opaque);
+typedef void (*virFreeCallback)(void *opaque);
+
int virConnectDomainEventRegister(virConnectPtr conn,
virConnectDomainEventCallback cb,
- void *opaque);
+ void *opaque,
+ virFreeCallback freecb);
int virConnectDomainEventDeregister(virConnectPtr conn,
virConnectDomainEventCallback cb);
ret = virConnectDomainEventRegister(conn,
libvirt_virConnectDomainEventCallback,
- (void *)pyobj_conn_inst);
+ (void *)pyobj_conn_inst, NULL);
LIBVIRT_END_ALLOW_THREADS;
/* Register event delivery callback */
REMOTE_DEBUG("%s","Registering to relay remote events");
- virConnectDomainEventRegister(client->conn, remoteRelayDomainEvent, client);
+ virConnectDomainEventRegister(client->conn, remoteRelayDomainEvent, client, NULL);
if(ret)
ret->cb_registered = 1;
{
int i;
for (i=0; i<list->count; i++) {
+ virFreeCallback freecb = list->callbacks[i]->freecb;
+ if (freecb)
+ (*freecb)(list->callbacks[i]->opaque);
VIR_FREE(list->callbacks[i]);
}
VIR_FREE(list);
for (i = 0 ; i < cbList->count ; i++) {
if(cbList->callbacks[i]->cb == callback &&
cbList->callbacks[i]->conn == conn) {
+ virFreeCallback freecb = cbList->callbacks[i]->freecb;
+ if (freecb)
+ (*freecb)(cbList->callbacks[i]->opaque);
virUnrefConnect(cbList->callbacks[i]->conn);
VIR_FREE(cbList->callbacks[i]);
virDomainEventCallbackListAdd(virConnectPtr conn,
virDomainEventCallbackListPtr cbList,
virConnectDomainEventCallback callback,
- void *opaque)
+ void *opaque,
+ virFreeCallback freecb)
{
virDomainEventCallbackPtr event;
int n;
event->conn = conn;
event->cb = callback;
event->opaque = opaque;
+ event->freecb = freecb;
/* Make space on list */
n = cbList->count;
virConnectPtr conn;
virConnectDomainEventCallback cb;
void *opaque;
+ virFreeCallback freecb;
+
};
typedef struct _virDomainEventCallback virDomainEventCallback;
typedef virDomainEventCallback *virDomainEventCallbackPtr;
int virDomainEventCallbackListAdd(virConnectPtr conn,
virDomainEventCallbackListPtr cbList,
virConnectDomainEventCallback callback,
- void *opaque);
+ void *opaque,
+ virFreeCallback freecb);
int virDomainEventCallbackListRemove(virConnectPtr conn,
virDomainEventCallbackListPtr cbList,
(*virDrvDomainEventRegister)
(virConnectPtr conn,
void *callback,
- void *opaque);
+ void *opaque,
+ virFreeCallback freecb);
typedef int
(*virDrvDomainEventDeregister)
int
virConnectDomainEventRegister(virConnectPtr conn,
virConnectDomainEventCallback cb,
- void *opaque)
+ void *opaque,
+ virFreeCallback freecb)
{
if (!VIR_IS_CONNECT(conn)) {
}
if ((conn->driver) && (conn->driver->domainEventRegister))
- return conn->driver->domainEventRegister (conn, cb, opaque);
+ return conn->driver->domainEventRegister (conn, cb, opaque, freecb);
return -1;
}
static int
qemudDomainEventRegister (virConnectPtr conn,
void *callback,
- void *opaque)
+ void *opaque,
+ virFreeCallback freecb)
{
struct qemud_driver *driver = (struct qemud_driver *)conn->privateData;
return virDomainEventCallbackListAdd(conn, driver->domainEventCallbacks,
- callback, opaque);
+ callback, opaque, freecb);
}
static int
/*----------------------------------------------------------------------*/
static int remoteDomainEventRegister (virConnectPtr conn,
- void *callback ATTRIBUTE_UNUSED,
- void *opaque ATTRIBUTE_UNUSED)
+ void *callback ATTRIBUTE_UNUSED,
+ void *opaque ATTRIBUTE_UNUSED,
+ virFreeCallback freecb)
{
struct private_data *priv = conn->privateData;
if (virDomainEventCallbackListAdd(conn, priv->callbackList,
- callback, opaque) < 0) {
+ callback, opaque, freecb) < 0) {
error (conn, VIR_ERR_RPC, _("adding cb to list"));
return -1;
}