From patchwork Thu Sep 14 13:27:09 2023 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Jonathan Wakely X-Patchwork-Id: 139587 Return-Path: Delivered-To: ouuuleilei@gmail.com Received: by 2002:a05:612c:172:b0:3f2:4152:657d with SMTP id h50csp348922vqi; Thu, 14 Sep 2023 06:29:29 -0700 (PDT) X-Google-Smtp-Source: AGHT+IE/KXwhTLIsNNpLt3fy9fAvZqbAUfPiPZqZKFZ89pwj/gvS3sxuLD3ZuRlY/l1J6ftD7SeU X-Received: by 2002:a05:6402:715:b0:522:2d1b:5a38 with SMTP id w21-20020a056402071500b005222d1b5a38mr5031965edx.10.1694698169022; Thu, 14 Sep 2023 06:29:29 -0700 (PDT) ARC-Seal: i=1; a=rsa-sha256; t=1694698169; cv=none; d=google.com; s=arc-20160816; b=BO4U9zVSG4rwcUdjWNuP5j2QM5Tif9BASP1GleP6mlNLBoF/zgOuGHbcg12sMJQD22 iz3IQ14CMJ278fuT1cFXZIU9HKno1A9jk/mEgn2wUwWnBbJgFXZdIkaZnRLd9SAVNIiF +sBjCA3RqwKQhdqNWl7q3ktU7kaq2GfLVZPgkst9FedFe6RJzVcQlyX4X5eIuXSkbCRf f0FZxzZOBiRrRRPXDNnot1+oLehdoaBSPUhPI1X19O6zwlbmKElsI+Scgw9ru829KVyM A2qFCV6KKo14tZ/T2DIdrB2jJMiHcgKdJM6Jw9hy3SNRkT1oIMw0fL6em8QO81nFG2vo HmCQ== ARC-Message-Signature: i=1; a=rsa-sha256; c=relaxed/relaxed; d=google.com; s=arc-20160816; h=sender:errors-to:reply-to:from:list-subscribe:list-help:list-post :list-archive:list-unsubscribe:list-id:precedence :content-transfer-encoding:mime-version:message-id:date:subject:to :dmarc-filter:delivered-to:dkim-signature:dkim-filter; bh=766YiBfmbUqSs7RmpfSNrAWdLRGQGBbdxeteL0/ti70=; fh=sJ+2/4g29YdyXkoRrFZSpsL2zxijepB7X/1rB0LDDh8=; b=MJF5Q7PhdxLk5GKWakI9jE9yXo6N1wSMrw3/Il6EozUJnAek23Bpn9l+nMu6gyCRyX W50pFcGYgGw2j3IwSYuJR+oyPyMsfmuTCqD8799eQqH5PNKc3rWTYW9ZtwGY7nPahayb KzLHW2CYJNAqiTkS8zsiboSZ7XG1SZPG9seEbY6Xrl9eIdADhFba+EjWo9riw3dbULx2 ysPzmXLKltRRnFZLrQao8Q8A2GiUvx8qTxzWmHmWbOY6y2ubHElk8+/nNyANv8Kpdw+z PY6cun1Z4l4ut1SG1+IMYIi8L5hAn+usEcrGPXSLzdVUvUhIpfrLJIetJlbTCUSOoE4h +kbA== ARC-Authentication-Results: i=1; mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=hCdmkWjj; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (ip-8-43-85-97.sourceware.org. [8.43.85.97]) by mx.google.com with ESMTPS id y21-20020a056402135500b005257c5747bdsi1337298edw.218.2023.09.14.06.29.28 for (version=TLS1_3 cipher=TLS_AES_256_GCM_SHA384 bits=256/256); Thu, 14 Sep 2023 06:29:29 -0700 (PDT) Received-SPF: pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) client-ip=8.43.85.97; Authentication-Results: mx.google.com; dkim=pass header.i=@gcc.gnu.org header.s=default header.b=hCdmkWjj; spf=pass (google.com: domain of gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org designates 8.43.85.97 as permitted sender) smtp.mailfrom="gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org"; dmarc=pass (p=NONE sp=NONE dis=NONE) header.from=gnu.org Received: from server2.sourceware.org (localhost [IPv6:::1]) by sourceware.org (Postfix) with ESMTP id 15E87385CCAA for ; Thu, 14 Sep 2023 13:28:17 +0000 (GMT) DKIM-Filter: OpenDKIM Filter v2.11.0 sourceware.org 15E87385CCAA DKIM-Signature: v=1; a=rsa-sha256; c=relaxed/relaxed; d=gcc.gnu.org; s=default; t=1694698097; bh=766YiBfmbUqSs7RmpfSNrAWdLRGQGBbdxeteL0/ti70=; h=To:Subject:Date:List-Id:List-Unsubscribe:List-Archive:List-Post: List-Help:List-Subscribe:From:Reply-To:From; b=hCdmkWjjRIb2V/qJsyX8d2sE3C5rZWVvEfe5tMlrM3UuxUSDEB9hNfPkqgSKxGQHo ijmMyN4ta1mnhLl+YSaZevGzvs6BOBlbRJagH9FUDJLfI4dOjkHZ4ZjvlndRLdNxNF IjgEY4nOHzAbCi7MkFt0W/4KPmSIxJ0TG1xTXmy4= X-Original-To: gcc-patches@gcc.gnu.org Delivered-To: gcc-patches@gcc.gnu.org Received: from us-smtp-delivery-124.mimecast.com (us-smtp-delivery-124.mimecast.com [170.10.129.124]) by sourceware.org (Postfix) with ESMTPS id CBAD8385B800 for ; Thu, 14 Sep 2023 13:27:31 +0000 (GMT) DMARC-Filter: OpenDMARC Filter v1.4.2 sourceware.org CBAD8385B800 Received: from mimecast-mx02.redhat.com (mimecast-mx02.redhat.com [66.187.233.88]) by relay.mimecast.com with ESMTP with STARTTLS (version=TLSv1.2, cipher=TLS_ECDHE_RSA_WITH_AES_256_GCM_SHA384) id us-mta-367-8BdXMb5GNHSZdlwaBUohMA-1; Thu, 14 Sep 2023 09:27:30 -0400 X-MC-Unique: 8BdXMb5GNHSZdlwaBUohMA-1 Received: from smtp.corp.redhat.com (int-mx01.intmail.prod.int.rdu2.redhat.com [10.11.54.1]) (using TLSv1.2 with cipher ECDHE-RSA-AES256-GCM-SHA384 (256/256 bits)) (No client certificate requested) by mimecast-mx02.redhat.com (Postfix) with ESMTPS id DC43A802D38; Thu, 14 Sep 2023 13:27:29 +0000 (UTC) Received: from localhost (unknown [10.42.28.190]) by smtp.corp.redhat.com (Postfix) with ESMTP id 80F7940E0420; Thu, 14 Sep 2023 13:27:29 +0000 (UTC) To: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Subject: [committed] libstdc++: Remove some more unconditional uses of atomics Date: Thu, 14 Sep 2023 14:27:09 +0100 Message-ID: <20230914132728.2165656-1-jwakely@redhat.com> MIME-Version: 1.0 X-Scanned-By: MIMEDefang 3.1 on 10.11.54.1 X-Mimecast-Spam-Score: 0 X-Mimecast-Originator: redhat.com X-Spam-Status: No, score=-11.8 required=5.0 tests=BAYES_00, DKIMWL_WL_HIGH, DKIM_SIGNED, DKIM_VALID, DKIM_VALID_AU, DKIM_VALID_EF, GIT_PATCH_0, RCVD_IN_DNSWL_NONE, RCVD_IN_MSPIKE_H4, RCVD_IN_MSPIKE_WL, SPF_HELO_NONE, SPF_NONE, TXREP 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.30 Precedence: list List-Id: Gcc-patches mailing list List-Unsubscribe: , List-Archive: List-Post: List-Help: List-Subscribe: , X-Patchwork-Original-From: Jonathan Wakely via Gcc-patches From: Jonathan Wakely Reply-To: Jonathan Wakely Errors-To: gcc-patches-bounces+ouuuleilei=gmail.com@gcc.gnu.org Sender: "Gcc-patches" X-getmail-retrieved-from-mailbox: INBOX X-GMAIL-THRID: 1776925771142368143 X-GMAIL-MSGID: 1777019827587020742 Tested aarch64-linux. Pushed to trunk. -- >8 -- These atomics cause linker errors on arm4t where __sync_synchronize is not defined. For single-threaded targets we don't need the atomics. libstdc++-v3/ChangeLog: * include/experimental/io_context (io_context) [!_GLIBCXX_HAS_GTHREADS]: Use a plain integer for _M_work_count for single-threaded targets. * include/experimental/memory_resource (__get_default_resource) [!_GLIBCXX_HAS_GTHREADS]: Use unsynchronized type for single-threaded targets. * src/c++17/default_resource.h: Adjust preprocessor conditions to match memory_resource.cc. * src/c++17/memory_resource.cc [!_GLIBCXX_HAS_GTHREADS] (atomic_mem_res): Use unsynchronized type for single-threaded targets. --- libstdc++-v3/include/experimental/io_context | 4 ++ .../include/experimental/memory_resource | 12 ++++- libstdc++-v3/src/c++17/default_resource.h | 6 ++- libstdc++-v3/src/c++17/memory_resource.cc | 49 ++++++++++--------- 4 files changed, 45 insertions(+), 26 deletions(-) diff --git a/libstdc++-v3/include/experimental/io_context b/libstdc++-v3/include/experimental/io_context index c59f8c8e73b..c878d5a7025 100644 --- a/libstdc++-v3/include/experimental/io_context +++ b/libstdc++-v3/include/experimental/io_context @@ -562,7 +562,11 @@ inline namespace v1 } }; +#ifdef _GLIBCXX_HAS_GTHREADS atomic _M_work_count; +#else + count_type _M_work_count; +#endif mutable execution_context::mutex_type _M_mtx; queue> _M_op; bool _M_stopped = false; diff --git a/libstdc++-v3/include/experimental/memory_resource b/libstdc++-v3/include/experimental/memory_resource index 9f1cb42373e..6f419a0a929 100644 --- a/libstdc++-v3/include/experimental/memory_resource +++ b/libstdc++-v3/include/experimental/memory_resource @@ -549,10 +549,20 @@ namespace pmr { // The default memory resource /// @cond undocumented - inline std::atomic& + inline auto& __get_default_resource() { +#ifndef _GLIBCXX_HAS_GTHREADS + struct type { + using value_type = memory_resource*; + explicit type(value_type __r) : _M_r(__r) { } + value_type _M_r; + value_type load() const { return _M_r; } + value_type exchange(value_type __r) { return std::__exchange(_M_r, __r); } + }; +#else using type = atomic; +#endif alignas(type) static unsigned char __buf[sizeof(type)]; static type* __r = new(__buf) type(new_delete_resource()); return *__r; diff --git a/libstdc++-v3/src/c++17/default_resource.h b/libstdc++-v3/src/c++17/default_resource.h index 522cee13b90..f8d03d7d3bc 100644 --- a/libstdc++-v3/src/c++17/default_resource.h +++ b/libstdc++-v3/src/c++17/default_resource.h @@ -2,7 +2,11 @@ // to suppress the warning caused by using a reserved init_priority. #pragma GCC system_header -#if ATOMIC_POINTER_LOCK_FREE == 2 || defined(__GTHREAD_MUTEX_INIT) +#ifndef _GLIBCXX_HAS_GTHREADS +# error "This file should not be included for this build" +#elif ATOMIC_POINTER_LOCK_FREE == 2 +# error "This file should not be included for this build" +#elif defined __GTHREAD_MUTEX_INIT # error "This file should not be included for this build" #endif diff --git a/libstdc++-v3/src/c++17/memory_resource.cc b/libstdc++-v3/src/c++17/memory_resource.cc index c0c7cf0cf83..63856eadaf5 100644 --- a/libstdc++-v3/src/c++17/memory_resource.cc +++ b/libstdc++-v3/src/c++17/memory_resource.cc @@ -27,9 +27,9 @@ #include #include // has_single_bit, bit_ceil, bit_width #include +#include // std::__exchange #if ATOMIC_POINTER_LOCK_FREE != 2 # include // std::mutex, std::lock_guard -# include // std::__exchange #endif #if __has_cpp_attribute(clang::require_constant_initialization) @@ -94,10 +94,31 @@ namespace pmr __constinit constant_init newdel_res{}; __constinit constant_init null_res{}; -#if ATOMIC_POINTER_LOCK_FREE == 2 + +#ifndef _GLIBCXX_HAS_GTHREADS +# define _GLIBCXX_ATOMIC_MEM_RES_CAN_BE_CONSTANT_INITIALIZED + // Single-threaded, no need for synchronization + struct atomic_mem_res + { + constexpr + atomic_mem_res(memory_resource* r) : val(r) { } + + memory_resource* val; + + memory_resource* load(std::memory_order) const + { + return val; + } + + memory_resource* exchange(memory_resource* r, std::memory_order) + { + return std::__exchange(val, r); + } + }; +#elif ATOMIC_POINTER_LOCK_FREE == 2 using atomic_mem_res = atomic; # define _GLIBCXX_ATOMIC_MEM_RES_CAN_BE_CONSTANT_INITIALIZED -#elif defined(_GLIBCXX_HAS_GTHREADS) +#else // Can't use pointer-width atomics, define a type using a mutex instead: struct atomic_mem_res { @@ -123,27 +144,7 @@ namespace pmr return std::__exchange(val, r); } }; -#else -# define _GLIBCXX_ATOMIC_MEM_RES_CAN_BE_CONSTANT_INITIALIZED - // Single-threaded, no need for synchronization - struct atomic_mem_res - { - constexpr - atomic_mem_res(memory_resource* r) : val(r) { } - - memory_resource* val; - - memory_resource* load(std::memory_order) const - { - return val; - } - - memory_resource* exchange(memory_resource* r, std::memory_order) - { - return std::__exchange(val, r); - } - }; -#endif // ATOMIC_POINTER_LOCK_FREE == 2 +#endif #ifdef _GLIBCXX_ATOMIC_MEM_RES_CAN_BE_CONSTANT_INITIALIZED __constinit constant_init default_res{&newdel_res.obj};