io.c (rb_update_max_fd): use F_GETFL if possible
On 64-bit Linux, fstat() needs to fill out a 144 byte struct while F_GETFL only needs to return 8 bytes. Fwiw, F_GETFD requires an additional rcu_read_lock and bitmap check; so it's obviously more expensive than F_GETFL on Linux. Reduce stack usage of rb_update_max_fd from 184 to 24 bytes. git-svn-id: svn+ssh://ci.ruby-lang.org/ruby/trunk@66060 b2dd03c8-39d4-4d8f-98ff-823fe69b080e
This commit is contained in:
parent
c5fe904f6e
commit
db7338fd75
12
io.c
12
io.c
@ -193,14 +193,22 @@ static rb_atomic_t max_file_descriptor = NOFILE;
|
|||||||
void
|
void
|
||||||
rb_update_max_fd(int fd)
|
rb_update_max_fd(int fd)
|
||||||
{
|
{
|
||||||
struct stat buf;
|
|
||||||
rb_atomic_t afd = (rb_atomic_t)fd;
|
rb_atomic_t afd = (rb_atomic_t)fd;
|
||||||
rb_atomic_t max_fd = max_file_descriptor;
|
rb_atomic_t max_fd = max_file_descriptor;
|
||||||
|
int err;
|
||||||
|
|
||||||
if (afd <= max_fd)
|
if (afd <= max_fd)
|
||||||
return;
|
return;
|
||||||
|
|
||||||
if (fstat(fd, &buf) != 0 && errno == EBADF) {
|
#if defined(HAVE_FCNTL) && defined(F_GETFL)
|
||||||
|
err = fcntl(fd, F_GETFL) == -1;
|
||||||
|
#else
|
||||||
|
{
|
||||||
|
struct stat buf;
|
||||||
|
err = fstat(fd, &buf) != 0;
|
||||||
|
}
|
||||||
|
#endif
|
||||||
|
if (err && errno == EBADF) {
|
||||||
rb_bug("rb_update_max_fd: invalid fd (%d) given.", fd);
|
rb_bug("rb_update_max_fd: invalid fd (%d) given.", fd);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user