aboutsummaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-04-04 13:11:14 +0000
committerkosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e>2011-04-04 13:11:14 +0000
commit78ea7afe97241b7a8a8176f680865430779e7d68 (patch)
treee7c9538d5731e24833627754c1a76310e54cbca0
parent3ba502d5f01a39b4adfd456ffc29f0f13c106267 (diff)
downloadruby-78ea7afe97241b7a8a8176f680865430779e7d68.tar.gz
* ext/io/nonblock/nonblock.c (io_nonblock_set): Avoid F_SETFL if
we're not changing the O_NONBLOCK bit. F_SETFL is an expensive operation since it needs to affect all processes with the same file object. The patch is written by Eric Wong. [ruby-core:35556] git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@31238 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
-rw-r--r--ChangeLog8
-rw-r--r--ext/io/nonblock/nonblock.c10
2 files changed, 16 insertions, 2 deletions
diff --git a/ChangeLog b/ChangeLog
index 6aaef9309a..0e6f431b28 100644
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,11 @@
+Mon Apr 4 22:02:16 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
+
+ * ext/io/nonblock/nonblock.c (io_nonblock_set): Avoid F_SETFL if
+ we're not changing the O_NONBLOCK bit. F_SETFL is an expensive
+ operation since it needs to affect all processes with the same
+ file object.
+ The patch is written by Eric Wong. [ruby-core:35556]
+
Mon Apr 4 21:41:26 2011 KOSAKI Motohiro <kosaki.motohiro@gmail.com>
* io.c (rb_io_syswrite): While local FS writes are usually
diff --git a/ext/io/nonblock/nonblock.c b/ext/io/nonblock/nonblock.c
index d7e1ac8e01..1d866ceb0f 100644
--- a/ext/io/nonblock/nonblock.c
+++ b/ext/io/nonblock/nonblock.c
@@ -47,10 +47,16 @@ rb_io_nonblock_p(VALUE io)
static void
io_nonblock_set(int fd, int f, int nb)
{
- if (nb)
+ if (nb) {
+ if ((f & O_NONBLOCK) != 0)
+ return;
f |= O_NONBLOCK;
- else
+ }
+ else {
+ if ((f & O_NONBLOCK) == 0)
+ return;
f &= ~O_NONBLOCK;
+ }
if (fcntl(fd, F_SETFL, f) == -1)
rb_sys_fail(0);
}