aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/include
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2008-05-06 13:34:52 +0100
committerKeir Fraser <keir.fraser@citrix.com>2008-05-06 13:34:52 +0100
commitcc489fb3c4f2d523cba4b8b13d2bf83564de8254 (patch)
treec1c5303e97b6a35ce3693489d27c1dd378593e4e /extras/mini-os/include
parentea1c7a7225787dcda405a1a75a1e982624f1ef1a (diff)
downloadxen-cc489fb3c4f2d523cba4b8b13d2bf83564de8254.tar.gz
xen-cc489fb3c4f2d523cba4b8b13d2bf83564de8254.tar.bz2
xen-cc489fb3c4f2d523cba4b8b13d2bf83564de8254.zip
minios: fix thread safety of xenbus watches by requiring callers to
provide their own queue of events, because else we can not dispatch to watchers running in parallel. Signed-off-by: Samuel Thibault <samuel.thibault@eu.citrix.com>
Diffstat (limited to 'extras/mini-os/include')
-rw-r--r--extras/mini-os/include/lib.h2
-rw-r--r--extras/mini-os/include/xenbus.h11
2 files changed, 7 insertions, 6 deletions
diff --git a/extras/mini-os/include/lib.h b/extras/mini-os/include/lib.h
index e5997d4574..96e17ecd4c 100644
--- a/extras/mini-os/include/lib.h
+++ b/extras/mini-os/include/lib.h
@@ -178,7 +178,7 @@ extern struct file {
struct {
/* To each xenbus FD is associated a queue of watch events for this
* FD. */
- struct xenbus_event *volatile events;
+ xenbus_event_queue events;
} xenbus;
};
volatile int read; /* maybe available for read */
diff --git a/extras/mini-os/include/xenbus.h b/extras/mini-os/include/xenbus.h
index 9a44d0b2d6..2ed370f252 100644
--- a/extras/mini-os/include/xenbus.h
+++ b/extras/mini-os/include/xenbus.h
@@ -19,17 +19,18 @@ struct xenbus_event {
char *token;
struct xenbus_event *next;
};
+typedef struct xenbus_event *xenbus_event_queue;
-char *xenbus_watch_path_token(xenbus_transaction_t xbt, const char *path, const char *token, struct xenbus_event *volatile *events);
+char *xenbus_watch_path_token(xenbus_transaction_t xbt, const char *path, const char *token, xenbus_event_queue *events);
char *xenbus_unwatch_path_token(xenbus_transaction_t xbt, const char *path, const char *token);
extern struct wait_queue_head xenbus_watch_queue;
-void xenbus_wait_for_watch(void);
-char **xenbus_wait_for_watch_return(void);
-char* xenbus_wait_for_value(const char *path, const char *value);
+void xenbus_wait_for_watch(xenbus_event_queue *queue);
+char **xenbus_wait_for_watch_return(xenbus_event_queue *queue);
+char* xenbus_wait_for_value(const char *path, const char *value, xenbus_event_queue *queue);
/* When no token is provided, use a global queue. */
#define XENBUS_WATCH_PATH_TOKEN "xenbus_watch_path"
-extern struct xenbus_event * volatile xenbus_events;
+extern xenbus_event_queue xenbus_events;
#define xenbus_watch_path(xbt, path) xenbus_watch_path_token(xbt, path, XENBUS_WATCH_PATH_TOKEN, NULL)
#define xenbus_unwatch_path(xbt, path) xenbus_unwatch_path_token(xbt, path, XENBUS_WATCH_PATH_TOKEN)