xenbus_release_wait_for_watch generates a fake event to trigger make
xenbus_wait_for_watch return. This is necessary to wake up waiting threads.
release_xenbus_id additionally checks if the number of requests == 0 to wake
up the 'waiting' suspend xenbus thread.
Signed-off-by: Bruno Alvisio <bruno.alvisio@gmail.com>
Reviewed-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
extern struct wait_queue_head xenbus_watch_queue;
void xenbus_wait_for_watch(xenbus_event_queue *queue);
char **xenbus_wait_for_watch_return(xenbus_event_queue *queue);
+void xenbus_release_wait_for_watch(xenbus_event_queue *queue);
char* xenbus_wait_for_value(const char *path, const char *value, xenbus_event_queue *queue);
char *xenbus_wait_for_state_change(const char* path, XenbusState *state, xenbus_event_queue *queue);
char *xenbus_switch_state(xenbus_transaction_t xbt, const char* path, XenbusState state);
printk("unexpected path returned by watch\n");
}
+void xenbus_release_wait_for_watch(xenbus_event_queue *queue)
+{
+ struct xenbus_event *event = malloc(sizeof(*event));
+ event->next = *queue;
+ *queue = event;
+ wake_up(&xenbus_watch_queue);
+}
+
char* xenbus_wait_for_value(const char* path, const char* value, xenbus_event_queue *queue)
{
if (!queue)
req_info[id].in_use = 0;
nr_live_reqs--;
req_info[id].in_use = 0;
- if (nr_live_reqs == NR_REQS - 1)
+ if (nr_live_reqs == 0 || nr_live_reqs == NR_REQS - 1)
wake_up(&req_wq);
spin_unlock(&req_lock);
}