* io.c (struct io_cntl_arg): remove io_p member.
* io.c (nogvl_fcntl, do_fcntl, rb_fcntl): separated from ioctl functions. * io.c (nogvl_io_cntl): remove fcntl depended logic. * io.c (io_cntl): ditto. * io.c (rb_io_ctl): ditto. * io.c (rb_io_ioctl): ditto. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@33715 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
f13d10a0af
commit
fc7bb927a2
@ -1,3 +1,12 @@
|
|||||||
|
Sat Nov 12 11:00:42 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||||
|
|
||||||
|
* io.c (struct io_cntl_arg): remove io_p member.
|
||||||
|
* io.c (nogvl_fcntl, do_fcntl, rb_fcntl): separated from ioctl functions.
|
||||||
|
* io.c (nogvl_io_cntl): remove fcntl depended logic.
|
||||||
|
* io.c (io_cntl): ditto.
|
||||||
|
* io.c (rb_io_ctl): ditto.
|
||||||
|
* io.c (rb_io_ioctl): ditto.
|
||||||
|
|
||||||
Sat Nov 12 10:59:49 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
Sat Nov 12 10:59:49 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
|
||||||
|
|
||||||
* io.c (setup_narg): fix off by one bug.
|
* io.c (setup_narg): fix off by one bug.
|
||||||
|
122
io.c
122
io.c
@ -7860,51 +7860,30 @@ rb_f_select(int argc, VALUE *argv, VALUE obj)
|
|||||||
return rb_ensure(select_call, (VALUE)&args, select_end, (VALUE)&args);
|
return rb_ensure(select_call, (VALUE)&args, select_end, (VALUE)&args);
|
||||||
}
|
}
|
||||||
|
|
||||||
struct io_cntl_arg {
|
struct ioctl_arg {
|
||||||
int fd;
|
int fd;
|
||||||
int cmd;
|
int cmd;
|
||||||
long narg;
|
long narg;
|
||||||
int io_p;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
static VALUE nogvl_io_cntl(void *ptr)
|
static VALUE nogvl_ioctl(void *ptr)
|
||||||
{
|
{
|
||||||
struct io_cntl_arg *arg = ptr;
|
struct ioctl_arg *arg = ptr;
|
||||||
|
|
||||||
if (arg->io_p)
|
|
||||||
return (VALUE)ioctl(arg->fd, arg->cmd, arg->narg);
|
return (VALUE)ioctl(arg->fd, arg->cmd, arg->narg);
|
||||||
else
|
|
||||||
#if defined(F_DUPFD)
|
|
||||||
if (arg->cmd == F_DUPFD)
|
|
||||||
return (VALUE)rb_cloexec_fcntl_dupfd(arg->fd, (int)arg->narg);
|
|
||||||
else
|
|
||||||
#endif
|
|
||||||
return (VALUE)fcntl(arg->fd, arg->cmd, arg->narg);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
static int
|
static int
|
||||||
io_cntl(int fd, int cmd, long narg, int io_p)
|
do_ioctl(int fd, int cmd, long narg)
|
||||||
{
|
{
|
||||||
int retval;
|
int retval;
|
||||||
struct io_cntl_arg arg;
|
struct ioctl_arg arg;
|
||||||
|
|
||||||
#ifndef HAVE_FCNTL
|
|
||||||
if (!io_p) {
|
|
||||||
rb_notimplement();
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
arg.fd = fd;
|
arg.fd = fd;
|
||||||
arg.cmd = cmd;
|
arg.cmd = cmd;
|
||||||
arg.narg = narg;
|
arg.narg = narg;
|
||||||
arg.io_p = io_p;
|
|
||||||
|
|
||||||
retval = (int)rb_thread_io_blocking_region(nogvl_io_cntl, &arg, fd);
|
retval = (int)rb_thread_io_blocking_region(nogvl_ioctl, &arg, fd);
|
||||||
#if defined(F_DUPFD)
|
|
||||||
if (!io_p && retval != -1 && cmd == F_DUPFD) {
|
|
||||||
rb_update_max_fd(retval);
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
|
|
||||||
return retval;
|
return retval;
|
||||||
}
|
}
|
||||||
@ -7973,7 +7952,7 @@ setup_narg(int cmd, VALUE *argp, int io_p)
|
|||||||
}
|
}
|
||||||
|
|
||||||
static VALUE
|
static VALUE
|
||||||
rb_io_ctl(VALUE io, VALUE req, VALUE arg, int io_p)
|
rb_ioctl(VALUE io, VALUE req, VALUE arg)
|
||||||
{
|
{
|
||||||
int cmd = NUM2INT(req);
|
int cmd = NUM2INT(req);
|
||||||
rb_io_t *fptr;
|
rb_io_t *fptr;
|
||||||
@ -7982,28 +7961,17 @@ rb_io_ctl(VALUE io, VALUE req, VALUE arg, int io_p)
|
|||||||
|
|
||||||
rb_secure(2);
|
rb_secure(2);
|
||||||
|
|
||||||
narg = setup_narg(cmd, &arg, io_p);
|
narg = setup_narg(cmd, &arg, 1);
|
||||||
GetOpenFile(io, fptr);
|
GetOpenFile(io, fptr);
|
||||||
retval = io_cntl(fptr->fd, cmd, narg, io_p);
|
retval = do_ioctl(fptr->fd, cmd, narg);
|
||||||
if (retval < 0) rb_sys_fail_path(fptr->pathv);
|
if (retval < 0) rb_sys_fail_path(fptr->pathv);
|
||||||
if (RB_TYPE_P(arg, T_STRING) && RSTRING_PTR(arg)[RSTRING_LEN(arg)-1] != 17) {
|
if (RB_TYPE_P(arg, T_STRING) && RSTRING_PTR(arg)[RSTRING_LEN(arg)-1] != 17) {
|
||||||
rb_raise(rb_eArgError, "return value overflowed string");
|
rb_raise(rb_eArgError, "return value overflowed string");
|
||||||
}
|
}
|
||||||
|
|
||||||
if (!io_p && cmd == F_SETFL) {
|
|
||||||
if (narg & O_NONBLOCK) {
|
|
||||||
fptr->mode |= FMODE_WSPLIT_INITIALIZED;
|
|
||||||
fptr->mode &= ~FMODE_WSPLIT;
|
|
||||||
}
|
|
||||||
else {
|
|
||||||
fptr->mode &= ~(FMODE_WSPLIT_INITIALIZED|FMODE_WSPLIT);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
return INT2NUM(retval);
|
return INT2NUM(retval);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* ios.ioctl(integer_cmd, arg) -> integer
|
* ios.ioctl(integer_cmd, arg) -> integer
|
||||||
@ -8022,10 +7990,78 @@ rb_io_ioctl(int argc, VALUE *argv, VALUE io)
|
|||||||
VALUE req, arg;
|
VALUE req, arg;
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "11", &req, &arg);
|
rb_scan_args(argc, argv, "11", &req, &arg);
|
||||||
return rb_io_ctl(io, req, arg, 1);
|
return rb_ioctl(io, req, arg);
|
||||||
}
|
}
|
||||||
|
|
||||||
#ifdef HAVE_FCNTL
|
#ifdef HAVE_FCNTL
|
||||||
|
struct fcntl_arg {
|
||||||
|
int fd;
|
||||||
|
int cmd;
|
||||||
|
long narg;
|
||||||
|
};
|
||||||
|
|
||||||
|
static VALUE nogvl_fcntl(void *ptr)
|
||||||
|
{
|
||||||
|
struct fcntl_arg *arg = ptr;
|
||||||
|
|
||||||
|
#if defined(F_DUPFD)
|
||||||
|
if (arg->cmd == F_DUPFD)
|
||||||
|
return (VALUE)rb_cloexec_fcntl_dupfd(arg->fd, (int)arg->narg);
|
||||||
|
#endif
|
||||||
|
return (VALUE)fcntl(arg->fd, arg->cmd, arg->narg);
|
||||||
|
}
|
||||||
|
|
||||||
|
static int
|
||||||
|
do_fcntl(int fd, int cmd, long narg)
|
||||||
|
{
|
||||||
|
int retval;
|
||||||
|
struct fcntl_arg arg;
|
||||||
|
|
||||||
|
arg.fd = fd;
|
||||||
|
arg.cmd = cmd;
|
||||||
|
arg.narg = narg;
|
||||||
|
|
||||||
|
retval = (int)rb_thread_io_blocking_region(nogvl_fcntl, &arg, fd);
|
||||||
|
#if defined(F_DUPFD)
|
||||||
|
if (retval != -1 && cmd == F_DUPFD) {
|
||||||
|
rb_update_max_fd(retval);
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
|
||||||
|
return retval;
|
||||||
|
}
|
||||||
|
|
||||||
|
static VALUE
|
||||||
|
rb_fcntl(VALUE io, VALUE req, VALUE arg)
|
||||||
|
{
|
||||||
|
int cmd = NUM2INT(req);
|
||||||
|
rb_io_t *fptr;
|
||||||
|
long narg;
|
||||||
|
int retval;
|
||||||
|
|
||||||
|
rb_secure(2);
|
||||||
|
|
||||||
|
narg = setup_narg(cmd, &arg, 0);
|
||||||
|
GetOpenFile(io, fptr);
|
||||||
|
retval = do_fcntl(fptr->fd, cmd, narg);
|
||||||
|
if (retval < 0) rb_sys_fail_path(fptr->pathv);
|
||||||
|
if (RB_TYPE_P(arg, T_STRING) && RSTRING_PTR(arg)[RSTRING_LEN(arg)-1] != 17) {
|
||||||
|
rb_raise(rb_eArgError, "return value overflowed string");
|
||||||
|
}
|
||||||
|
|
||||||
|
if (cmd == F_SETFL) {
|
||||||
|
if (narg & O_NONBLOCK) {
|
||||||
|
fptr->mode |= FMODE_WSPLIT_INITIALIZED;
|
||||||
|
fptr->mode &= ~FMODE_WSPLIT;
|
||||||
|
}
|
||||||
|
else {
|
||||||
|
fptr->mode &= ~(FMODE_WSPLIT_INITIALIZED|FMODE_WSPLIT);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
return INT2NUM(retval);
|
||||||
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call-seq:
|
* call-seq:
|
||||||
* ios.fcntl(integer_cmd, arg) -> integer
|
* ios.fcntl(integer_cmd, arg) -> integer
|
||||||
@ -8045,7 +8081,7 @@ rb_io_fcntl(int argc, VALUE *argv, VALUE io)
|
|||||||
VALUE req, arg;
|
VALUE req, arg;
|
||||||
|
|
||||||
rb_scan_args(argc, argv, "11", &req, &arg);
|
rb_scan_args(argc, argv, "11", &req, &arg);
|
||||||
return rb_io_ctl(io, req, arg, 0);
|
return rb_fcntl(io, req, arg);
|
||||||
}
|
}
|
||||||
#else
|
#else
|
||||||
#define rb_io_fcntl rb_f_notimplement
|
#define rb_io_fcntl rb_f_notimplement
|
||||||
|
Loading…
x
Reference in New Issue
Block a user