8000 * io.c (struct io_cntl_arg): remove io_p member. · ileitch/ruby@fc7bb92 · GitHub
[go: up one dir, main page]

Skip to content

Commit fc7bb92

Browse files
author
kosaki
committed
* 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
1 parent f13d10a commit fc7bb92

File tree

2 files changed

+89
-44
lines changed

2 files changed

+89
-44
lines changed

ChangeLog

Lines changed: 9 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1,3 +1,12 @@
1+
Sat Nov 12 11:00:42 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
2+
3+
* io.c (struct io_cntl_arg): remove io_p member.
4+
* io.c (nogvl_fcntl, do_fcntl, rb_fcntl): separated from ioctl functions.
5+
* io.c (nogvl_io_cntl): remove fcntl depended logic.
6+
* io.c (io_cntl): ditto.
7+
* io.c (rb_io_ctl): ditto.
8+
* io.c (rb_io_ioctl): ditto.
9+
110
Sat Nov 12 10:59:49 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
211

312
* io.c (setup_narg): fix off by one bug.

io.c

Lines changed: 80 additions & 44 deletions
Original file line numberDiff line numberDiff line change
@@ -7860,51 +7860,30 @@ rb_f_select(int argc, VALUE *argv, VALUE obj)
78607860
return rb_ensure(select_call, (VALUE)&args, select_end, (VALUE)&args);
78617861
}
78627862

7863-
struct io_cntl_arg {
7863+
struct ioctl_arg {
78647864
int fd;
78657865
int cmd;
78667866
long narg;
7867-
int io_p;
78687867
};
78697868

7870-
static VALUE nogvl_io_cntl(void *ptr)
7869+
static VALUE nogvl_ioctl(void *ptr)
78717870
{
7872-
st 10000 ruct io_cntl_arg *arg = ptr;
7871+
struct ioctl_arg *arg = ptr;
78737872

7874-
if (arg->io_p)
7875-
return (VALUE)ioctl(arg->fd, arg->cmd, arg->narg);
7876-
else
7877-
#if defined(F_DUPFD)
7878-
if (arg->cmd == F_DUPFD)
7879-
return (VALUE)rb_cloexec_fcntl_dupfd(arg->fd, (int)arg->narg);
7880-
else
7881-
#endif
7882-
return (VALUE)fcntl(arg->fd, arg->cmd, arg->narg);
7873+
return (VALUE)ioctl(arg->fd, arg->cmd, arg->narg);
78837874
}
78847875

78857876
static int
7886-
io_cntl(int fd, int cmd, long narg, int io_p)
7877+
do_ioctl(int fd, int cmd, long narg)
78877878
{
78887879
int retval;
7889-
struct io_cntl_arg arg;
7890-
7891-
#ifndef HAVE_FCNTL
7892-
if (!io_p) {
7893-
rb_notimplement();
7894-
}
7895-
#endif
7880+
struct ioctl_arg arg;
78967881

78977882
arg.fd = fd;
78987883
arg.cmd = cmd;
78997884
arg.narg = narg;
7900-
arg.io_p = io_p;
79017885

7902-
retval = (int)rb_thread_io_blocking_region(nogvl_io_cntl, &arg, fd);
7903-
#if defined(F_DUPFD)
7904-
if (!io_p && retval != -1 && cmd == F_DUPFD) {
7905-
rb_update_max_fd(retval);
7906-
}
7907-
#endif
7886+
retval = (int)rb_thread_io_blocking_region(nogvl_ioctl, &arg, fd);
79087887

79097888
return retval;
79107889
}
@@ -7973,7 +7952,7 @@ setup_narg(int cmd, VALUE *argp, int io_p)
79737952
}
79747953

79757954
static VALUE
7976-
rb_io_ctl(VALUE io, VALUE req, VALUE arg, int io_p)
7955+
rb_ioctl(VALUE io, VALUE req, VALUE arg)
79777956
{
79787957
int cmd = NUM2INT(req);
79797958
rb_io_t *fptr;
@@ -7982,28 +7961,17 @@ rb_io_ctl(VALUE io, VALUE req, VALUE arg, int io_p)
79827961

79837962
rb_secure(2);
79847963

7985-
narg = setup_narg(cmd, &arg, io_p);
7964+
narg = setup_narg(cmd, &arg, 1);
79867965
GetOpenFile(io, fptr);
7987-
retval = io_cntl(fptr->fd, cmd, narg, io_p);
7966+
retval = do_ioctl(fptr->fd, cmd, narg);
79887967
if (retval < 0) rb_sys_fail_path(fptr->pathv);
79897968
if (RB_TYPE_P(arg, T_STRING) && RSTRING_PTR(arg)[RSTRING_LEN(arg)-1] != 17) {
79907969
rb_raise(rb_eArgError, "return value overflowed string");
79917970
}
79927971

7993-
if (!io_p && cmd == F_SETFL) {
7994-
if (narg & O_NONBLOCK) {
7995-
fptr->mode |= FMODE_WSPLIT_INITIALIZED;
7996-
fptr->mode &= ~FMODE_WSPLIT;
7997-
}
7998-
else {
7999-
fptr->mode &= ~(FMODE_WSPLIT_INITIALIZED|FMODE_WSPLIT);
8000-
}
8001-
}
8002-
80037972
return INT2NUM(retval);
80047973
}
80057974

