Re: [libvirt] Re: [PATCH 03/12] Domain Events - daemon changes

2008-10-23 Thread Daniel P. Berrange
On Tue, Oct 21, 2008 at 03:12:52PM -0400, Ben Guthro wrote:
 [PATCH 03/12] Domain Events - daemon changes
 This code changes the daemaon to:
   use the pulic def of virEventRegisterImpl
   Add functionality to dispatch events to connected remote drivers
 
  event.c  |   21 +
  event.h  |5 +-
  mdns.c   |   15 --
  qemud.c  |   72 ---
  qemud.h  |   11 
  remote.c |  143 
 +++
  6 files changed, 227 insertions(+), 40 deletions(-)

 diff --git a/qemud/event.c b/qemud/event.c
 index bb1f381..f391cd1 100644
 --- a/qemud/event.c
 +++ b/qemud/event.c
 @@ -38,7 +38,7 @@
  /* State for a single file handle being monitored */
  struct virEventHandle {
  int fd;
 -int events;
 +virEventHandleType events;

As per previous patch, simply using an 'int' is sufficient, likewise
for the few other places in this patch doing the same.

Aside from that, ACK to this patch.

Daniel
-- 
|: 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@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list


[libvirt] Re: [PATCH 03/12] Domain Events - daemon changes

2008-10-21 Thread Ben Guthro
[PATCH 03/12] Domain Events - daemon changes
This code changes the daemaon to:
  use the pulic def of virEventRegisterImpl
  Add functionality to dispatch events to connected remote drivers

 event.c  |   21 +
 event.h  |5 +-
 mdns.c   |   15 --
 qemud.c  |   72 ---
 qemud.h  |   11 
 remote.c |  143 +++
 6 files changed, 227 insertions(+), 40 deletions(-)
diff --git a/qemud/event.c b/qemud/event.c
index bb1f381..f391cd1 100644
--- a/qemud/event.c
+++ b/qemud/event.c
@@ -38,7 +38,7 @@
 /* State for a single file handle being monitored */
 struct virEventHandle {
 int fd;
-int events;
+virEventHandleType events;
 virEventHandleCallback cb;
 void *opaque;
 int deleted;
@@ -74,13 +74,13 @@ static struct virEventLoop eventLoop;
 /* Unique ID for the next timer to be registered */
 static int nextTimer = 0;
 
-
 /*
  * Register a callback for monitoring file handle events.
  * NB, it *must* be safe to call this from within a callback
  * For this reason we only ever append to existing list.
  */
-int virEventAddHandleImpl(int fd, int events, virEventHandleCallback cb, void *opaque) {
+int virEventAddHandleImpl(int fd, virEventHandleType events,
+  virEventHandleCallback cb, void *opaque) {
 EVENT_DEBUG(Add handle %d %d %p %p, fd, events, cb, opaque);
 if (eventLoop.handlesCount == eventLoop.handlesAlloc) {
 EVENT_DEBUG(Used %d handle slots, adding %d more,
@@ -92,7 +92,8 @@ int virEventAddHandleImpl(int fd, int events, virEventHandleCallback cb, void *o
 }
 
 eventLoop.handles[eventLoop.handlesCount].fd = fd;
-eventLoop.handles[eventLoop.handlesCount].events = events;
+eventLoop.handles[eventLoop.handlesCount].events =
+ virEventHandleTypeToPollEvent(events);
 eventLoop.handles[eventLoop.handlesCount].cb = cb;
 eventLoop.handles[eventLoop.handlesCount].opaque = opaque;
 eventLoop.handles[eventLoop.handlesCount].deleted = 0;
@@ -102,11 +103,12 @@ int virEventAddHandleImpl(int fd, int events, virEventHandleCallback cb, void *o
 return 0;
 }
 
-void virEventUpdateHandleImpl(int fd, int events) {
+void virEventUpdateHandleImpl(int fd, virEventHandleType events) {
 int i;
 for (i = 0 ; i  eventLoop.handlesCount ; i++) {
 if (eventLoop.handles[i].fd == fd) {
-eventLoop.handles[i].events = events;
+eventLoop.handles[i].events =
+virEventHandleTypeToPollEvent(events);
 break;
 }
 }
@@ -342,6 +344,7 @@ static int virEventDispatchTimeouts(void) {
  */
 static int virEventDispatchHandles(struct pollfd *fds) {
 int i;
+virEventHandleType hEvents;
 /* Save this now - it may be changed during dispatch */
 int nhandles = eventLoop.handlesCount;
 
@@ -352,8 +355,10 @@ static int virEventDispatchHandles(struct pollfd *fds) {
 }
 
 if (fds[i].revents) {
-EVENT_DEBUG(Dispatch %d %d %p, fds[i].fd, fds[i].revents, eventLoop.handles[i].opaque);
-(eventLoop.handles[i].cb)(fds[i].fd, fds[i].revents,
+hEvents = virPollEventToEventHandleType(fds[i].revents);
+EVENT_DEBUG(Dispatch %d %d %p, fds[i].fd, fds[i].revents,
+eventLoop.handles[i].opaque);
+(eventLoop.handles[i].cb)(fds[i].fd, hEvents,
   eventLoop.handles[i].opaque);
 }
 }
diff --git a/qemud/event.h b/qemud/event.h
index adf7b6d..3fff617 100644
--- a/qemud/event.h
+++ b/qemud/event.h
@@ -36,7 +36,8 @@
  *
  * returns -1 if the file handle cannot be registered, 0 upon success
  */
-int virEventAddHandleImpl(int fd, int events, virEventHandleCallback cb, void *opaque);
+int virEventAddHandleImpl(int fd, virEventHandleType events,
+  virEventHandleCallback cb, void *opaque);
 
 /**
  * virEventUpdateHandleImpl: change event set for a monitored file handle
@@ -46,7 +47,7 @@ int virEventAddHandleImpl(int fd, int events, virEventHandleCallback cb, void *o
  *
  * Will not fail if fd exists
  */
-void virEventUpdateHandleImpl(int fd, int events);
+void virEventUpdateHandleImpl(int fd, virEventHandleType events);
 
 /**
  * virEventRemoveHandleImpl: unregister a callback from a file handle
diff --git a/qemud/mdns.c b/qemud/mdns.c
index 9147946..df1b6c9 100644
--- a/qemud/mdns.c
+++ b/qemud/mdns.c
@@ -228,17 +228,20 @@ static void libvirtd_mdns_client_callback(AvahiClient *c, AvahiClientState state
 }
 
 
-static void libvirtd_mdns_watch_dispatch(int fd, int events, void *opaque)
+static void libvirtd_mdns_watch_dispatch(int fd, virEventHandleType events, 
+ void *opaque)
 {
 AvahiWatch *w = (AvahiWatch*)opaque;
-AVAHI_DEBUG(Dispatch watch FD %d Event %d, fd, events);
-w-revents = events;
-w-callback(w, fd, events, 

[libvirt] Re: [PATCH 03/12] Domain Events - daemon changes

2008-10-17 Thread Ben Guthro
This code changes the daemaon to:
  use the pulic def of virEventRegisterImpl
  Add functionality to dispatch events to connected remote drivers

 qemud.c  |   28 ---
 qemud.h  |   14 +
 remote.c |  158 +++
 3 files changed, 193 insertions(+), 7 deletions(-)
diff --git a/qemud/qemud.c b/qemud/qemud.c
index 9da27d2..3020d81 100644
--- a/qemud/qemud.c
+++ b/qemud/qemud.c
@@ -723,12 +723,12 @@ static struct qemud_server *qemudInitialize(int sigread) {
 
 server-sigread = sigread;
 
-__virEventRegisterImpl(virEventAddHandleImpl,
-   virEventUpdateHandleImpl,
-   virEventRemoveHandleImpl,
-   virEventAddTimeoutImpl,
-   virEventUpdateTimeoutImpl,
-   virEventRemoveTimeoutImpl);
+virEventRegisterImpl(virEventAddHandleImpl,
+ virEventUpdateHandleImpl,
+ virEventRemoveHandleImpl,
+ virEventAddTimeoutImpl,
+ virEventUpdateTimeoutImpl,
+ virEventRemoveTimeoutImpl);
 
 virStateInitialize();
 
@@ -1105,7 +1105,12 @@ static int qemudDispatchServer(struct qemud_server *server, struct qemud_socket
 client-auth = sock-auth;
 memcpy (client-addr, addr, sizeof addr);
 client-addrlen = addrlen;
+client-server = server;
 
+if(VIR_ALLOC(client-domainEventCallbacks)0) {
+qemudLog(QEMUD_ERR, _(Error allocating domainEventCallbacks: %s), strerror(errno));
+goto cleanup;
+}
 #if HAVE_POLKIT
 /* Only do policy checks for non-root - allow root user
through with no checks, as a fail-safe - root can easily
@@ -1199,6 +1204,15 @@ static void qemudDispatchClientFailure(struct qemud_server *server, struct qemud
 
 virEventRemoveHandleImpl(client-fd);
 
+/* Deregister event delivery callback */
+if(client-conn) {
+qemudDebug(Deregistering to relay remote events);
+virConnectDomainEventDeregister(client-conn, remoteRelayDomainEvent);
+}
+
+/* Free domain callback list */
+__virDomainEventCallbackListFree(client-domainEventCallbacks);
+
 if (client-conn)
 virConnectClose(client-conn);
 
@@ -1503,7 +1517,7 @@ static int qemudClientWrite(struct qemud_server *server,
 }
 
 
-static void qemudDispatchClientWrite(struct qemud_server *server, struct qemud_client *client) {
+void qemudDispatchClientWrite(struct qemud_server *server, struct qemud_client *client) {
 switch (client-mode) {
 case QEMUD_MODE_TX_PACKET: {
 if (qemudClientWrite(server, client)  0)
diff --git a/qemud/qemud.h b/qemud/qemud.h
index 91cb939..2fb3ca9 100644
--- a/qemud/qemud.h
+++ b/qemud/qemud.h
@@ -132,6 +132,12 @@ struct qemud_client {
  */
 virConnectPtr conn;
 
+/* This is the list of remote callbacks registered */
+virDomainEventCallbackListPtr domainEventCallbacks;
+
+/* back-pointer to our server */
+struct qemud_server *server;
+
 struct qemud_client *next;
 };
 
@@ -179,8 +185,16 @@ void qemudLog(int priority, const char *fmt, ...)
 void remoteDispatchClientRequest (struct qemud_server *server,
   struct qemud_client *client);
 
+void qemudDispatchClientWrite(struct qemud_server *server,
+ struct qemud_client *client);
+
 #if HAVE_POLKIT
 int qemudGetSocketIdentity(int fd, uid_t *uid, pid_t *pid);
 #endif
 
+int remoteRelayDomainEvent (virConnectPtr conn ATTRIBUTE_UNUSED,
+virDomainPtr dom,
+int event,
+void *opaque);
+
 #endif
diff --git a/qemud/remote.c b/qemud/remote.c
index 72e064e..eeed5fd 100644
--- a/qemud/remote.c
+++ b/qemud/remote.c
@@ -75,6 +75,13 @@ typedef int (*dispatch_fn) (struct qemud_server *server,
 char *args,
 char *ret);
 
+/* Prototypes */
+static void
+remoteDispatchDomainEventSend (struct qemud_client *client,
+   virDomainPtr dom,
+   virDomainEventType event,
+   virDomainEventCallbackPtr callback);
+
 /* This function gets called from qemud when it detects an incoming
  * remote protocol message.  At this point, client-buffer contains
  * the full call message (including length word which we skip).
@@ -405,6 +412,24 @@ remoteDispatchError (struct qemud_client *client,
 remoteDispatchSendError (client, req, VIR_ERR_RPC, msg);
 }
 
+int remoteRelayDomainEvent (virConnectPtr conn ATTRIBUTE_UNUSED,
+   virDomainPtr dom,
+   int event,
+   void *opaque)
+{
+int i;
+struct qemud_client *c = opaque;
+REMOTE_DEBUG(Relaying domain event %d, event);
+
+if(c  c-domainEventCallbacks) {
+