diff options
author | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-04-04 13:11:14 +0000 |
---|---|---|
committer | kosaki <kosaki@b2dd03c8-39d4-4d8f-98ff-823fe69b080e> | 2011-04-04 13:11:14 +0000 |
commit | 78ea7afe97241b7a8a8176f680865430779e7d68 (patch) | |
tree | e7c9538d5731e24833627754c1a76310e54cbca0 | |
parent | 3ba502d5f01a39b4adfd456ffc29f0f13c106267 (diff) |
* 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-- | ChangeLog | 8 | ||||
-rw-r--r-- | ext/io/nonblock/nonblock.c | 10 |
2 files changed, 16 insertions, 2 deletions
@@ -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); } |