From patchwork Fri Jul 26 23:07:11 2013 Content-Type: text/plain; charset="utf-8" MIME-Version: 1.0 Content-Transfer-Encoding: 7bit X-Patchwork-Submitter: Nathan Froyd X-Patchwork-Id: 262345 Return-Path: X-Original-To: incoming@patchwork.ozlabs.org Delivered-To: patchwork-incoming@bilbo.ozlabs.org Received: from sourceware.org (server1.sourceware.org [209.132.180.131]) (using TLSv1 with cipher DHE-RSA-AES256-SHA (256/256 bits)) (Client CN "localhost", Issuer "www.qmailtoaster.com" (not verified)) by ozlabs.org (Postfix) with ESMTPS id 835CB2C00E3 for ; Sat, 27 Jul 2013 09:07:27 +1000 (EST) DomainKey-Signature: a=rsa-sha1; c=nofws; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:message-id:in-reply-to:references:subject :mime-version:content-type:content-transfer-encoding; q=dns; s= default; b=OtdQ1IiXvNRaTBkf4dfUynU5WLM1CIhCR6LeoPyTuBwQBJmzXwfCO OZQJaM/28fJaoIntY/DsLdvvDN6K9v77VrGN+y4YfJbJ7VvyMKzrDSn878ZLGxm/ Xs51w5bUswiJYoXhVMJ975azQoM78/FXE14yvAsEYZn/OpW8HvMcxc= DKIM-Signature: v=1; a=rsa-sha1; c=relaxed; d=gcc.gnu.org; h=list-id :list-unsubscribe:list-archive:list-post:list-help:sender:date :from:to:cc:message-id:in-reply-to:references:subject :mime-version:content-type:content-transfer-encoding; s=default; bh=/OLWS3qNdPbOwm1LWCXqVlzNsnA=; b=Ne/hZW8u0cU6V6rNDBR/FW4VUSHb /B2KXmtnSs6LaQrA0U0AjAE1FLh73vluX5Wz64xBiNtA8SBUZkFhdu9CoXNoFNSf 07AIxqqOqadwsteFxOZ5DoVuN9nbJiDDTLiuhhCRaXIllHAM2AN1eovXN/NoePgO 6fYu8AF0UW31o7g= Received: (qmail 22680 invoked by alias); 26 Jul 2013 23:07:21 -0000 Mailing-List: contact gcc-patches-help@gcc.gnu.org; run by ezmlm Precedence: bulk List-Id: List-Unsubscribe: List-Archive: List-Post: List-Help: Sender: gcc-patches-owner@gcc.gnu.org Delivered-To: mailing list gcc-patches@gcc.gnu.org Received: (qmail 22662 invoked by uid 89); 26 Jul 2013 23:07:20 -0000 X-Spam-SWARE-Status: No, score=-0.6 required=5.0 tests=AWL, BAYES_50, KHOP_RCVD_UNTRUST, KHOP_THREADED, RCVD_IN_DNSWL_LOW, RCVD_IN_HOSTKARMA_NO, RDNS_NONE autolearn=ham version=3.3.1 X-Spam-User: qpsmtpd, 2 recipients Received: from Unknown (HELO zmmta1.mail.corp.phx1.mozilla.com) (63.245.216.72) by sourceware.org (qpsmtpd/0.84/v0.84-167-ge50287c) with ESMTP; Fri, 26 Jul 2013 23:07:19 +0000 Received: from zmmta1.mail.corp.phx1.mozilla.com (localhost6.localdomain [127.0.0.1]) by zmmta1.mail.corp.phx1.mozilla.com (Postfix) with ESMTP id 1DBC51064AF; Fri, 26 Jul 2013 16:07:12 -0700 (PDT) Received: from zmmbox6.mail.corp.phx1.mozilla.com (zlb1.mail.corp.phx1.mozilla.com [10.20.77.200]) by zmmta1.mail.corp.phx1.mozilla.com (Postfix) with ESMTP id 14EB11063A7; Fri, 26 Jul 2013 16:07:12 -0700 (PDT) Date: Fri, 26 Jul 2013 16:07:11 -0700 (PDT) From: Nathan Froyd To: Paolo Carlini Cc: libstdc++@gcc.gnu.org, gcc-patches@gcc.gnu.org Message-ID: <1685044565.37661.1374880031518.JavaMail.zimbra@mozilla.com> In-Reply-To: <51F2CF54.2070700@oracle.com> References: <20130726173426.GA11900@cerebro> <3c498ca8-12e6-48ec-9e2b-bb2abc6e3851@email.android.com> <1044586962.21254.1374864154989.JavaMail.zimbra@mozilla.com> <51F2CF54.2070700@oracle.com> Subject: Re: [PATCH] fix generic std::atomic::compare_exchange_{weak, strong} MIME-Version: 1.0 ----- Original Message ----- > On 07/26/2013 08:42 PM, Nathan Froyd wrote: > > Sure, I can do that. For maximum effectiveness, it'd be good to have it > > check the specializations for atomic<>, too. Is there something in the > > libstdc++ testsuite for iterating template instantiations over a list of > > types, or do I have to roll the list myself? > testsuite/29_atomics already uses testsuite_common_types.h New patch, this time with tests. Let me know if test placement, etc. need adjusting. Tested on x86_64-unknown-linux-gnu. OK for commit to trunk and active branches? -Nathan * include/std/atomic (compare_exchange_weak, compare_exchange_strong): Add call to __cmpexch_failure_order. * testsuite/util/testsuite_common_types.h (compare_exchange_order_lowering): New generator. * testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc: New test. diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index ac2cb45..3b79d91 100644 diff --git a/libstdc++-v3/include/std/atomic b/libstdc++-v3/include/std/atomic index 813f574..2d66729 100644 --- a/libstdc++-v3/include/std/atomic +++ b/libstdc++-v3/include/std/atomic @@ -252,12 +252,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __m = memory_order_seq_cst) noexcept - { return compare_exchange_weak(__e, __i, __m, __m); } + { return compare_exchange_weak(__e, __i, __m, + __cmpexch_failure_order(__m)); } bool compare_exchange_weak(_Tp& __e, _Tp __i, memory_order __m = memory_order_seq_cst) volatile noexcept - { return compare_exchange_weak(__e, __i, __m, __m); } + { return compare_exchange_weak(__e, __i, __m, + __cmpexch_failure_order(__m)); } bool compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __s, @@ -276,12 +278,14 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION bool compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __m = memory_order_seq_cst) noexcept - { return compare_exchange_strong(__e, __i, __m, __m); } + { return compare_exchange_strong(__e, __i, __m, + __cmpexch_failure_order(__m)); } bool compare_exchange_strong(_Tp& __e, _Tp __i, memory_order __m = memory_order_seq_cst) volatile noexcept - { return compare_exchange_strong(__e, __i, __m, __m); } + { return compare_exchange_strong(__e, __i, __m, + __cmpexch_failure_order(__m)); } }; diff --git a/libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc b/libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc new file mode 100644 index 0000000..75e7406 --- /dev/null +++ b/libstdc++-v3/testsuite/29_atomics/atomic/requirements/compare_exchange_lowering.cc @@ -0,0 +1,65 @@ +// { dg-options "-std=gnu++0x" } +// { dg-do compile } + +// Copyright (C) 2008-2013 Free Software Foundation, Inc. +// +// This file is part of the GNU ISO C++ Library. This library is free +// software; you can redistribute it and/or modify it under the +// terms of the GNU General Public License as published by the +// Free Software Foundation; either version 3, or (at your option) +// any later version. + +// This library is distributed in the hope that it will be useful, +// but WITHOUT ANY WARRANTY; without even the implied warranty of +// MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +// GNU General Public License for more details. + +// You should have received a copy of the GNU General Public License along +// with this library; see the file COPYING3. If not see +// . + +#include +#include + +#define TEST_ALL_ORDERS() \ + do { \ + ORDER_TEST(std::memory_order_relaxed); \ + ORDER_TEST(std::memory_order_consume); \ + ORDER_TEST(std::memory_order_acquire); \ + ORDER_TEST(std::memory_order_release); \ + ORDER_TEST(std::memory_order_acq_rel); \ + ORDER_TEST(std::memory_order_seq_cst); \ + } while(0) + +void test01() +{ +#define ORDER_TEST(ORDER) \ + do { \ + __gnu_test::compare_exchange_order_lowering test; \ + __gnu_cxx::typelist::apply_generator(test, \ + __gnu_test::integral_types::type()); \ + } while (0); + TEST_ALL_ORDERS(); +#undef ORDER_TEST + + enum e { a, b, c }; +#define ORDER_TEST(ORDER) \ + do { \ + std::atomic x(a); \ + e expected = a; \ + x.compare_exchange_strong(expected, b, ORDER); \ + x.compare_exchange_weak(expected, c, ORDER); \ + } while (0); + TEST_ALL_ORDERS(); +#undef ORDER_TEST + +#define ORDER_TEST(ORDER) \ + do { \ + std::atomic x(nullptr); \ + void* expected = nullptr; \ + x.compare_exchange_strong(expected, nullptr, ORDER); \ + x.compare_exchange_weak(expected, nullptr, ORDER); \ + } while (0); + TEST_ALL_ORDERS(); +#undef ORDER_TEST +} diff --git a/libstdc++-v3/testsuite/util/testsuite_common_types.h b/libstdc++-v3/testsuite/util/testsuite_common_types.h index 54d6a75..e7f081b 100644 --- a/libstdc++-v3/testsuite/util/testsuite_common_types.h +++ b/libstdc++-v3/testsuite/util/testsuite_common_types.h @@ -872,5 +872,22 @@ namespace __gnu_test = &_Concept::__constraint; } }; + +#if __cplusplus >= 201103L + // Generator to test lowering requirements for compare-and-exchange. + template + struct compare_exchange_order_lowering + { + template + void + operator()() + { + std::atomic<_Tp> x; + _Tp __expected = 0; + x.compare_exchange_strong(__expected, 1, order); + x.compare_exchange_weak(__expected, 1, order); + } + }; +#endif } // namespace __gnu_test #endif