Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/sys_socket.c
Show First 20 Lines • Show All 164 Lines • ▼ Show 20 Lines | case FIONBIO: | ||||
if (*(int *)data) | if (*(int *)data) | ||||
so->so_state |= SS_NBIO; | so->so_state |= SS_NBIO; | ||||
else | else | ||||
so->so_state &= ~SS_NBIO; | so->so_state &= ~SS_NBIO; | ||||
SOCK_UNLOCK(so); | SOCK_UNLOCK(so); | ||||
break; | break; | ||||
case FIOASYNC: | case FIOASYNC: | ||||
/* | |||||
* XXXRW: This code separately acquires SOCK_LOCK(so) and | |||||
* SOCKBUF_LOCK(&so->so_rcv) even though they are the same | |||||
* mutex to avoid introducing the assumption that they are | |||||
* the same. | |||||
*/ | |||||
if (*(int *)data) { | if (*(int *)data) { | ||||
SOCK_LOCK(so); | SOCK_LOCK(so); | ||||
so->so_state |= SS_ASYNC; | so->so_state |= SS_ASYNC; | ||||
SOCK_UNLOCK(so); | if (SOLISTENING(so)) { | ||||
so->sol_sbrcv_flags |= SB_ASYNC; | |||||
so->sol_sbsnd_flags |= SB_ASYNC; | |||||
} else { | |||||
SOCKBUF_LOCK(&so->so_rcv); | SOCKBUF_LOCK(&so->so_rcv); | ||||
so->so_rcv.sb_flags |= SB_ASYNC; | so->so_rcv.sb_flags |= SB_ASYNC; | ||||
SOCKBUF_UNLOCK(&so->so_rcv); | SOCKBUF_UNLOCK(&so->so_rcv); | ||||
SOCKBUF_LOCK(&so->so_snd); | SOCKBUF_LOCK(&so->so_snd); | ||||
so->so_snd.sb_flags |= SB_ASYNC; | so->so_snd.sb_flags |= SB_ASYNC; | ||||
SOCKBUF_UNLOCK(&so->so_snd); | SOCKBUF_UNLOCK(&so->so_snd); | ||||
} | |||||
SOCK_UNLOCK(so); | |||||
} else { | } else { | ||||
SOCK_LOCK(so); | SOCK_LOCK(so); | ||||
so->so_state &= ~SS_ASYNC; | so->so_state &= ~SS_ASYNC; | ||||
SOCK_UNLOCK(so); | if (SOLISTENING(so)) { | ||||
so->sol_sbrcv_flags &= ~SB_ASYNC; | |||||
so->sol_sbsnd_flags &= ~SB_ASYNC; | |||||
} else { | |||||
SOCKBUF_LOCK(&so->so_rcv); | SOCKBUF_LOCK(&so->so_rcv); | ||||
so->so_rcv.sb_flags &= ~SB_ASYNC; | so->so_rcv.sb_flags &= ~SB_ASYNC; | ||||
SOCKBUF_UNLOCK(&so->so_rcv); | SOCKBUF_UNLOCK(&so->so_rcv); | ||||
SOCKBUF_LOCK(&so->so_snd); | SOCKBUF_LOCK(&so->so_snd); | ||||
so->so_snd.sb_flags &= ~SB_ASYNC; | so->so_snd.sb_flags &= ~SB_ASYNC; | ||||
SOCKBUF_UNLOCK(&so->so_snd); | SOCKBUF_UNLOCK(&so->so_snd); | ||||
} | } | ||||
SOCK_UNLOCK(so); | |||||
} | |||||
break; | break; | ||||
case FIONREAD: | case FIONREAD: | ||||
/* Unlocked read. */ | /* Unlocked read. */ | ||||
*(int *)data = sbavail(&so->so_rcv); | *(int *)data = sbavail(&so->so_rcv); | ||||
break; | break; | ||||
case FIONWRITE: | case FIONWRITE: | ||||
▲ Show 20 Lines • Show All 482 Lines • ▼ Show 20 Lines | soaio_process_sb(struct socket *so, struct sockbuf *sb) | ||||
* ready so set SB_AIO to request a wakeup when the socket | * ready so set SB_AIO to request a wakeup when the socket | ||||
* becomes ready. | * becomes ready. | ||||
*/ | */ | ||||
if (!TAILQ_EMPTY(&sb->sb_aiojobq)) | if (!TAILQ_EMPTY(&sb->sb_aiojobq)) | ||||
sb->sb_flags |= SB_AIO; | sb->sb_flags |= SB_AIO; | ||||
sb->sb_flags &= ~SB_AIO_RUNNING; | sb->sb_flags &= ~SB_AIO_RUNNING; | ||||
SOCKBUF_UNLOCK(sb); | SOCKBUF_UNLOCK(sb); | ||||
ACCEPT_LOCK(); | |||||
SOCK_LOCK(so); | SOCK_LOCK(so); | ||||
sorele(so); | sorele(so); | ||||
} | } | ||||
void | void | ||||
soaio_rcv(void *context, int pending) | soaio_rcv(void *context, int pending) | ||||
{ | { | ||||
struct socket *so; | struct socket *so; | ||||
▲ Show 20 Lines • Show All 98 Lines • Show Last 20 Lines |