8006-
80077975
/*
80087976
* call-seq:
80097977
* ios.ioctl(integer_cmd, arg) -> integer
@@ -8022,10 +7990,78 @@ rb_io_ioctl(int argc, VALUE *argv, VALUE io)
80227990
VALUE req, arg;
80237991

80247992
rb_scan_args(argc, argv, "11", &req, &arg);
8025-
return rb_io_ctl(io, req, arg, 1);
7993+
return rb_ioctl(io, req, arg);
80267994
}
80277995

80287996
#ifdef HAVE_FCNTL
7997+
struct fcntl_arg {
7998+
int fd;
7999+
int cmd;
8000+
long narg;
8001+
};
8002+
8003+
static VALUE nogvl_fcntl(void *ptr)
8004+
{
8005+
struct fcntl_arg *arg = ptr;
8006+
8007+
#if defined(F_DUPFD)
8008+
if (arg->cmd == F_DUPFD)
8009+
return (VALUE)rb_cloexec_fcntl_dupfd(arg->fd, (int)arg->narg);
8010+
#endif
8011+
return (VALUE)fcntl(arg->fd, arg->cmd, arg->narg);
8012+
}
8013+
8014+
static int
8015+
do_fcntl(int fd, int cmd, long narg)
8016+
{
8017+
int retval;
8018+
struct fcntl_arg arg;
8019+
8020+
arg.fd = fd;
8021+
arg.cmd = cmd;
8022+
arg.narg = narg;
8023+
8024+
retval = (int)rb_thread_io_blocking_region(nogvl_fcntl, &arg, fd);
8025+
#if defined(F_DUPFD)
8026+
if (retval != -1 && cmd == F_DUPFD) {
8027+
rb_update_max_fd(retval);
8028+
}
8029+
#endif
8030+
8031+
return retval;
8032+
}
8033+
8034+
static VALUE
8035+
rb_fcntl(VALUE io, VALUE req, VALUE arg)
8036+
{
8037+
int cmd = NUM2INT(req);
8038+
rb_io_t *fptr;
8039+
long narg;
8040+
int retval;
8041+
8042+
rb_secure(2);
8043+
8044+
narg = setup_narg(cmd, &arg, 0);
8045+
GetOpenFile(io, fptr);
8046+
retval = do_fcntl(fptr->fd, cmd, narg);
8047+
if (retval < 0) rb_sys_fail_path(fptr->pathv);
8048+
if (RB_TYPE_P(arg, T_STRING) && RSTRING_PTR(arg)[RSTRING_LEN(arg)-1] != 17) {
8049+
rb_raise(rb_eArgError, "return value overflowed string");
8050+
}
8051+
8052+
if (cmd == F_SETFL) {
8053+
if (narg & O_NONBLOCK) {
8054+
fptr->mode |= FMODE_WSPLIT_INITIALIZED;
8055+
fptr->mode &= ~FMODE_WSPLIT;
8056+
}
8057+
else {
8058+
fptr->mode &= ~(FMODE_WSPLIT_INITIALIZED|FMODE_WSPLIT);
8059+
}
8060+
}
8061+
8062+
return INT2NUM(retval);
8063+
}
8064+
80298065
/*
80308066
* call-seq:
80318067
* ios.fcntl(integer_cmd, arg) -> integer
@@ -8045,7 +8081,7 @@ rb_io_fcntl(int argc, VALUE *argv, VALUE io)
80458081
VALUE req, arg;
80468082

80478083
rb_scan_args(argc, argv, "11", &req, &arg);
8048-
return rb_io_ctl(io, req, arg, 0);
8084+
return rb_fcntl(io, req, arg);
80498085
}
80508086
#else
80518087
#define rb_io_fcntl rb_f_notimplement

0 commit comments

Comments
 (0)
0