WARNING - OLD ARCHIVES

This is an archived copy of the Xen.org mailing list, which we have preserved to ensure that existing links to archives are not broken. The live archive, which contains the latest emails, can be found at http://lists.xen.org/
   
 
 
Xen 
 
Home Products Support Community News
 
   
 

xen-changelog

[Xen-changelog] [xen-unstable] [PVFB] Make sure that framebuffer backend

To: xen-changelog@xxxxxxxxxxxxxxxxxxx
Subject: [Xen-changelog] [xen-unstable] [PVFB] Make sure that framebuffer backend goes away when the domain
From: Xen patchbot-unstable <patchbot-unstable@xxxxxxxxxxxxxxxxxxx>
Date: Sun, 03 Dec 2006 15:10:18 +0000
Delivery-date: Sun, 03 Dec 2006 07:10:22 -0800
Envelope-to: www-data@xxxxxxxxxxxxxxxxxx
List-help: <mailto:xen-changelog-request@lists.xensource.com?subject=help>
List-id: BK change log <xen-changelog.lists.xensource.com>
List-post: <mailto:xen-changelog@lists.xensource.com>
List-subscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=subscribe>
List-unsubscribe: <http://lists.xensource.com/cgi-bin/mailman/listinfo/xen-changelog>, <mailto:xen-changelog-request@lists.xensource.com?subject=unsubscribe>
Reply-to: xen-devel@xxxxxxxxxxxxxxxxxxx
Sender: xen-changelog-bounces@xxxxxxxxxxxxxxxxxxx
# 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

<Prev in Thread] Current Thread [Next in Thread>
  • [Xen-changelog] [xen-unstable] [PVFB] Make sure that framebuffer backend goes away when the domain, Xen patchbot-unstable <=