Changeset View
Changeset View
Standalone View
Standalone View
sys/kern/uipc_usrreq.c
| Show First 20 Lines • Show All 2,440 Lines • ▼ Show 20 Lines | uipc_sendfile_wait(struct socket *so, off_t need, int *space) | ||||
| UNP_PCB_UNLOCK(unp2); | UNP_PCB_UNLOCK(unp2); | ||||
| while ((*space = uipc_stream_sbspace(sb)) < need && | while ((*space = uipc_stream_sbspace(sb)) < need && | ||||
| (*space < so->so_snd.sb_hiwat / 2)) { | (*space < so->so_snd.sb_hiwat / 2)) { | ||||
| UIPC_STREAM_SBCHECK(sb); | UIPC_STREAM_SBCHECK(sb); | ||||
| if (nonblock) { | if (nonblock) { | ||||
| SOCK_RECVBUF_UNLOCK(so2); | SOCK_RECVBUF_UNLOCK(so2); | ||||
| return (EAGAIN); | return (EAGAIN); | ||||
| } | } | ||||
| if (!sockref) | if (!sockref) { | ||||
| soref(so2); | soref(so2); | ||||
| sockref = true; | |||||
| } | |||||
| error = uipc_stream_sbwait(so2, so->so_snd.sb_timeo); | error = uipc_stream_sbwait(so2, so->so_snd.sb_timeo); | ||||
| if (error == 0 && | if (error == 0 && | ||||
| __predict_false(sb->sb_state & SBS_CANTRCVMORE)) | __predict_false(sb->sb_state & SBS_CANTRCVMORE)) | ||||
| error = EPIPE; | error = EPIPE; | ||||
| if (error) { | if (error) { | ||||
| SOCK_RECVBUF_UNLOCK(so2); | SOCK_RECVBUF_UNLOCK(so2); | ||||
| sorele(so2); | sorele(so2); | ||||
| return (error); | return (error); | ||||
| ▲ Show 20 Lines • Show All 2,212 Lines • Show Last 20 Lines | |||||