diff options
author | Kostya Serebryany <kcc@google.com> | 2010-08-12 22:56:59 +0000 |
---|---|---|
committer | Paolo Carlini <paolo@gcc.gnu.org> | 2010-08-12 22:56:59 +0000 |
commit | be335b18a9133f849e2d927abdd945c68fc3c716 (patch) | |
tree | 0e6c156d49fe7f64d815154ccc4cbd3c33f02455 /libstdc++-v3 | |
parent | 644fa7acbdafe5d5c5ddea0e0dd0ca73781500ca (diff) | |
download | gcc-be335b18a9133f849e2d927abdd945c68fc3c716.zip gcc-be335b18a9133f849e2d927abdd945c68fc3c716.tar.gz gcc-be335b18a9133f849e2d927abdd945c68fc3c716.tar.bz2 |
c++config (_GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE, [...]): Add.
2010-08-12 Kostya Serebryany <kcc@google.com>
Paolo Carlini <paolo.carlini@oracle.com>
* include/bits/c++config (_GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE,
_GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER): Add.
* src/ios_init.cc (ios_base::Init::~Init): Decorate with the
latter.
* include/tr1_impl/boost_sp_counted_base.h: Likewise.
* include/ext/rc_string_base.h: Likewise.
* include/bits/locale_classes.h: Likewise.
* include/bits/basic_string.h: Likewise.
* include/bits/ios_base.h: Likewise.
* testsuite/27_io/ios_base/cons/assign_neg.cc: Adjust dg-error
line number.
* testsuite/27_io/ios_base/cons/copy_neg.cc: Likewise.
* testsuite/ext/profile/mutex_extensions.cc: Likewise.
Co-Authored-By: Paolo Carlini <paolo.carlini@oracle.com>
From-SVN: r163210
Diffstat (limited to 'libstdc++-v3')
-rw-r--r-- | libstdc++-v3/ChangeLog | 17 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/basic_string.h | 13 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/c++config | 29 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/ios_base.h | 12 | ||||
-rw-r--r-- | libstdc++-v3/include/bits/locale_classes.h | 6 | ||||
-rw-r--r-- | libstdc++-v3/include/ext/rc_string_base.h | 9 | ||||
-rw-r--r-- | libstdc++-v3/include/tr1_impl/boost_sp_counted_base.h | 15 | ||||
-rw-r--r-- | libstdc++-v3/src/ios_init.cc | 5 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc | 2 | ||||
-rw-r--r-- | libstdc++-v3/testsuite/ext/profile/mutex_extensions.cc | 4 |
11 files changed, 101 insertions, 13 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog index 84d3598..f133c0a 100644 --- a/libstdc++-v3/ChangeLog +++ b/libstdc++-v3/ChangeLog @@ -1,3 +1,20 @@ +2010-08-12 Kostya Serebryany <kcc@google.com> + Paolo Carlini <paolo.carlini@oracle.com> + + * include/bits/c++config (_GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE, + _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER): Add. + * src/ios_init.cc (ios_base::Init::~Init): Decorate with the + latter. + * include/tr1_impl/boost_sp_counted_base.h: Likewise. + * include/ext/rc_string_base.h: Likewise. + * include/bits/locale_classes.h: Likewise. + * include/bits/basic_string.h: Likewise. + * include/bits/ios_base.h: Likewise. + * testsuite/27_io/ios_base/cons/assign_neg.cc: Adjust dg-error + line number. + * testsuite/27_io/ios_base/cons/copy_neg.cc: Likewise. + * testsuite/ext/profile/mutex_extensions.cc: Likewise. + 2010-08-11 Paolo Carlini <paolo.carlini@oracle.com> * include/bits/hashtable.h (_Hashtable<>::erase(const key_type&)): diff --git a/libstdc++-v3/include/bits/basic_string.h b/libstdc++-v3/include/bits/basic_string.h index fe9e1a3..74820eb 100644 --- a/libstdc++-v3/include/bits/basic_string.h +++ b/libstdc++-v3/include/bits/basic_string.h @@ -232,9 +232,16 @@ _GLIBCXX_BEGIN_NAMESPACE(std) #ifndef _GLIBCXX_FULLY_DYNAMIC_STRING if (__builtin_expect(this != &_S_empty_rep(), false)) #endif - if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount, - -1) <= 0) - _M_destroy(__a); + { + // Be race-detector-friendly. For more info see bits/c++config. + _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount) + if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount, + -1) <= 0) + { + _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount) + _M_destroy(__a); + } + } } // XXX MT void diff --git a/libstdc++-v3/include/bits/c++config b/libstdc++-v3/include/bits/c++config index 9dc9ac2..fef6933 100644 --- a/libstdc++-v3/include/bits/c++config +++ b/libstdc++-v3/include/bits/c++config @@ -60,6 +60,35 @@ # define _GLIBCXX_DEPRECATED_ATTR #endif +// Macros for race detectors. +// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) and +// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) should be used to explain +// atomic (lock-free) synchronization to race detectors: +// the race detector will infer a happens-before arc from the former to the +// latter when they share the same argument pointer. +// +// The most frequent use case for these macros (and the only case in the +// current implementation of the library) is atomic reference counting: +// void _M_remove_reference() +// { +// _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&this->_M_refcount) +// if (__gnu_cxx::__exchange_and_add_dispatch(&this->_M_refcount, -1) <= 0) +// { +// _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&this->_M_refcount) +// _M_destroy(__a); +// } +// } +// The annotations in this example tell the race detector that all memory +// accesses occurred when the refcount was positive do not race with +// memory accesses which occurred after the refcount became zero. + +#ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE +# define _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(A) +#endif +#ifndef _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER +# define _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(A) +#endif + // Macros for activating various namespace association modes. // _GLIBCXX_NAMESPACE_ASSOCIATION_DEBUG // _GLIBCXX_NAMESPACE_ASSOCIATION_PARALLEL diff --git a/libstdc++-v3/include/bits/ios_base.h b/libstdc++-v3/include/bits/ios_base.h index 6515dd4..6cca991 100644 --- a/libstdc++-v3/include/bits/ios_base.h +++ b/libstdc++-v3/include/bits/ios_base.h @@ -474,7 +474,16 @@ _GLIBCXX_BEGIN_NAMESPACE(std) // 0 => OK to delete. int _M_remove_reference() - { return __gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1); } + { + // Be race-detector-friendly. For more info see bits/c++config. + _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_refcount) + int __res = __gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1); + if (__res == 0) + { + _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_refcount) + } + return __res; + } }; _Callback_list* _M_callbacks; @@ -962,4 +971,3 @@ _GLIBCXX_BEGIN_NAMESPACE(std) _GLIBCXX_END_NAMESPACE #endif /* _IOS_BASE_H */ - diff --git a/libstdc++-v3/include/bits/locale_classes.h b/libstdc++-v3/include/bits/locale_classes.h index 347e761..c519f35 100644 --- a/libstdc++-v3/include/bits/locale_classes.h +++ b/libstdc++-v3/include/bits/locale_classes.h @@ -402,8 +402,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std) void _M_remove_reference() const throw() { + // Be race-detector-friendly. For more info see bits/c++config. + _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_refcount) if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1) { + _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_refcount) __try { delete this; } __catch(...) @@ -508,8 +511,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std) void _M_remove_reference() throw() { + // Be race-detector-friendly. For more info see bits/c++config. + _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_refcount) if (__gnu_cxx::__exchange_and_add_dispatch(&_M_refcount, -1) == 1) { + _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_refcount) __try { delete this; } __catch(...) diff --git a/libstdc++-v3/include/ext/rc_string_base.h b/libstdc++-v3/include/ext/rc_string_base.h index dd18738..32c9d38 100644 --- a/libstdc++-v3/include/ext/rc_string_base.h +++ b/libstdc++-v3/include/ext/rc_string_base.h @@ -199,9 +199,16 @@ _GLIBCXX_BEGIN_NAMESPACE(__gnu_cxx) void _M_dispose() { + // Be race-detector-friendly. For more info see bits/c++config. + _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_rep()->_M_info. + _M_refcount) if (__exchange_and_add_dispatch(&_M_rep()->_M_info._M_refcount, -1) <= 0) - _M_rep()->_M_destroy(_M_get_allocator()); + { + _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_rep()->_M_info. + _M_refcount) + _M_rep()->_M_destroy(_M_get_allocator()); + } } // XXX MT bool diff --git a/libstdc++-v3/include/tr1_impl/boost_sp_counted_base.h b/libstdc++-v3/include/tr1_impl/boost_sp_counted_base.h index 5603085..a995df5 100644 --- a/libstdc++-v3/include/tr1_impl/boost_sp_counted_base.h +++ b/libstdc++-v3/include/tr1_impl/boost_sp_counted_base.h @@ -1,6 +1,6 @@ // <tr1_impl/boost_sp_counted_base.h> -*- C++ -*- -// Copyright (C) 2007, 2009 Free Software Foundation, Inc. +// Copyright (C) 2007, 2008, 2009, 2010 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 @@ -139,8 +139,11 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 void _M_release() // nothrow { + // Be race-detector-friendly. For more info see bits/c++config. + _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_use_count) if (__gnu_cxx::__exchange_and_add_dispatch(&_M_use_count, -1) == 1) { + _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_use_count) _M_dispose(); // There must be a memory barrier between dispose() and destroy() // to ensure that the effects of dispose() are observed in the @@ -152,9 +155,14 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 _GLIBCXX_WRITE_MEM_BARRIER; } + // Be race-detector-friendly. For more info see bits/c++config. + _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_weak_count) if (__gnu_cxx::__exchange_and_add_dispatch(&_M_weak_count, -1) == 1) - _M_destroy(); + { + _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_weak_count) + _M_destroy(); + } } } @@ -165,8 +173,11 @@ _GLIBCXX_BEGIN_NAMESPACE_TR1 void _M_weak_release() // nothrow { + // Be race-detector-friendly. For more info see bits/c++config. + _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_M_weak_count) if (__gnu_cxx::__exchange_and_add_dispatch(&_M_weak_count, -1) == 1) { + _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_M_weak_count) if (_Mutex_base<_Lp>::_S_need_barriers) { // See _M_release(), diff --git a/libstdc++-v3/src/ios_init.cc b/libstdc++-v3/src/ios_init.cc index 1885d82..209a324 100644 --- a/libstdc++-v3/src/ios_init.cc +++ b/libstdc++-v3/src/ios_init.cc @@ -1,7 +1,7 @@ // Iostreams base classes -*- C++ -*- // Copyright (C) 1997, 1998, 1999, 2000, 2001, 2002, 2003, 2004, 2005, -// 2006, 2007, 2008, 2009 +// 2006, 2007, 2008, 2009, 2010 // Free Software Foundation, Inc. // // This file is part of the GNU ISO C++ Library. This library is free @@ -122,8 +122,11 @@ _GLIBCXX_BEGIN_NAMESPACE(std) ios_base::Init::~Init() { + // Be race-detector-friendly. For more info see bits/c++config. + _GLIBCXX_SYNCHRONIZATION_HAPPENS_BEFORE(&_S_refcount) if (__gnu_cxx::__exchange_and_add_dispatch(&_S_refcount, -1) == 2) { + _GLIBCXX_SYNCHRONIZATION_HAPPENS_AFTER(&_S_refcount) // Catch any exceptions thrown by basic_ostream::flush() __try { diff --git a/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc b/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc index 9f85ad1..a7adff4 100644 --- a/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc +++ b/libstdc++-v3/testsuite/27_io/ios_base/cons/assign_neg.cc @@ -34,5 +34,5 @@ void test01() } // { dg-error "synthesized" "" { target *-*-* } 33 } // { dg-error "within this context" "" { target *-*-* } 26 } -// { dg-error "is private" "" { target *-*-* } 779 } +// { dg-error "is private" "" { target *-*-* } 788 } // { dg-error "operator=" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc b/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc index 2a75737..44f7af8 100644 --- a/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc +++ b/libstdc++-v3/testsuite/27_io/ios_base/cons/copy_neg.cc @@ -34,5 +34,5 @@ void test02() } // { dg-error "within this context" "" { target *-*-* } 26 } // { dg-error "synthesized" "" { target *-*-* } 33 } -// { dg-error "is private" "" { target *-*-* } 776 } +// { dg-error "is private" "" { target *-*-* } 785 } // { dg-error "copy constructor" "" { target *-*-* } 0 } diff --git a/libstdc++-v3/testsuite/ext/profile/mutex_extensions.cc b/libstdc++-v3/testsuite/ext/profile/mutex_extensions.cc index 4b30661..471c448 100644 --- a/libstdc++-v3/testsuite/ext/profile/mutex_extensions.cc +++ b/libstdc++-v3/testsuite/ext/profile/mutex_extensions.cc @@ -3,7 +3,7 @@ // -*- C++ -*- -// Copyright (C) 2006, 2007, 2009 Free Software Foundation, Inc. +// Copyright (C) 2006, 2007, 2009, 2010 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 @@ -22,4 +22,4 @@ #include <vector> -// { dg-error "Cannot use -D_GLIBCXX_PROFILE with " "" { target *-*-* } 167 } +// { dg-error "Cannot use -D_GLIBCXX_PROFILE with " "" { target *-*-* } 196 } |