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) { 
   | 
||
| 
     -  
   | 
||