Commit 049bfdaa authored by Bruno Haible's avatar Bruno Haible
Browse files

Avoid running into nonexistent system calls repeatedly.

parent 49e5954e
2009-08-23 Bruno Haible <bruno@clisp.org>
* lib/dup3.c (dup3): Test only once whether the system actually exists.
* lib/pipe2.c (pipe2): Likewise.
Suggested by Eric Blake.
2009-08-23 Bruno Haible <bruno@clisp.org>
 
Tolerate declared but missing dup3 syscall.
......@@ -53,9 +53,18 @@ dup3 (int oldfd, int newfd, int flags)
/* Try the system call first, if it exists. (We may be running with a glibc
that has the function but with an older kernel that lacks it.) */
{
int result = dup3 (oldfd, newfd, flags);
if (!(result < 0 && errno == ENOSYS))
return result;
/* Cache the information whether the system call really exists. */
static int have_dup3_really; /* 0 = unknown, 1 = yes, -1 = no */
if (have_dup3_really >= 0)
{
int result = dup3 (oldfd, newfd, flags);
if (!(result < 0 && errno == ENOSYS))
{
have_dup3_really = 1;
return result;
}
have_dup3_really = -1;
}
}
#endif
......
......@@ -45,9 +45,18 @@ pipe2 (int fd[2], int flags)
/* Try the system call first, if it exists. (We may be running with a glibc
that has the function but with an older kernel that lacks it.) */
{
int result = pipe2 (fd, flags);
if (!(result < 0 && errno == ENOSYS))
return result;
/* Cache the information whether the system call really exists. */
static int have_pipe2_really; /* 0 = unknown, 1 = yes, -1 = no */
if (have_pipe2_really >= 0)
{
int result = pipe2 (fd, flags);
if (!(result < 0 && errno == ENOSYS))
{
have_pipe2_really = 1;
return result;
}
have_pipe2_really = -1;
}
}
#endif
......
Supports Markdown
0% or .
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment