|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] Re: [Xen-devel] [PATCH 00/12] libxl: fork: SIGCHLD flexibility
Ian Jackson writes ("Re: [Xen-devel] [PATCH 00/12] libxl: fork: SIGCHLD
flexibility"):
> libxl could (and perhaps should) grow such a thing in its own event
> loop, but thinking about how to write it, it's going to be quite
> tedious![1]
...
> [1] Add a ctx-wide list of pollers, one for every libxl thread in
> poll. This list has to be covered by its own lock.
>
> When fd deregistration occurs, we take this lock, wake up all the
> pollers, release the lock, and then wait (perhaps with a condition
> variable) for the pollers to acknowledge that they have left poll().
Something like this (warning, pseudocode).
Ian.
diff --git a/tools/libxl/libxl_event.c b/tools/libxl/libxl_event.c
index 93f8fdc..5e3fe87 100644
--- a/tools/libxl/libxl_event.c
+++ b/tools/libxl/libxl_event.c
@@ -232,6 +232,17 @@ void libxl__ev_fd_deregister(libxl__gc *gc, libxl__ev_fd
*ev)
LIBXL_LIST_REMOVE(ev, entry);
ev->fd = -1;
+ with cohort lock{
+ push new cohort, mark it in use;
+
+ loop waiting for acks{
+ signal all pollers in our cohort and all older;
+ if there are none, hooray (exit the loop);
+ condvar wait;
+ }
+ cleanup;
+ }
+
out:
CTX_UNLOCK;
}
@@ -1436,10 +1447,22 @@ static int eventloop_iteration(libxl__egc *egc,
libxl__poller *poller) {
poller->fd_polls_allocd = nfds;
}
+ with cohort lock{
+ add poller to list in running cohort;
+ }
+
CTX_UNLOCK;
rc = poll(poller->fd_polls, nfds, timeout);
CTX_LOCK;
+ with cohort lock{
+ remove poller from whatever cohort's list it was in #';
+ clean up old running cohorts:
+ while (oldest cohort is empty and unused)
+ delete it;
+ signal cv;
+ }
+
if (rc < 0) {
if (errno == EINTR)
return 0; /* will go round again if caller requires */
_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |