Bug #4463 ยป 0001-release-GVL-for-fcntl-for-operations-that-may-block.patch
| io.c | ||
|---|---|---|
|
}
|
||
|
#if defined(HAVE_FCNTL) && defined(F_SETLKW)
|
||
|
/* release GVL for blocking POSIX locks */
|
||
|
struct fcntl_arg {
|
||
|
int fd;
|
||
|
int cmd;
|
||
|
long narg;
|
||
|
};
|
||
|
static VALUE nogvl_fcntl(void *ptr)
|
||
|
{
|
||
|
struct fcntl_arg *arg = ptr;
|
||
|
return (VALUE)fcntl(arg->fd, arg->cmd, arg->narg);
|
||
|
}
|
||
|
static int maygvl_fcntl(int fd, int cmd, long narg)
|
||
|
{
|
||
|
struct fcntl_arg arg;
|
||
|
if (cmd != F_SETLKW)
|
||
|
return fcntl(fd, cmd, narg);
|
||
|
arg.fd = fd;
|
||
|
arg.cmd = cmd;
|
||
|
arg.narg = narg;
|
||
|
return (int)rb_thread_blocking_region(nogvl_fcntl, &arg, RUBY_UBF_IO, 0);
|
||
|
}
|
||
|
#else /* no (F_SETLKW) or POSIX locks */
|
||
|
# define maygvl_fcntl fcntl
|
||
|
#endif
|
||
|
static int
|
||
|
io_cntl(int fd, unsigned long cmd, long narg, int io_p)
|
||
|
{
|
||
| ... | ... | |
|
# if defined(__CYGWIN__)
|
||
|
retval = io_p?ioctl(fd, cmd, (void*)narg):fcntl(fd, cmd, narg);
|
||
|
# else
|
||
|
retval = io_p?ioctl(fd, cmd, narg):fcntl(fd, (int)cmd, narg);
|
||
|
retval = io_p?ioctl(fd, cmd, narg):maygvl_fcntl(fd, (int)cmd, narg);
|
||
|
# endif
|
||
|
# if defined(F_DUPFD)
|
||
|
if (!io_p && retval != -1 && cmd == F_DUPFD) {
|
||
|
-
|
||