diff options
| author | dm120769 <none@none> | 2007-04-27 07:12:39 -0700 |
|---|---|---|
| committer | dm120769 <none@none> | 2007-04-27 07:12:39 -0700 |
| commit | 3348528f7ec68bf2f11d0cbd5c3b9932ea7f0d5c (patch) | |
| tree | 855ea6b5ae3786966e656876cd1ac3992e072d51 /usr/src/uts/common/io/devpoll.c | |
| parent | 85b65b39e9a6fea849facdcfc7d06f5ece340e36 (diff) | |
| download | illumos-gate-3348528f7ec68bf2f11d0cbd5c3b9932ea7f0d5c.tar.gz | |
backout 6265036/6531693: causes 6544953
Diffstat (limited to 'usr/src/uts/common/io/devpoll.c')
| -rw-r--r-- | usr/src/uts/common/io/devpoll.c | 8 |
1 files changed, 5 insertions, 3 deletions
diff --git a/usr/src/uts/common/io/devpoll.c b/usr/src/uts/common/io/devpoll.c index 274737a147..965df2a9a1 100644 --- a/usr/src/uts/common/io/devpoll.c +++ b/usr/src/uts/common/io/devpoll.c @@ -19,7 +19,7 @@ * CDDL HEADER END */ /* - * Copyright 2007 Sun Microsystems, Inc. All rights reserved. + * Copyright 2005 Sun Microsystems, Inc. All rights reserved. * Use is subject to license terms. */ @@ -688,6 +688,7 @@ dpioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, int *rvalp) timestruc_t now; timestruc_t rqtime; timestruc_t *rqtp = NULL; + int timecheck = 0; minor_t minor; dp_entry_t *dpep; pollcache_t *pcp; @@ -696,6 +697,7 @@ dpioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, int *rvalp) if (cmd == DP_POLL) { /* do this now, before we sleep on DP_WRITER_PRESENT below */ + timecheck = timechanged; gethrestime(&now); } minor = getminor(dev); @@ -758,7 +760,7 @@ dpioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, int *rvalp) return (0); mutex_enter(&curthread->t_delay_lock); while ((rval = cv_waituntil_sig(&curthread->t_delay_cv, - &curthread->t_delay_lock, rqtp)) > 0) + &curthread->t_delay_lock, rqtp, timecheck)) > 0) continue; mutex_exit(&curthread->t_delay_lock); return ((rval == 0)? EINTR : 0); @@ -813,7 +815,7 @@ dpioctl(dev_t dev, int cmd, intptr_t arg, int mode, cred_t *credp, int *rvalp) if (time_out == 0) /* immediate timeout */ break; rval = cv_waituntil_sig(&pcp->pc_cv, &pcp->pc_lock, - rqtp); + rqtp, timecheck); /* * If we were awakened by a signal or timeout * then break the loop, else poll again. |
