[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 |