Skip site navigation (1)Skip section navigation (2)
Date:      Sat, 1 Nov 2008 08:07:02 +0000 (UTC)
From:      Ed Schouten <ed@FreeBSD.org>
To:        src-committers@freebsd.org, svn-src-all@freebsd.org, svn-src-head@freebsd.org
Subject:   svn commit: r184520 - head/sys/dev/adb
Message-ID:  <200811010807.mA18725C002941@svn.freebsd.org>

next in thread | raw e-mail | index | archive | help
Author: ed
Date: Sat Nov  1 08:07:02 2008
New Revision: 184520
URL: http://svn.freebsd.org/changeset/base/184520

Log:
  Allow a read() on /dev/ams[0-9] to be interrupted.
  
  Right now ams_read() uses cv_wait() to wait for new data to arrive on
  the mouse device. This means that when you run `cat /dev/ams0', it
  cannot be interrupted directly. After you press ^C, you first need to
  move the mouse before cat will quit. Make this function use
  cv_wait_sig(), which allows it to be interrupted directly.
  
  Reviewed by:	nwhitehorn

Modified:
  head/sys/dev/adb/adb_mouse.c

Modified: head/sys/dev/adb/adb_mouse.c
==============================================================================
--- head/sys/dev/adb/adb_mouse.c	Sat Nov  1 06:57:59 2008	(r184519)
+++ head/sys/dev/adb/adb_mouse.c	Sat Nov  1 08:07:02 2008	(r184520)
@@ -382,6 +382,7 @@ ams_read(struct cdev *dev, struct uio *u
 	struct adb_mouse_softc *sc;
 	size_t len;
 	int8_t outpacket[8];
+	int error;
 
 	sc = CDEV_GET_SOFTC(dev);
 	if (sc == NULL)
@@ -403,7 +404,11 @@ ams_read(struct cdev *dev, struct uio *u
 
 	
 			/* Otherwise, block on new data */
-			cv_wait(&sc->sc_cv,&sc->sc_mtx);
+			error = cv_wait_sig(&sc->sc_cv, &sc->sc_mtx);
+			if (error) {
+				mtx_unlock(&sc->sc_mtx);
+				return (error);
+			}
 		}
 
 		sc->packet[0] = 1 << 7;



Want to link to this message? Use this URL: <https://mail-archive.FreeBSD.org/cgi/mid.cgi?200811010807.mA18725C002941>