Changeset View
Changeset View
Standalone View
Standalone View
head/sys/kern/uipc_sockbuf.c
Show First 20 Lines • Show All 308 Lines • ▼ Show 20 Lines | |||||
*/ | */ | ||||
void | void | ||||
sowakeup(struct socket *so, struct sockbuf *sb) | sowakeup(struct socket *so, struct sockbuf *sb) | ||||
{ | { | ||||
int ret; | int ret; | ||||
SOCKBUF_LOCK_ASSERT(sb); | SOCKBUF_LOCK_ASSERT(sb); | ||||
selwakeuppri(&sb->sb_sel, PSOCK); | selwakeuppri(sb->sb_sel, PSOCK); | ||||
if (!SEL_WAITING(&sb->sb_sel)) | if (!SEL_WAITING(sb->sb_sel)) | ||||
sb->sb_flags &= ~SB_SEL; | sb->sb_flags &= ~SB_SEL; | ||||
if (sb->sb_flags & SB_WAIT) { | if (sb->sb_flags & SB_WAIT) { | ||||
sb->sb_flags &= ~SB_WAIT; | sb->sb_flags &= ~SB_WAIT; | ||||
wakeup(&sb->sb_acc); | wakeup(&sb->sb_acc); | ||||
} | } | ||||
KNOTE_LOCKED(&sb->sb_sel.si_note, 0); | KNOTE_LOCKED(&sb->sb_sel->si_note, 0); | ||||
if (sb->sb_upcall != NULL && !(so->so_state & SS_ISDISCONNECTED)) { | if (sb->sb_upcall != NULL && !(so->so_state & SS_ISDISCONNECTED)) { | ||||
ret = sb->sb_upcall(so, sb->sb_upcallarg, M_NOWAIT); | ret = sb->sb_upcall(so, sb->sb_upcallarg, M_NOWAIT); | ||||
if (ret == SU_ISCONNECTED) { | if (ret == SU_ISCONNECTED) { | ||||
KASSERT(sb == &so->so_rcv, | KASSERT(sb == &so->so_rcv, | ||||
("SO_SND upcall returned SU_ISCONNECTED")); | ("SO_SND upcall returned SU_ISCONNECTED")); | ||||
soupcall_clear(so, SO_RCV); | soupcall_clear(so, SO_RCV); | ||||
} | } | ||||
} else | } else | ||||
▲ Show 20 Lines • Show All 1,017 Lines • Show Last 20 Lines |