[multiple changes]

2009-10-16  Benjamin Kosnik  <bkoz@redhat.com>

        * include/c_compatibility/stdatomic.h: Include cstdatomic if
        __cplusplus.

2009-10-15  Benjamin Kosnik  <bkoz@redhat.com>

        PR libstdc++/40654
        PR libstdc++/40826
        * src/atomic.cc (atomic_flag_test_and_set_explicit): Add
        static_cast from base to derived.
        (atomic_flag_clear_explicit): Same.
        * include/bits/atomic_2.h (__atomic2::atomic_flag): Public derivation.
        Remove value type constructor.
        * include/bits/atomic_0.h (__atomic0::atomic_flag): Same.
        * include/std/future (_Future_state): Use ATOMIC_FLAG_INIT to
        initialized the atomic_flag member.

From-SVN: r152965
This commit is contained in:
Benjamin Kosnik 2009-10-18 03:30:03 +00:00 committed by Benjamin Kosnik
parent 58ce5dd074
commit 599e5f2642
8 changed files with 127 additions and 10 deletions

View File

@ -1,3 +1,21 @@
2009-10-16 Benjamin Kosnik <bkoz@redhat.com>
* include/c_compatibility/stdatomic.h: Include cstdatomic if
__cplusplus.
2009-10-15 Benjamin Kosnik <bkoz@redhat.com>
PR libstdc++/40654
PR libstdc++/40826
* src/atomic.cc (atomic_flag_test_and_set_explicit): Add
static_cast from base to derived.
(atomic_flag_clear_explicit): Same.
* include/bits/atomic_2.h (__atomic2::atomic_flag): Public derivation.
Remove value type constructor.
* include/bits/atomic_0.h (__atomic0::atomic_flag): Same.
* include/std/future (_Future_state): Use ATOMIC_FLAG_INIT to
initialized the atomic_flag member.
2009-10-15 Release Manager
* GCC 4.4.2 released.

View File

@ -82,14 +82,15 @@ namespace __atomic0
__r; })
/// atomic_flag
struct atomic_flag : private __atomic_flag_base
struct atomic_flag : public __atomic_flag_base
{
atomic_flag() = default;
~atomic_flag() = default;
atomic_flag(const atomic_flag&) = delete;
atomic_flag& operator=(const atomic_flag&) = delete;
atomic_flag(bool __i) { _M_i = __i; } // XXX deleted copy ctor != agg
// Conversion to ATOMIC_FLAG_INIT.
atomic_flag(bool __i): __atomic_flag_base({ __i }) { }
bool
test_and_set(memory_order __m = memory_order_seq_cst) volatile;

View File

@ -44,14 +44,15 @@
namespace __atomic2
{
/// atomic_flag
struct atomic_flag : private __atomic_flag_base
struct atomic_flag : public __atomic_flag_base
{
atomic_flag() = default;
~atomic_flag() = default;
atomic_flag(const atomic_flag&) = delete;
atomic_flag& operator=(const atomic_flag&) = delete;
atomic_flag(bool __i) { _M_i = __i; } // XXX deleted copy ctor != agg
// Conversion to ATOMIC_FLAG_INIT.
atomic_flag(bool __i): __atomic_flag_base({ __i }) { }
bool
test_and_set(memory_order __m = memory_order_seq_cst) volatile

View File

@ -186,8 +186,11 @@ _GLIBCXX_BEGIN_EXTERN_C
_GLIBCXX_END_EXTERN_C
_GLIBCXX_END_NAMESPACE
// Inject into global namespace. XXX
#if defined(__cplusplus) && !defined(_GLIBCXX_STDATOMIC)
// Inject into global namespace.
#ifdef __cplusplus
#include <cstdatomic>
using std::memory_order;
using std::memory_order_relaxed;
using std::memory_order_consume;

View File

@ -80,16 +80,16 @@ namespace std
atomic_flag_test_and_set_explicit(volatile __atomic_flag_base* __a,
memory_order __m)
{
volatile atomic_flag d(__a->_M_i);
return d.test_and_set(__m);
volatile atomic_flag* d = static_cast<volatile atomic_flag*>(__a);
return d->test_and_set(__m);
}
void
atomic_flag_clear_explicit(volatile __atomic_flag_base* __a,
memory_order __m)
{
volatile atomic_flag d(__a->_M_i);
return d.clear(__m);
volatile atomic_flag* d = static_cast<volatile atomic_flag*>(__a);
return d->clear(__m);
}
void

View File

@ -0,0 +1,34 @@
// { dg-options "-x c -shared-libgcc -lstdc++" }
// Copyright (C) 2009 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
// <http://www.gnu.org/licenses/>.
#include <cassert>
#include <stdatomic.h>
// libstdc++/40826
// libstdc++/40654
int main()
{
atomic_flag f = ATOMIC_FLAG_INIT;
atomic_flag_clear(&f); // set to false
assert( false == atomic_flag_test_and_set(&f) ); // return previous false, set to true
assert( true == atomic_flag_test_and_set(&f) ); // return true
return 0;
}

View File

@ -0,0 +1,33 @@
// { dg-options "-std=gnu++0x" }
// Copyright (C) 2009 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
// <http://www.gnu.org/licenses/>.
#include <cstdatomic>
#include <testsuite_hooks.h>
int main()
{
bool test __attribute__((unused)) = true;
std::atomic_flag f = ATOMIC_FLAG_INIT;
f.clear(); // set to false
VERIFY( false == f.test_and_set() ); // return previous false, set to true
VERIFY( true == f.test_and_set() ); // return true
return 0;
}

View File

@ -0,0 +1,27 @@
// { dg-options "-std=gnu++0x" }
// { dg-do compile }
// Copyright (C) 2008, 2009 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
// <http://www.gnu.org/licenses/>.
#include <stdatomic.h>
void test01()
{
using namespace std;
atomic_flag af = ATOMIC_FLAG_INIT;
}