diff options
author | Keir Fraser <keir.fraser@citrix.com> | 2010-04-07 08:15:55 +0100 |
---|---|---|
committer | Keir Fraser <keir.fraser@citrix.com> | 2010-04-07 08:15:55 +0100 |
commit | 42e3a21b11ec98ecfd1e3473c9bbc8e9e98b10b5 (patch) | |
tree | 7c9cf201fad323d93433f5b211101195c1cfd5a3 /extras | |
parent | 449e0d3d0e781aa53b70ae753f9c9c1511ce7e61 (diff) | |
download | xen-42e3a21b11ec98ecfd1e3473c9bbc8e9e98b10b5.tar.gz xen-42e3a21b11ec98ecfd1e3473c9bbc8e9e98b10b5.tar.bz2 xen-42e3a21b11ec98ecfd1e3473c9bbc8e9e98b10b5.zip |
mini-os: Fix frontend shutdown wait loop
minios frontends must wait for backends to be shut down and
reinitialized before freeing resources.
Signed-off-by: Samuel Thibault <samuel.thibault@ens-lyon.org>
Diffstat (limited to 'extras')
-rw-r--r-- | extras/mini-os/blkfront.c | 2 | ||||
-rw-r--r-- | extras/mini-os/fbfront.c | 15 | ||||
-rw-r--r-- | extras/mini-os/netfront.c | 2 | ||||
-rw-r--r-- | extras/mini-os/pcifront.c | 2 |
4 files changed, 13 insertions, 8 deletions
diff --git a/extras/mini-os/blkfront.c b/extras/mini-os/blkfront.c index 9862fb9acb..f47aa69f23 100644 --- a/extras/mini-os/blkfront.c +++ b/extras/mini-os/blkfront.c @@ -289,7 +289,7 @@ void shutdown_blkfront(struct blkfront_dev *dev) goto close; } state = xenbus_read_integer(path); - if (state < XenbusStateClosed) { + while (state < XenbusStateClosed) { err = xenbus_wait_for_state_change(path, &state, &dev->events); if (err) free(err); } diff --git a/extras/mini-os/fbfront.c b/extras/mini-os/fbfront.c index fa4fc428cc..6d2268e27e 100644 --- a/extras/mini-os/fbfront.c +++ b/extras/mini-os/fbfront.c @@ -262,7 +262,7 @@ void shutdown_kbdfront(struct kbdfront_dev *dev) goto close_kbdfront; } state = xenbus_read_integer(path); - if (state < XenbusStateClosed) { + while (state < XenbusStateClosed) { err = xenbus_wait_for_state_change(path, &state, &dev->events); if (err) free(err); } @@ -272,8 +272,10 @@ void shutdown_kbdfront(struct kbdfront_dev *dev) XenbusStateInitialising, err); goto close_kbdfront; } - // does not work yet. - //xenbus_wait_for_value(path, "2", &dev->events); + err = NULL; + state = xenbus_read_integer(path); + while (err == NULL && (state < XenbusStateInitWait || state >= XenbusStateClosed)) + err = xenbus_wait_for_state_change(path, &state, &dev->events); close_kbdfront: if (err) free(err); @@ -660,8 +662,11 @@ void shutdown_fbfront(struct fbfront_dev *dev) XenbusStateInitialising, err); goto close_fbfront; } - // does not work yet - //xenbus_wait_for_value(path, "2", &dev->events); + + err = NULL; + state = xenbus_read_integer(path); + while (err == NULL && (state < XenbusStateInitWait || state >= XenbusStateClosed)) + err = xenbus_wait_for_state_change(path, &state, &dev->events); close_fbfront: if (err) free(err); diff --git a/extras/mini-os/netfront.c b/extras/mini-os/netfront.c index 47f87d1eef..491876fd9a 100644 --- a/extras/mini-os/netfront.c +++ b/extras/mini-os/netfront.c @@ -546,7 +546,7 @@ void shutdown_netfront(struct netfront_dev *dev) goto close; } state = xenbus_read_integer(path); - if (state < XenbusStateClosed) { + while (state < XenbusStateClosed) { err = xenbus_wait_for_state_change(path, &state, &dev->events); if (err) free(err); } diff --git a/extras/mini-os/pcifront.c b/extras/mini-os/pcifront.c index ccbef3f0e5..638fdb3966 100644 --- a/extras/mini-os/pcifront.c +++ b/extras/mini-os/pcifront.c @@ -354,7 +354,7 @@ void shutdown_pcifront(struct pcifront_dev *dev) goto close_pcifront; } state = xenbus_read_integer(path); - if (state < XenbusStateClosed) { + while (state < XenbusStateClosed) { err = xenbus_wait_for_state_change(path, &state, &dev->events); free(err); } |