| version 1.195, 2009/12/09 21:32:59 |
version 1.196, 2009/12/20 09:36:06 |
| Line 905 sosend(struct socket *so, struct mbuf *a |
|
| Line 905 sosend(struct socket *so, struct mbuf *a |
|
| struct proc *p; |
struct proc *p; |
| long space, len, resid, clen, mlen; |
long space, len, resid, clen, mlen; |
| int error, s, dontroute, atomic; |
int error, s, dontroute, atomic; |
| |
short wakeup_state = 0; |
| |
|
| p = l->l_proc; |
p = l->l_proc; |
| sodopendfree(); |
sodopendfree(); |
| Line 979 sosend(struct socket *so, struct mbuf *a |
|
| Line 980 sosend(struct socket *so, struct mbuf *a |
|
| goto release; |
goto release; |
| } |
} |
| sbunlock(&so->so_snd); |
sbunlock(&so->so_snd); |
| |
if (wakeup_state & SS_RESTARTSYS) { |
| |
error = ERESTART; |
| |
goto out; |
| |
} |
| error = sbwait(&so->so_snd); |
error = sbwait(&so->so_snd); |
| if (error) |
if (error) |
| goto out; |
goto out; |
| |
wakeup_state = so->so_state; |
| goto restart; |
goto restart; |
| } |
} |
| |
wakeup_state = 0; |
| mp = ⊤ |
mp = ⊤ |
| space -= clen; |
space -= clen; |
| do { |
do { |
| Line 1159 soreceive(struct socket *so, struct mbuf |
|
| Line 1166 soreceive(struct socket *so, struct mbuf |
|
| struct mbuf *nextrecord; |
struct mbuf *nextrecord; |
| int mbuf_removed = 0; |
int mbuf_removed = 0; |
| const struct domain *dom; |
const struct domain *dom; |
| |
short wakeup_state = 0; |
| |
|
| pr = so->so_proto; |
pr = so->so_proto; |
| atomic = pr->pr_flags & PR_ATOMIC; |
atomic = pr->pr_flags & PR_ATOMIC; |
| Line 1273 soreceive(struct socket *so, struct mbuf |
|
| Line 1281 soreceive(struct socket *so, struct mbuf |
|
| SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 1"); |
SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 1"); |
| SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 1"); |
SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 1"); |
| sbunlock(&so->so_rcv); |
sbunlock(&so->so_rcv); |
| error = sbwait(&so->so_rcv); |
if (wakeup_state & SS_RESTARTSYS) |
| |
error = ERESTART; |
| |
else |
| |
error = sbwait(&so->so_rcv); |
| if (error != 0) { |
if (error != 0) { |
| sounlock(so); |
sounlock(so); |
| splx(s); |
splx(s); |
| return error; |
return error; |
| } |
} |
| |
wakeup_state = so->so_state; |
| goto restart; |
goto restart; |
| } |
} |
| dontblock: |
dontblock: |
| Line 1417 soreceive(struct socket *so, struct mbuf |
|
| Line 1429 soreceive(struct socket *so, struct mbuf |
|
| panic("receive 3"); |
panic("receive 3"); |
| #endif |
#endif |
| so->so_state &= ~SS_RCVATMARK; |
so->so_state &= ~SS_RCVATMARK; |
| |
wakeup_state = 0; |
| len = uio->uio_resid; |
len = uio->uio_resid; |
| if (so->so_oobmark && len > so->so_oobmark - offset) |
if (so->so_oobmark && len > so->so_oobmark - offset) |
| len = so->so_oobmark - offset; |
len = so->so_oobmark - offset; |
| Line 1549 soreceive(struct socket *so, struct mbuf |
|
| Line 1562 soreceive(struct socket *so, struct mbuf |
|
| NULL, (struct mbuf *)(long)flags, NULL, l); |
NULL, (struct mbuf *)(long)flags, NULL, l); |
| SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2"); |
SBLASTRECORDCHK(&so->so_rcv, "soreceive sbwait 2"); |
| SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2"); |
SBLASTMBUFCHK(&so->so_rcv, "soreceive sbwait 2"); |
| error = sbwait(&so->so_rcv); |
if (wakeup_state & SS_RESTARTSYS) |
| |
error = ERESTART; |
| |
else |
| |
error = sbwait(&so->so_rcv); |
| if (error != 0) { |
if (error != 0) { |
| sbunlock(&so->so_rcv); |
sbunlock(&so->so_rcv); |
| sounlock(so); |
sounlock(so); |
| Line 1558 soreceive(struct socket *so, struct mbuf |
|
| Line 1574 soreceive(struct socket *so, struct mbuf |
|
| } |
} |
| if ((m = so->so_rcv.sb_mb) != NULL) |
if ((m = so->so_rcv.sb_mb) != NULL) |
| nextrecord = m->m_nextpkt; |
nextrecord = m->m_nextpkt; |
| |
wakeup_state = so->so_state; |
| } |
} |
| } |
} |
| |
|
| Line 1625 soshutdown(struct socket *so, int how) |
|
| Line 1642 soshutdown(struct socket *so, int how) |
|
| } |
} |
| |
|
| void |
void |
| soabortop(struct socket *so) |
sorestart(struct socket *so) |
| { |
{ |
| #if 0 /* ad@ wrote this, then disabled it as 'not working' */ |
/* |
| |
* An application has called close() on an fd on which another |
| |
* of its threads has called a socket system call. |
| |
* Mark this and wake everyone up, and code that would block again |
| |
* instead returns ERESTART. |
| |
* On system call re-entry the fd is validated and EBADF returned. |
| |
* Any other fd will block again on the 2nd syscall. |
| |
*/ |
| solock(so); |
solock(so); |
| so->so_state |= SS_ISABORTING; |
so->so_state |= SS_RESTARTSYS; |
| cv_broadcast(&so->so_cv); |
cv_broadcast(&so->so_cv); |
| soshutdown(so, SHUT_RDWR); |
cv_broadcast(&so->so_snd.sb_cv); |
| |
cv_broadcast(&so->so_rcv.sb_cv); |
| sounlock(so); |
sounlock(so); |
| #endif |
|
| } |
} |
| |
|
| void |
void |