From c74e1ccf71458d5e1ab1c5a877a6c27d62597250 Mon Sep 17 00:00:00 2001 From: Jan Kratochvil Date: Wed, 9 Oct 2013 16:00:54 +0000 Subject: [PATCH 1/1] Minor O_CLOEXEC optimization, "regression" fix gdb/ 2013-10-09 Jan Kratochvil * 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. --- gdb/ChangeLog | 6 ++++++ gdb/common/filestuff.c | 21 +++++++++++---------- 2 files changed, 17 insertions(+), 10 deletions(-) diff --git a/gdb/ChangeLog b/gdb/ChangeLog index d2fb999926..3dd66c8c7f 100644 --- a/gdb/ChangeLog +++ b/gdb/ChangeLog @@ -1,3 +1,9 @@ +2013-10-09 Jan Kratochvil + + * 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. + 2013-10-09 Pedro Alves * monitor.c (monitor_write_memory, monitor_write_memory_bytes) diff --git a/gdb/common/filestuff.c b/gdb/common/filestuff.c index d3b13e8c80..4032f36328 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)); -- 2.34.1