|
[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index] [Minios-devel] [PATCH v2 04/17] Save/Restore Support: Add xenbus_release_wait_for_watch
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@xxxxxxxxx>
Reviewed-by: Samuel Thibault <samuel.thibault@xxxxxxxxxxxx>
---
Changed since v1:
* Added doc for change in release_xenbus_id
---
include/xenbus.h | 1 +
xenbus/xenbus.c | 10 +++++++++-
2 files changed, 10 insertions(+), 1 deletion(-)
diff --git a/include/xenbus.h b/include/xenbus.h
index 12391b9..b2d5072 100644
--- a/include/xenbus.h
+++ b/include/xenbus.h
@@ -42,6 +42,7 @@ char *xenbus_unwatch_path_token(xenbus_transaction_t xbt,
const char *path, cons
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);
diff --git a/xenbus/xenbus.c b/xenbus/xenbus.c
index 636786c..c2d2bd1 100644
--- a/xenbus/xenbus.c
+++ b/xenbus/xenbus.c
@@ -129,6 +129,14 @@ void xenbus_wait_for_watch(xenbus_event_queue *queue)
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)
@@ -318,7 +326,7 @@ static void release_xenbus_id(int id)
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);
}
--
2.3.2 (Apple Git-55)
_______________________________________________
Minios-devel mailing list
Minios-devel@xxxxxxxxxxxxxxxxxxxx
https://lists.xenproject.org/mailman/listinfo/minios-devel
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |