summaryrefslogtreecommitdiff
path: root/gdb/common
diff options
context:
space:
mode:
authorJan Kratochvil <jan.kratochvil@redhat.com>2013-10-09 16:00:54 +0000
committerJan Kratochvil <jan.kratochvil@redhat.com>2013-10-09 16:00:54 +0000
commit98928e91e95495f3e9f02052f02f58a5fac9a01d (patch)
treefa242b91c48a252ef542f510a411ea3401ec941a /gdb/common
parent476504d90adacb7e5f0e6d070adfa56df374e723 (diff)
downloadgdb-98928e91e95495f3e9f02052f02f58a5fac9a01d.tar.gz
Minor O_CLOEXEC optimization, "regression" fix
gdb/ 2013-10-09 Jan Kratochvil <jan.kratochvil@redhat.com> * common/filestuff.c (gdb_fopen_cloexec): Remove initialization of result variable. Rename variable fopen_e_ever_failed to fopen_e_ever_failed_einval. Retry fopen only for errno EINVAL.
Diffstat (limited to 'gdb/common')
-rw-r--r--gdb/common/filestuff.c21
1 files changed, 11 insertions, 10 deletions
diff --git a/gdb/common/filestuff.c b/gdb/common/filestuff.c
index d3b13e8c806..4032f363280 100644
--- a/gdb/common/filestuff.c
+++ b/gdb/common/filestuff.c
@@ -310,16 +310,16 @@ gdb_open_cloexec (const char *filename, int flags, unsigned long mode)
FILE *
gdb_fopen_cloexec (const char *filename, const char *opentype)
{
- FILE *result = NULL;
+ FILE *result;
/* Probe for "e" support once. But, if we can tell the operating
system doesn't know about close on exec mode "e" without probing,
skip it. E.g., the Windows runtime issues an "Invalid parameter
passed to C runtime function" OutputDebugString warning for
unknown modes. Assume that if O_CLOEXEC is zero, then "e" isn't
supported. */
- static int fopen_e_ever_failed = O_CLOEXEC == 0;
+ static int fopen_e_ever_failed_einval = O_CLOEXEC == 0;
- if (!fopen_e_ever_failed)
+ if (!fopen_e_ever_failed_einval)
{
char *copy;
@@ -329,15 +329,16 @@ gdb_fopen_cloexec (const char *filename, const char *opentype)
this path. */
strcat (copy, "e");
result = fopen (filename, copy);
- }
- if (result == NULL)
- {
- /* Fallback. */
- result = fopen (filename, opentype);
- if (result != NULL)
- fopen_e_ever_failed = 1;
+ if (result == NULL && errno == EINVAL)
+ {
+ result = fopen (filename, opentype);
+ if (result != NULL)
+ fopen_e_ever_failed_einval = 1;
+ }
}
+ else
+ result = fopen (filename, opentype);
if (result != NULL)
maybe_mark_cloexec (fileno (result));