From mboxrd@z Thu Jan 1 00:00:00 1970 Return-Path: Received: from mail-ej1-x62d.google.com (mail-ej1-x62d.google.com [IPv6:2a00:1450:4864:20::62d]) by sourceware.org (Postfix) with ESMTPS id 257CD3858C55 for ; Fri, 19 Aug 2022 07:45:01 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.1 sourceware.org 257CD3858C55 Received: by mail-ej1-x62d.google.com with SMTP id fy5so7349590ejc.3 for ; Fri, 19 Aug 2022 00:45:01 -0700 (PDT) X-Google-DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=1e100.net; s=20210112; h=content-transfer-encoding:cc:to:subject:message-id:date:from :in-reply-to:references:mime-version:x-gm-message-state:from:to:cc; bh=nzzVCtYaAMA1jOM8Ebu3pA59Thwl9EzMeL6rGszzq2s=; b=v8Y6vsp3yxwjNVYq8XTragCsKLnvCZuvtjRIU2wkB4Y57nZxKSs1rQ4T9WOswNuj98 hTxaSeZybaimUM1saY/zh7+WDU/K9cD4hE2NsAODyYgXauMhAroVhka/xpbJJzFOF37L qSCPJr9icsL5s88bATLebu5672v1J65zikvWEzn+SBCnAvstSzRz5LmDdUHZnXcNrKui qk5o9pFMoPDZ/aQbtjGXNoTKB98qg9LI6oPZfFlGC782xcomp6WMAe6XkbrUo4rLpAYX xcUGZ1aVnxqyUkRagIL1KdJfyyhgkT6UOonp1WGI+DNam0ZcPEoiXHAi0fPbkTKH+ajy hc0w== X-Gm-Message-State: ACgBeo3adu9vabyqZfejgWabAvxpfs/UTNoMD/fu71fTYmOPOhxYWCI/ 1T5sdfFn8eutsxPJVoxnUaIh5Hvm6eB5buOrbiE= X-Google-Smtp-Source: AA6agR7BPLSUtn2pws6VUsgSM6geMqvGzDxCgIcNVWo5f/UflKEs8iMv+5mvx5ZPyh8DzlGM1dsnK5JEKoFQCd47yqA= X-Received: by 2002:a17:907:72c3:b0:73d:5300:b37b with SMTP id du3-20020a17090772c300b0073d5300b37bmr480866ejc.511.1660895099682; Fri, 19 Aug 2022 00:44:59 -0700 (PDT) MIME-Version: 1.0 References: In-Reply-To: From: Richard Biener Date: Fri, 19 Aug 2022 09:44:47 +0200 Message-ID: Subject: Re: [PATCH] jobserver: detect properly O_NONBLOCK To: =?UTF-8?Q?Martin_Li=C5=A1ka?= Cc: GCC Patches Content-Type: text/plain; charset="UTF-8" Content-Transfer-Encoding: quoted-printable X-Spam-Status: No, score=-8.4 required=5.0 tests=BAYES_00, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, FREEMAIL_FROM, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, SPF_HELO_NONE, SPF_PASS, TXREP, T_SCC_BODY_TEXT_LINE autolearn=ham autolearn_force=no version=3.4.6 X-Spam-Checker-Version: SpamAssassin 3.4.6 (2021-04-09) on server2.sourceware.org X-BeenThere: gcc-patches@gcc.gnu.org X-Mailman-Version: 2.1.29 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-List-Received-Date: Fri, 19 Aug 2022 07:45:05 -0000 On Thu, Aug 18, 2022 at 2:43 PM Martin Li=C5=A1ka wrote: > > That handles systems that don't have O_NONBLOCK, in that case > WPA streaming is not using jobserver if --jobserver-auth uses 'fifo'. > > Patch can bootstrap on x86_64-linux-gnu and survives regression tests. > Tested with mingw cross compiler as well. > > Ready to be installed? libstdc++ uses # For Networking TS. AC_CHECK_HEADERS([fcntl.h sys/ioctl.h sys/socket.h sys/uio.h poll.h netdb.h arpa/inet.h netinet/in.h netinet/tcp.h]) AC_CHECK_DECL(F_GETFL,,,[#include ]) AC_CHECK_DECL(F_SETFL,,,[#include ]) if test "$ac_cv_have_decl_F_GETFL$ac_cv_have_decl_F_SETFL" =3D yesyes ; the= n AC_CHECK_DECL(O_NONBLOCK,,,[#include ]) fi I'd rather not invent sth fancy with /dev/null (that seems very unixy) > Thanks, > Martin > > 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. > --- > gcc/config.in | 6 ++++++ > gcc/configure | 39 +++++++++++++++++++++++++++++++++++++-- > gcc/configure.ac | 11 +++++++++++ > gcc/lto/lto.cc | 12 ++++++------ > gcc/opts-common.cc | 11 ++++++++++- > gcc/opts-jobserver.h | 2 ++ > 6 files changed, 72 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..8b416c1a142 100755 > --- a/gcc/configure > +++ b/gcc/configure > @@ -12460,6 +12460,41 @@ $as_echo "#define HOST_HAS_O_CLOEXEC 1" >>confde= fs.h > > fi > > +# Check if O_NONBLOCK is defined by fcntl > +{ $as_echo "$as_me:${as_lineno-$LINENO}: checking for O_NONBLOCK" >&5 > +$as_echo_n "checking for O_NONBLOCK... " >&6; } > +if ${ac_cv_o_nonblock+:} false; then : > + $as_echo_n "(cached) " >&6 > +else > + > +cat confdefs.h - <<_ACEOF >conftest.$ac_ext > +/* end confdefs.h. */ > + > +#include > +int > +main () > +{ > + > +return open ("/dev/null", O_RDONLY | O_NONBLOCK); > + ; > + return 0; > +} > +_ACEOF > +if ac_fn_cxx_try_compile "$LINENO"; then : > + ac_cv_o_nonblock=3Dyes > +else > + ac_cv_o_nonblock=3Dno > +fi > +rm -f core conftest.err conftest.$ac_objext conftest.$ac_ext > +fi > +{ $as_echo "$as_me:${as_lineno-$LINENO}: result: $ac_cv_o_nonblock" >&5 > +$as_echo "$ac_cv_o_nonblock" >&6; } > +if test $ac_cv_o_nonblock =3D 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 +19713,7 @@ else > lt_dlunknown=3D0; lt_dlno_uscore=3D1; lt_dlneed_uscore=3D2 > lt_status=3D$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 19681 "configure" > +#line 19716 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > @@ -19784,7 +19819,7 @@ else > lt_dlunknown=3D0; lt_dlno_uscore=3D1; lt_dlneed_uscore=3D2 > lt_status=3D$lt_dlunknown > cat > conftest.$ac_ext <<_LT_EOF > -#line 19787 "configure" > +#line 19822 "configure" > #include "confdefs.h" > > #if HAVE_DLFCN_H > diff --git a/gcc/configure.ac b/gcc/configure.ac > index f70b6c24fda..4ebdad38b9b 100644 > --- a/gcc/configure.ac > +++ b/gcc/configure.ac > @@ -1707,6 +1707,17 @@ if test $ac_cv_o_cloexec =3D yes; then > [Define if O_CLOEXEC supported by fcntl.]) > fi > > +# Check if O_NONBLOCK is defined by fcntl > +AC_CACHE_CHECK(for O_NONBLOCK, ac_cv_o_nonblock, [ > +AC_COMPILE_IFELSE([AC_LANG_PROGRAM([[ > +#include ]], [[ > +return open ("/dev/null", O_RDONLY | O_NONBLOCK);]])], > +[ac_cv_o_nonblock=3Dyes],[ac_cv_o_nonblock=3Dno])]) > +if test $ac_cv_o_nonblock =3D 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 !=3D NULL && jinfo->is_active) > - jinfo->return_token (); > + /* Return token to the jobserver if active. */ > + if (jinfo !=3D 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 !=3D NULL && jinfo->is_active) > + if (jinfo !=3D 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 !=3D NULL && jinfo->is_active) > + if (jinfo !=3D NULL && jinfo->is_connected) > jinfo->disconnect (); > } > asm_nodes_output =3D 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 =3D open (pipe_path.c_str (), O_RDWR | O_NONBLOCK); > + { > +#if HOST_HAS_O_NONBLOCK > + pipefd =3D open (pipe_path.c_str (), O_RDWR | O_NONBLOCK); > + is_connected =3D true; > +#else > + is_connected =3D false; > +#endif > + } > + else > + is_connected =3D 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 =3D -1; > /* Return true if jobserver is active. */ > bool is_active =3D false; > + /* Return true if communication with jobserver is working. */ > + bool is_connected =3D false; > }; > > #endif /* GCC_JOBSERVER_H */ > -- > 2.37.1 >