Grab the socket buffer send or receive mutex when performing a

read-modify-write on the sb_state field.  This commit catches only
the "easy" ones where it doesn't interact with as yet unmerged
locking.
This commit is contained in:
Robert Watson 2004-06-15 03:51:44 +00:00
parent 62d7f46e88
commit 7721f5d760
Notes: svn2git 2020-12-20 02:59:44 +00:00
svn path=/head/; revision=130513
6 changed files with 36 additions and 3 deletions

View File

@ -211,7 +211,9 @@ fifo_open(ap)
}
fip->fi_readers = fip->fi_writers = 0;
wso->so_snd.sb_lowat = PIPE_BUF;
SOCKBUF_LOCK(&rso->so_rcv);
rso->so_rcv.sb_state |= SBS_CANTRCVMORE;
SOCKBUF_UNLOCK(&rso->so_rcv);
vp->v_fifoinfo = fip;
}
@ -229,7 +231,9 @@ fifo_open(ap)
if (ap->a_mode & FREAD) {
fip->fi_readers++;
if (fip->fi_readers == 1) {
SOCKBUF_LOCK(&fip->fi_writesock->so_snd);
fip->fi_writesock->so_snd.sb_state &= ~SBS_CANTSENDMORE;
SOCKBUF_UNLOCK(&fip->fi_writesock->so_snd);
if (fip->fi_writers > 0) {
wakeup(&fip->fi_writers);
sowwakeup(fip->fi_writesock);
@ -243,7 +247,9 @@ fifo_open(ap)
}
fip->fi_writers++;
if (fip->fi_writers == 1) {
SOCKBUF_LOCK(&fip->fi_writesock->so_rcv);
fip->fi_readsock->so_rcv.sb_state &= ~SBS_CANTRCVMORE;
SOCKBUF_UNLOCK(&fip->fi_writesock->so_rcv);
if (fip->fi_readers > 0) {
wakeup(&fip->fi_readers);
sorwakeup(fip->fi_writesock);

View File

@ -154,8 +154,12 @@ soisdisconnecting(so)
so->so_state &= ~SS_ISCONNECTING;
so->so_state |= SS_ISDISCONNECTING;
SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_CANTRCVMORE;
SOCKBUF_UNLOCK(&so->so_rcv);
SOCKBUF_LOCK(&so->so_snd);
so->so_snd.sb_state |= SBS_CANTSENDMORE;
SOCKBUF_UNLOCK(&so->so_snd);
wakeup(&so->so_timeo);
sowwakeup(so);
sorwakeup(so);
@ -168,8 +172,12 @@ soisdisconnected(so)
so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
so->so_state |= SS_ISDISCONNECTED;
SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_CANTRCVMORE;
SOCKBUF_UNLOCK(&so->so_rcv);
SOCKBUF_LOCK(&so->so_snd);
so->so_snd.sb_state |= SBS_CANTSENDMORE;
SOCKBUF_UNLOCK(&so->so_snd);
wakeup(&so->so_timeo);
sbdrop(&so->so_snd, so->so_snd.sb_cc);
sowwakeup(so);

View File

@ -154,8 +154,12 @@ soisdisconnecting(so)
so->so_state &= ~SS_ISCONNECTING;
so->so_state |= SS_ISDISCONNECTING;
SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_CANTRCVMORE;
SOCKBUF_UNLOCK(&so->so_rcv);
SOCKBUF_LOCK(&so->so_snd);
so->so_snd.sb_state |= SBS_CANTSENDMORE;
SOCKBUF_UNLOCK(&so->so_snd);
wakeup(&so->so_timeo);
sowwakeup(so);
sorwakeup(so);
@ -168,8 +172,12 @@ soisdisconnected(so)
so->so_state &= ~(SS_ISCONNECTING|SS_ISCONNECTED|SS_ISDISCONNECTING);
so->so_state |= SS_ISDISCONNECTED;
SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_CANTRCVMORE;
SOCKBUF_UNLOCK(&so->so_rcv);
SOCKBUF_LOCK(&so->so_snd);
so->so_snd.sb_state |= SBS_CANTSENDMORE;
SOCKBUF_UNLOCK(&so->so_snd);
wakeup(&so->so_timeo);
sbdrop(&so->so_snd, so->so_snd.sb_cc);
sowwakeup(so);

View File

@ -2249,8 +2249,11 @@ tcp_input(m, off0)
tp->rcv_up = th->th_seq + th->th_urp;
so->so_oobmark = so->so_rcv.sb_cc +
(tp->rcv_up - tp->rcv_nxt) - 1;
if (so->so_oobmark == 0)
if (so->so_oobmark == 0) {
SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_RCVATMARK;
SOCKBUF_UNLOCK(&so->so_rcv);
}
sohasoutofband(so);
tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA);
}

View File

@ -2249,8 +2249,11 @@ tcp_input(m, off0)
tp->rcv_up = th->th_seq + th->th_urp;
so->so_oobmark = so->so_rcv.sb_cc +
(tp->rcv_up - tp->rcv_nxt) - 1;
if (so->so_oobmark == 0)
if (so->so_oobmark == 0) {
SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_RCVATMARK;
SOCKBUF_UNLOCK(&so->so_rcv);
}
sohasoutofband(so);
tp->t_oobflags &= ~(TCPOOB_HAVEDATA | TCPOOB_HADDATA);
}

View File

@ -566,8 +566,11 @@ register struct spx *si;
cb->s_oobflags &= ~SF_IOOB;
if (so->so_rcv.sb_cc)
so->so_oobmark = so->so_rcv.sb_cc;
else
else {
SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state |= SBS_RCVATMARK;
SOCKBUF_UNLOCK(&so->so_rcv);
}
}
q = q->si_prev;
remque(q->si_next);
@ -597,7 +600,9 @@ register struct spx *si;
MCHTYPE(m, MT_OOBDATA);
spx_newchecks[1]++;
so->so_oobmark = 0;
SOCKBUF_LOCK(&so->so_rcv);
so->so_rcv.sb_state &= ~SBS_RCVATMARK;
SOCKBUF_UNLOCK(&so->so_rcv);
}
if (packetp == 0) {
m->m_data += SPINC;