aboutsummaryrefslogtreecommitdiffstats
path: root/extras/mini-os/fbfront.c
diff options
context:
space:
mode:
authorKeir Fraser <keir.fraser@citrix.com>2010-04-07 08:15:55 +0100
committerKeir Fraser <keir.fraser@citrix.com>2010-04-07 08:15:55 +0100
commit42e3a21b11ec98ecfd1e3473c9bbc8e9e98b10b5 (patch)
tree7c9cf201fad323d93433f5b211101195c1cfd5a3 /extras/mini-os/fbfront.c
parent449e0d3d0e781aa53b70ae753f9c9c1511ce7e61 (diff)
downloadxen-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/mini-os/fbfront.c')
-rw-r--r--extras/mini-os/fbfront.c15
1 files changed, 10 insertions, 5 deletions
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);