From cc489fb3c4f2d523cba4b8b13d2bf83564de8254 Mon Sep 17 00:00:00 2001 From: Keir Fraser Date: Tue, 6 May 2008 13:34:52 +0100 Subject: 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 --- extras/mini-os/netfront.c | 16 ++++++++++------ 1 file changed, 10 insertions(+), 6 deletions(-) (limited to 'extras/mini-os/netfront.c') diff --git a/extras/mini-os/netfront.c b/extras/mini-os/netfront.c index acdc76d994..0c1e8f1ed3 100644 --- a/extras/mini-os/netfront.c +++ b/extras/mini-os/netfront.c @@ -53,6 +53,8 @@ struct netfront_dev { char *nodename; char *backend; + xenbus_event_queue events; + #ifdef HAVE_LIBC int fd; unsigned char *data; @@ -328,6 +330,8 @@ struct netfront_dev *init_netfront(char *nodename, void (*thenetif_rx)(unsigned dev->netif_rx = thenetif_rx; + dev->events = NULL; + // FIXME: proper frees on failures again: err = xenbus_transaction_start(&xbt); @@ -399,11 +403,9 @@ done: char path[strlen(dev->backend) + 1 + 5 + 1]; snprintf(path, sizeof(path), "%s/state", dev->backend); - xenbus_watch_path(XBT_NIL, path); + xenbus_watch_path_token(XBT_NIL, path, path, &dev->events); - xenbus_wait_for_value(path,"4"); - - xenbus_unwatch_path(XBT_NIL, path); + xenbus_wait_for_value(path, "4", &dev->events); if (ip) { snprintf(path, sizeof(path), "%s/ip", dev->backend); @@ -458,10 +460,12 @@ void shutdown_netfront(struct netfront_dev *dev) snprintf(path, sizeof(path), "%s/state", dev->backend); err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 5); /* closing */ - xenbus_wait_for_value(path,"5"); + xenbus_wait_for_value(path, "5", &dev->events); err = xenbus_printf(XBT_NIL, nodename, "state", "%u", 6); - xenbus_wait_for_value(path,"6"); + xenbus_wait_for_value(path, "6", &dev->events); + + xenbus_unwatch_path(XBT_NIL, path); unbind_evtchn(dev->evtchn); -- cgit v1.2.3