Module Name:    src
Committed By:   jmcneill
Date:           Fri Dec 30 11:06:18 UTC 2011

Modified Files:
        src/sys/arch/usermode/dev: vncfb.c
        src/sys/arch/usermode/usermode: thunk.c

Log Message:
use O_ASYNC + SIGIO instead of polling for input


To generate a diff of this commit:
cvs rdiff -u -r1.3 -r1.4 src/sys/arch/usermode/dev/vncfb.c
cvs rdiff -u -r1.59 -r1.60 src/sys/arch/usermode/usermode/thunk.c

Please note that diffs are not public domain; they are subject to the
copyright notices on the relevant files.

Modified files:

Index: src/sys/arch/usermode/dev/vncfb.c
diff -u src/sys/arch/usermode/dev/vncfb.c:1.3 src/sys/arch/usermode/dev/vncfb.c:1.4
--- src/sys/arch/usermode/dev/vncfb.c:1.3	Fri Dec 30 09:31:44 2011
+++ src/sys/arch/usermode/dev/vncfb.c	Fri Dec 30 11:06:18 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: vncfb.c,v 1.3 2011/12/30 09:31:44 jmcneill Exp $ */
+/* $NetBSD: vncfb.c,v 1.4 2011/12/30 11:06:18 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca>
@@ -35,7 +35,7 @@
 #include "opt_wsemul.h"
 
 #include <sys/cdefs.h>
-__KERNEL_RCSID(0, "$NetBSD: vncfb.c,v 1.3 2011/12/30 09:31:44 jmcneill Exp $");
+__KERNEL_RCSID(0, "$NetBSD: vncfb.c,v 1.4 2011/12/30 11:06:18 jmcneill Exp $");
 
 #include <sys/param.h>
 #include <sys/systm.h>
@@ -80,7 +80,7 @@ struct vncfb_softc {
 
 	int			sc_kbd_enable;
 
-	callout_t		sc_callout;
+	void			*sc_ih;
 	void			*sc_sih;
 };
 
@@ -103,7 +103,7 @@ static paddr_t	vncfb_mmap(void *, void *
 static void	vncfb_init_screen(void *, struct vcons_screen *, int, long *);
 
 static void	vncfb_update(struct vncfb_softc *, int, int, int, int);
-static void	vncfb_poll(void *);
+static int	vncfb_intr(void *);
 static void	vncfb_softintr(void *);
 
 static int	vncfb_kbd_enable(void *, int);
@@ -188,9 +188,6 @@ vncfb_attach(device_t parent, device_t s
 	    (sc->sc_depth / 8), KM_SLEEP);
 	KASSERT(sc->sc_framebuf != NULL);
 
-	callout_init(&sc->sc_callout, 0);
-	callout_setfunc(&sc->sc_callout, vncfb_poll, sc);
-
 	aprint_naive("\n");
 	aprint_normal(": %ux%u %ubpp (port %u)\n",
 	    sc->sc_width, sc->sc_height, sc->sc_depth, taa->u.vnc.port);
@@ -208,7 +205,7 @@ vncfb_attach(device_t parent, device_t s
 		panic("couldn't open rfb server");
 
 	sc->sc_sih = softint_establish(SOFTINT_SERIAL, vncfb_softintr, sc);
-	callout_schedule(&sc->sc_callout, 1);
+	sc->sc_ih = sigio_intr_establish(vncfb_intr, sc);
 
 	vcons_init(&sc->sc_vd, sc, &vncfb_defaultscreen, &vncfb_accessops);
 	sc->sc_vd.init_screen = vncfb_init_screen;
@@ -455,14 +452,17 @@ static void
 vncfb_update(struct vncfb_softc *sc, int x, int y, int w, int h)
 {
 	thunk_rfb_update(&sc->sc_rfb, x, y, w, h);
+	softint_schedule(sc->sc_sih);
 }
 
-static void
-vncfb_poll(void *priv)
+static int
+vncfb_intr(void *priv)
 {
 	struct vncfb_softc *sc = priv;
 
 	softint_schedule(sc->sc_sih);
+
+	return 0;
 }
 
 static void
@@ -486,8 +486,6 @@ vncfb_softintr(void *priv)
 			break;
 		}
 	}
-
-	callout_schedule(&sc->sc_callout, 1);
 }
 
 static int

Index: src/sys/arch/usermode/usermode/thunk.c
diff -u src/sys/arch/usermode/usermode/thunk.c:1.59 src/sys/arch/usermode/usermode/thunk.c:1.60
--- src/sys/arch/usermode/usermode/thunk.c:1.59	Fri Dec 30 11:05:07 2011
+++ src/sys/arch/usermode/usermode/thunk.c	Fri Dec 30 11:06:18 2011
@@ -1,4 +1,4 @@
-/* $NetBSD: thunk.c,v 1.59 2011/12/30 11:05:07 reinoud Exp $ */
+/* $NetBSD: thunk.c,v 1.60 2011/12/30 11:06:18 jmcneill Exp $ */
 
 /*-
  * Copyright (c) 2011 Jared D. McNeill <jmcne...@invisible.ca>
@@ -28,7 +28,7 @@
 
 #include <sys/cdefs.h>
 #ifdef __NetBSD__
-__RCSID("$NetBSD: thunk.c,v 1.59 2011/12/30 11:05:07 reinoud Exp $");
+__RCSID("$NetBSD: thunk.c,v 1.60 2011/12/30 11:06:18 jmcneill Exp $");
 #endif
 
 #include <sys/types.h>
@@ -1077,6 +1077,7 @@ thunk_rfb_poll(thunk_rfb_t *rfb, thunk_r
 		struct sockaddr_in sin;
 		struct pollfd fds[1];
 		socklen_t sinlen;
+		int flags;
 
 		/* poll for connections */
 		fds[0].fd = rfb->sockfd;
@@ -1103,6 +1104,19 @@ thunk_rfb_poll(thunk_rfb_t *rfb, thunk_r
 		}
 
 		rfb->connected = true;
+
+		/* enable sigio on input */
+		flags = fcntl(rfb->clientfd, F_GETFL, 0);
+		fcntl(rfb->clientfd, F_SETFL, flags | O_ASYNC);
+		error = fcntl(rfb->clientfd, F_SETOWN, getpid());
+		if (error) {
+			fprintf(stdout, "rfb: setown failed: %s\n",
+			    strerror(errno));
+			close(rfb->clientfd);
+			rfb->clientfd = -1;
+			return -1;
+		}
+
 		rfb->nupdates = 0;
 		thunk_rfb_update(rfb, 0, 0, rfb->width, rfb->height);
 	}

Reply via email to