Re: [libvirt] Re: [PATCH 03/12] Domain Events - daemon changes
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
[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
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) { +