# HG changeset patch
# User Steven Smith <ssmith@xxxxxxxxxxxxx>
# Node ID 0536dbde1562cfafc1366e950ab01323e2873a43
# Parent d5d8aeb4fa3412833202ebf7d5e7f1df4e94f220
[PVFB] Make sure that framebuffer backend goes away when the domain
terminates, and that it cleans up its area of xenstore.
Tidy up argument parsing a little while I'm here.
Signed-off-by: Steven Smith <sos22@xxxxxxxxx>
---
tools/xenfb/sdlfb.c | 10 +++++++++-
tools/xenfb/vncfb.c | 10 +++++++++-
tools/xenfb/xenfb.c | 31 ++++++++++++++++++++++++++-----
tools/xenfb/xenfb.h | 1 +
4 files changed, 45 insertions(+), 7 deletions(-)
diff -r d5d8aeb4fa34 -r 0536dbde1562 tools/xenfb/sdlfb.c
--- a/tools/xenfb/sdlfb.c Fri Dec 01 11:52:33 2006 +0000
+++ b/tools/xenfb/sdlfb.c Fri Dec 01 12:03:15 2006 +0000
@@ -204,6 +204,7 @@ static struct option options[] = {
static struct option options[] = {
{ "domid", 1, NULL, 'd' },
{ "title", 1, NULL, 't' },
+ { NULL }
};
int main(int argc, char **argv)
@@ -220,6 +221,7 @@ int main(int argc, char **argv)
int do_quit = 0;
int opt;
char *endp;
+ int retval;
while ((opt = getopt_long(argc, argv, "d:t:", options,
NULL)) != -1) {
@@ -234,6 +236,8 @@ int main(int argc, char **argv)
case 't':
title = strdup(optarg);
break;
+ case '?':
+ exit(1);
}
}
if (optind != argc) {
@@ -323,7 +327,11 @@ int main(int argc, char **argv)
if (do_quit)
break;
- xenfb_poll(xenfb, &readfds);
+ retval = xenfb_poll(xenfb, &readfds);
+ if (retval == -2)
+ xenfb_teardown(xenfb);
+ if (retval < 0)
+ break;
}
xenfb_delete(xenfb);
diff -r d5d8aeb4fa34 -r 0536dbde1562 tools/xenfb/vncfb.c
--- a/tools/xenfb/vncfb.c Fri Dec 01 11:52:33 2006 +0000
+++ b/tools/xenfb/vncfb.c Fri Dec 01 12:03:15 2006 +0000
@@ -253,6 +253,7 @@ static struct option options[] = {
{ "title", 1, NULL, 't' },
{ "unused", 0, NULL, 'u' },
{ "listen", 1, NULL, 'l' },
+ { NULL }
};
int main(int argc, char **argv)
@@ -272,6 +273,7 @@ int main(int argc, char **argv)
int nfds;
char portstr[10];
char *endp;
+ int r;
while ((opt = getopt_long(argc, argv, "d:p:t:u", options,
NULL)) != -1) {
@@ -301,6 +303,8 @@ int main(int argc, char **argv)
case 'l':
listen = strdup(optarg);
break;
+ case '?':
+ exit(1);
}
}
if (optind != argc) {
@@ -383,7 +387,11 @@ int main(int argc, char **argv)
break;
}
- xenfb_poll(xenfb, &readfds);
+ r = xenfb_poll(xenfb, &readfds);
+ if (r == -2)
+ xenfb_teardown(xenfb);
+ if (r < 0)
+ break;
}
rfbScreenCleanup(server);
diff -r d5d8aeb4fa34 -r 0536dbde1562 tools/xenfb/xenfb.c
--- a/tools/xenfb/xenfb.c Fri Dec 01 11:52:33 2006 +0000
+++ b/tools/xenfb/xenfb.c Fri Dec 01 12:03:15 2006 +0000
@@ -187,6 +187,17 @@ struct xenfb *xenfb_new(void)
return NULL;
}
+/* Remove the backend area in xenbus since the framebuffer really is
+ going away. */
+void xenfb_teardown(struct xenfb *xenfb_pub)
+{
+ struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub;
+
+ xs_rm(xenfb->xsh, XBT_NULL, xenfb->fb.nodename);
+ xs_rm(xenfb->xsh, XBT_NULL, xenfb->kbd.nodename);
+}
+
+
void xenfb_delete(struct xenfb *xenfb_pub)
{
struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub;
@@ -564,7 +575,7 @@ static void xenfb_on_kbd_event(struct xe
xc_evtchn_notify(xenfb->evt_xch, xenfb->kbd.port);
}
-static void xenfb_on_state_change(struct xenfb_device *dev)
+static int xenfb_on_state_change(struct xenfb_device *dev)
{
enum xenbus_state state;
@@ -572,6 +583,10 @@ static void xenfb_on_state_change(struct
switch (state) {
case XenbusStateUnknown:
+ /* There was an error reading the frontend state. The
+ domain has probably gone away; in any case, there's
+ not much point in us continuing. */
+ return -1;
case XenbusStateInitialising:
case XenbusStateInitWait:
case XenbusStateInitialised:
@@ -585,14 +600,17 @@ static void xenfb_on_state_change(struct
xs_unwatch(dev->xenfb->xsh, dev->otherend, "");
xenfb_switch_state(dev, state);
}
-}
-
+ return 0;
+}
+
+/* Returns 0 normally, -1 on error, or -2 if the domain went away. */
int xenfb_poll(struct xenfb *xenfb_pub, fd_set *readfds)
{
struct xenfb_private *xenfb = (struct xenfb_private *)xenfb_pub;
evtchn_port_t port;
unsigned dummy;
char **vec;
+ int r;
if (FD_ISSET(xc_evtchn_fd(xenfb->evt_xch), readfds)) {
port = xc_evtchn_pending(xenfb->evt_xch);
@@ -611,8 +629,11 @@ int xenfb_poll(struct xenfb *xenfb_pub,
if (FD_ISSET(xs_fileno(xenfb->xsh), readfds)) {
vec = xs_read_watch(xenfb->xsh, &dummy);
free(vec);
- xenfb_on_state_change(&xenfb->fb);
- xenfb_on_state_change(&xenfb->kbd);
+ r = xenfb_on_state_change(&xenfb->fb);
+ if (r == 0)
+ r = xenfb_on_state_change(&xenfb->kbd);
+ if (r == -1)
+ return -2;
}
return 0;
diff -r d5d8aeb4fa34 -r 0536dbde1562 tools/xenfb/xenfb.h
--- a/tools/xenfb/xenfb.h Fri Dec 01 11:52:33 2006 +0000
+++ b/tools/xenfb/xenfb.h Fri Dec 01 12:03:15 2006 +0000
@@ -21,6 +21,7 @@ struct xenfb
struct xenfb *xenfb_new(void);
void xenfb_delete(struct xenfb *xenfb);
+void xenfb_teardown(struct xenfb *xenfb);
int xenfb_attach_dom(struct xenfb *xenfb, int domid);
_______________________________________________
Xen-changelog mailing list
Xen-changelog@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-changelog
|