Bug #4680 » 0001-io.c-fix-busy-wait-with-sendfile.patch
io.c | ||
---|---|---|
#ifdef USE_SENDFILE
|
||
static int
|
||
maygvl_copy_stream_wait_readwrite(struct copy_stream_struct *stp)
|
||
{
|
||
int ret;
|
||
rb_fd_zero(&stp->fds);
|
||
rb_fd_set(stp->src_fd, &stp->fds);
|
||
rb_fd_set(stp->dst_fd, &stp->fds);
|
||
ret = rb_fd_select(rb_fd_max(&stp->fds), &stp->fds, NULL, NULL, NULL);
|
||
if (ret == -1) {
|
||
stp->syserr = "select";
|
||
stp->error_no = errno;
|
||
return -1;
|
||
}
|
||
return 0;
|
||
}
|
||
static int
|
||
nogvl_copy_stream_sendfile(struct copy_stream_struct *stp)
|
||
{
|
||
struct stat src_stat, dst_stat;
|
||
... | ... | |
#if defined(EWOULDBLOCK) && EWOULDBLOCK != EAGAIN
|
||
case EWOULDBLOCK:
|
||
#endif
|
||
if (maygvl_copy_stream_wait_readwrite(stp) == -1)
|
||
#ifndef linux
|
||
/*
|
||
* Linux requires stp->src_fd to be a mmap-able (regular) file,
|
||
* select() reports regular files to always be "ready", so
|
||
* there is no need to select() on it.
|
||
* Other OSes may have the same limitation for sendfile() which
|
||
* allow us to bypass maygvl_copy_stream_wait_read()...
|
||
*/
|
||
if (maygvl_copy_stream_wait_read(stp) == -1)
|
||
return -1;
|
||
#endif
|
||
if (nogvl_copy_stream_wait_write(stp) == -1)
|
||
return -1;
|
||
if (rb_thread_interrupted(stp->th))
|
||
return -1;
|