[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Xen-devel] [PATCH 10/11] mini-os/xenbus: Provide queue->wakeup hook
This allows xenbus's caller to get called back when an item is put on the queue, rather than simply having the waitq signaled. Signed-off-by: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx> --- include/mini-os/xenbus.h | 15 +++++++++++++++ xen/xenbus/xenbus.c | 8 +++++++- 2 files changed, 22 insertions(+), 1 deletion(-) diff --git a/include/mini-os/xenbus.h b/include/mini-os/xenbus.h index a811c19..1900e55 100644 --- a/include/mini-os/xenbus.h +++ b/include/mini-os/xenbus.h @@ -46,6 +46,7 @@ struct xenbus_event { }; struct xenbus_event_queue { MINIOS_STAILQ_HEAD(, xenbus_event) events; + void (*wakeup)(struct xenbus_event_queue*); /* can be safely ignored */ struct wait_queue_head waitq; }; @@ -129,6 +130,20 @@ domid_t xenbus_get_self_id(void); * ----- asynchronous low-level interface ----- */ +/* + * Use of queue->wakeup: + * + * If queue->wakeup is set, it will be called instead of + * wake_up(&queue->waitq); + * + * queue->wakeup is initialised (to a function which just calls + * wake_up) by xenbus_event_queue_init. The user who wants something + * different should set ->wakeup after the init, but before the queue + * is used for xenbus_id_allocate or xenbus_watch_prepare. + * + * queue->wakeup() is called with the req_lock held. + */ + /* Allocate an identifier for a xenbus request. Blocks if none are * available. Cannot fail. On return, we may use the returned value * as the id in a xenbus request. diff --git a/xen/xenbus/xenbus.c b/xen/xenbus/xenbus.c index 7b391c5..e5d7f36 100644 --- a/xen/xenbus/xenbus.c +++ b/xen/xenbus/xenbus.c @@ -67,9 +67,15 @@ spinlock_t xenbus_req_lock = SPIN_LOCK_UNLOCKED; * watches */ +static void queue_wakeup(struct xenbus_event_queue *queue) +{ + wake_up(&queue->waitq); +} + void xenbus_event_queue_init(struct xenbus_event_queue *queue) { MINIOS_STAILQ_INIT(&queue->events); + queue->wakeup = queue_wakeup; init_waitqueue_head(&queue->waitq); } @@ -92,7 +98,7 @@ static void queue_event(struct xenbus_event_queue *queue, { /* Called with lock held */ MINIOS_STAILQ_INSERT_TAIL(&queue->events, event, entry); - wake_up(&queue->waitq); + queue->wakeup(queue); } static struct xenbus_event *await_event(struct xenbus_event_queue *queue) -- 1.7.10.4 _______________________________________________ Xen-devel mailing list Xen-devel@xxxxxxxxxxxxx http://lists.xen.org/xen-devel
|
Lists.xenproject.org is hosted with RackSpace, monitoring our |