Also check EWOULDBLOCK as well as EAGAIN

This commit is contained in:
Nobuyoshi Nakada 2020-01-21 22:45:10 +09:00
Родитель 25f2005a63
Коммит 5798d35ff6
Не найден ключ, соответствующий данной подписи
Идентификатор ключа GPG: 4BC7D6DF58D8DF60
1 изменённых файлов: 4 добавлений и 9 удалений

13
io.c
Просмотреть файл

@ -316,7 +316,6 @@ rb_cloexec_open(const char *pathname, int flags, mode_t mode)
static const int retry_max_count = 10000; static const int retry_max_count = 10000;
int retry_count = 0; int retry_count = 0;
int e;
#ifdef O_CLOEXEC #ifdef O_CLOEXEC
/* O_CLOEXEC is available since Linux 2.6.23. Linux 2.6.18 silently ignore it. */ /* O_CLOEXEC is available since Linux 2.6.23. Linux 2.6.18 silently ignore it. */
@ -325,15 +324,11 @@ rb_cloexec_open(const char *pathname, int flags, mode_t mode)
flags |= O_NOINHERIT; flags |= O_NOINHERIT;
#endif #endif
while (1) { while ((ret = open(pathname, flags, mode)) == -1) {
ret = open(pathname, flags, mode); int e = errno;
e = errno; if (e != EAGAIN && e != EWOULDBLOCK) break;
if (retry_count++ >= retry_max_count) break;
if (ret != -1 || e != EAGAIN || retry_count >= retry_max_count) {
break;
}
retry_count++;
sleep(retry_interval); sleep(retry_interval);
} }