[gcc r13-2137] jobserver: detect properly O_NONBLOCK
Martin Liska
marxin@gcc.gnu.org
Mon Aug 22 14:06:16 GMT 2022
https://gcc.gnu.org/g:827f64135957ce21617cd0345508077439fa29d8
commit r13-2137-g827f64135957ce21617cd0345508077439fa29d8
Author: Martin Liska <mliska@suse.cz>
Date: Thu Aug 18 13:03:42 2022 +0200
jobserver: detect properly O_NONBLOCK
PR lto/106700
gcc/ChangeLog:
* configure.ac: Detect O_NONBLOCK flag for open.
* config.in: Regenerate.
* configure: Regenerate.
* opts-common.cc (jobserver_info::connect): Set is_connected
properly based on O_NONBLOCK.
* opts-jobserver.h (struct jobserver_info): Add is_connected
member variable.
gcc/lto/ChangeLog:
* lto.cc (wait_for_child): Ask if we are connected to jobserver.
(stream_out_partitions): Likewise.
Diff:
---
gcc/config.in | 6 ++++++
gcc/configure | 29 +++++++++++++++++++++++++++--
gcc/configure.ac | 9 +++++++++
gcc/lto/lto.cc | 12 ++++++------
gcc/opts-common.cc | 11 ++++++++++-
gcc/opts-jobserver.h | 2 ++
6 files changed, 60 insertions(+), 9 deletions(-)
diff --git a/gcc/config.in b/gcc/config.in
index 413b2bd36cb..abab9bf5024 100644
--- a/gcc/config.in
+++ b/gcc/config.in
@@ -2148,6 +2148,12 @@
#endif
+/* Define if O_NONBLOCK supported by fcntl. */
+#ifndef USED_FOR_TARGET
+#undef HOST_HAS_O_NONBLOCK
+#endif
+
+
/* Define which stat syscall is able to handle 64bit indodes. */
#ifndef USED_FOR_TARGET
#undef HOST_STAT_FOR_64BIT_INODES
diff --git a/gcc/configure b/gcc/configure
index da7a45066b5..80498e68e36 100755
--- a/gcc/configure
+++ b/gcc/configure
@@ -12460,6 +12460,31 @@ $as_echo "#define HOST_HAS_O_CLOEXEC 1" >>confdefs.h
fi
+# Check if O_NONBLOCK is defined by fcntl
+for ac_header in fcntl.h
+do :
+ ac_fn_cxx_check_header_preproc "$LINENO" "fcntl.h" "ac_cv_header_fcntl_h"
+if test "x$ac_cv_header_fcntl_h" = xyes; then :
+ cat >>confdefs.h <<_ACEOF
+#define HAVE_FCNTL_H 1
+_ACEOF
+
+fi
+done
+
+ac_fn_cxx_check_decl "$LINENO" "O_NONBLOCK" "ac_cv_have_decl_O_NONBLOCK" "#include <fcntl.h>
+"
+if test "x$ac_cv_have_decl_O_NONBLOCK" = xyes; then :
+
+fi
+
+if test $ac_cv_have_decl_O_NONBLOCK = yes; then
+
+$as_echo "#define HOST_HAS_O_NONBLOCK 1" >>confdefs.h
+
+fi
+
+
# C++ Modules would like some networking features to provide the mapping
# server. You can still use modules without them though.
# The following network-related checks could probably do with some
@@ -19678,7 +19703,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 19681 "configure"
+#line 19706 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
@@ -19784,7 +19809,7 @@ else
lt_dlunknown=0; lt_dlno_uscore=1; lt_dlneed_uscore=2
lt_status=$lt_dlunknown
cat > conftest.$ac_ext <<_LT_EOF
-#line 19787 "configure"
+#line 19812 "configure"
#include "confdefs.h"
#if HAVE_DLFCN_H
diff --git a/gcc/configure.ac b/gcc/configure.ac
index f70b6c24fda..819b490d1b6 100644
--- a/gcc/configure.ac
+++ b/gcc/configure.ac
@@ -1707,6 +1707,15 @@ if test $ac_cv_o_cloexec = yes; then
[Define if O_CLOEXEC supported by fcntl.])
fi
+# Check if O_NONBLOCK is defined by fcntl
+AC_CHECK_HEADERS([fcntl.h])
+AC_CHECK_DECL(O_NONBLOCK,,,[#include <fcntl.h>])
+if test $ac_cv_have_decl_O_NONBLOCK = yes; then
+ AC_DEFINE(HOST_HAS_O_NONBLOCK, 1,
+ [Define if O_NONBLOCK supported by fcntl.])
+fi
+
+
# C++ Modules would like some networking features to provide the mapping
# server. You can still use modules without them though.
# The following network-related checks could probably do with some
diff --git a/gcc/lto/lto.cc b/gcc/lto/lto.cc
index c82307f4f7e..3a9147b01b5 100644
--- a/gcc/lto/lto.cc
+++ b/gcc/lto/lto.cc
@@ -213,11 +213,11 @@ wait_for_child ()
}
while (!WIFEXITED (status) && !WIFSIGNALED (status));
- --nruns;
+ --nruns;
- /* Return token to the jobserver if active. */
- if (jinfo != NULL && jinfo->is_active)
- jinfo->return_token ();
+ /* Return token to the jobserver if active. */
+ if (jinfo != NULL && jinfo->is_connected)
+ jinfo->return_token ();
}
#endif
@@ -254,7 +254,7 @@ stream_out_partitions (char *temp_filename, int blen, int min, int max,
streaming process. */
if (!last)
{
- if (jinfo != NULL && jinfo->is_active)
+ if (jinfo != NULL && jinfo->is_connected)
while (true)
{
if (jinfo->get_token ())
@@ -291,7 +291,7 @@ stream_out_partitions (char *temp_filename, int blen, int min, int max,
while (nruns > 0)
wait_for_child ();
- if (jinfo != NULL && jinfo->is_active)
+ if (jinfo != NULL && jinfo->is_connected)
jinfo->disconnect ();
}
asm_nodes_output = true;
diff --git a/gcc/opts-common.cc b/gcc/opts-common.cc
index 4dec9f94447..bff2be02d38 100644
--- a/gcc/opts-common.cc
+++ b/gcc/opts-common.cc
@@ -2064,7 +2064,16 @@ void
jobserver_info::connect ()
{
if (!pipe_path.empty ())
- pipefd = open (pipe_path.c_str (), O_RDWR | O_NONBLOCK);
+ {
+#if HOST_HAS_O_NONBLOCK
+ pipefd = open (pipe_path.c_str (), O_RDWR | O_NONBLOCK);
+ is_connected = true;
+#else
+ is_connected = false;
+#endif
+ }
+ else
+ is_connected = true;
}
void
diff --git a/gcc/opts-jobserver.h b/gcc/opts-jobserver.h
index 76c1d9b2882..284b2417837 100644
--- a/gcc/opts-jobserver.h
+++ b/gcc/opts-jobserver.h
@@ -55,6 +55,8 @@ struct jobserver_info
int pipefd = -1;
/* Return true if jobserver is active. */
bool is_active = false;
+ /* Return true if communication with jobserver is working. */
+ bool is_connected = false;
};
#endif /* GCC_JOBSERVER_H */
More information about the Gcc-cvs
mailing list