aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2020-10-29 14:47:17 +0000
committerJonathan Wakely <jwakely@redhat.com>2020-10-29 14:47:17 +0000
commitd067bd72936aaaa7e947e919fc869143539ae023 (patch)
tree63114e16fe3b0e3212a681b6d941ff3c39f7db2d /gcc
parent3c9b99ef7115fa88ef4d744cc2afc424bd5c3ef2 (diff)
downloadgcc-d067bd72936aaaa7e947e919fc869143539ae023.zip
gcc-d067bd72936aaaa7e947e919fc869143539ae023.tar.gz
gcc-d067bd72936aaaa7e947e919fc869143539ae023.tar.bz2
libstdc++: Do not use volatile for __gnu_cxx::rope reference counting
The rope extension uses a volatile variable for its reference count. This is not only unnecessary for correctness (volatile provides neither atomicity nor memory visibility, and the variable is only modified while a lock is held) but it now causes deprecated warnings with -Wsystem-headers due to the use of ++ and -- operators. It would be possible to use __gnu_cxx::__exchange_and_add in _M_incr and _M_decr when __atomic_is_lock_free(sizeof(_RC_t), &_M_ref_count) is true, rather than locking a mutex. That would probably be a significant improvement for multi-threaded and single-threaded code (because __exchange_and_add will use non-atomic ops when possible, and even in MT code it should be faster than the mutex lock/unlock pair). However, mixing objects compiled with the old and new code would result in inconsistent synchronization being used for the reference count. libstdc++-v3/ChangeLog: * include/ext/rope (_Refcount_Base::_M_ref_count): Remove volatile qualifier. (_Refcount_Base::_M_decr()): Likewise.
Diffstat (limited to 'gcc')
0 files changed, 0 insertions, 0 deletions