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.
This commit is contained in:
Martin Liska 2022-08-18 13:03:42 +02:00
parent 21e7d87a90
commit 827f641359
6 changed files with 60 additions and 9 deletions

View file

@ -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

29
gcc/configure vendored
View file

@ -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

View file

@ -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

View file

@ -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;

View file

@ -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

View file

@ -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 */