summaryrefslogtreecommitdiff
path: root/sys/netsmb/smb_trantcp.c
diff options
context:
space:
mode:
authorSeigo Tanimura <tanimura@FreeBSD.org>2001-05-15 10:19:57 +0000
committerSeigo Tanimura <tanimura@FreeBSD.org>2001-05-15 10:19:57 +0000
commit1b36970495b471ac74bc1c7ecec6f4c896f32af2 (patch)
tree6c83742b01892cafae2ce46610557e85b1653352 /sys/netsmb/smb_trantcp.c
parentcd189e11950b76972ed468c1d243fb5551511661 (diff)
Notes
Diffstat (limited to 'sys/netsmb/smb_trantcp.c')
-rw-r--r--sys/netsmb/smb_trantcp.c18
1 files changed, 16 insertions, 2 deletions
diff --git a/sys/netsmb/smb_trantcp.c b/sys/netsmb/smb_trantcp.c
index fea246944b97..3d6b0827b99c 100644
--- a/sys/netsmb/smb_trantcp.c
+++ b/sys/netsmb/smb_trantcp.c
@@ -114,17 +114,31 @@ nbssn_rselect(struct nbpcb *nbp, struct timeval *tv, int events, struct proc *p)
}
timo = 0;
PROC_LOCK(p);
-retry:
p->p_flag |= P_SELECT;
+ PROC_UNLOCK(p);
error = nb_poll(nbp, events, p);
+ PROC_LOCK(p);
if (error) {
error = 0;
goto done;
}
if (tv) {
getmicrouptime(&rtv);
- if (timevalcmp(&rtv, &atv, >=))
+ if (timevalcmp(&rtv, &atv, >=)) {
+ /*
+ * An event of our interest may occur during locking a process.
+ * In order to avoid missing the event that occured during locking
+ * the process, test P_SELECT and rescan file descriptors if
+ * necessary.
+ */
+ if ((p->p_flag & P_SELECT) == 0) {
+ p->p_flag |= P_SELECT;
+ PROC_UNLOCK(p);
+ error = nb_poll(nbp, events, p);
+ PROC_LOCK(p);
+ }
goto done;
+ }
ttv = atv;
timevalsub(&ttv, &rtv);
timo = tvtohz(&ttv);