diff options
| author | Seigo Tanimura <tanimura@FreeBSD.org> | 2001-05-15 10:19:57 +0000 |
|---|---|---|
| committer | Seigo Tanimura <tanimura@FreeBSD.org> | 2001-05-15 10:19:57 +0000 |
| commit | 1b36970495b471ac74bc1c7ecec6f4c896f32af2 (patch) | |
| tree | 6c83742b01892cafae2ce46610557e85b1653352 /sys/netsmb/smb_trantcp.c | |
| parent | cd189e11950b76972ed468c1d243fb5551511661 (diff) | |
Notes
Diffstat (limited to 'sys/netsmb/smb_trantcp.c')
| -rw-r--r-- | sys/netsmb/smb_trantcp.c | 18 |
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); |
