aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJonathan Wakely <jwakely@redhat.com>2016-10-12 13:16:15 +0100
committerJonathan Wakely <redi@gcc.gnu.org>2016-10-12 13:16:15 +0100
commitcfbdc34f25dac9e6568618f69e3ee46ff1714766 (patch)
treebd62964bf11dc4aab273bf8ac359226e77533808
parent08a53a2eda8886d406c497595d57ba09aaf5893e (diff)
downloadgcc-cfbdc34f25dac9e6568618f69e3ee46ff1714766.zip
gcc-cfbdc34f25dac9e6568618f69e3ee46ff1714766.tar.gz
gcc-cfbdc34f25dac9e6568618f69e3ee46ff1714766.tar.bz2
Simplify std::call_once implementation
* include/std/mutex [_GLIBCXX_HAVE_TLS] (_Once_call): Remove. (call_once) [_GLIBCXX_HAVE_TLS]: Simplify by removing _Once_call. From-SVN: r241034
-rw-r--r--libstdc++-v3/ChangeLog3
-rw-r--r--libstdc++-v3/include/std/mutex30
2 files changed, 10 insertions, 23 deletions
diff --git a/libstdc++-v3/ChangeLog b/libstdc++-v3/ChangeLog
index c02bbf0..cda7761 100644
--- a/libstdc++-v3/ChangeLog
+++ b/libstdc++-v3/ChangeLog
@@ -1,5 +1,8 @@
2016-10-12 Jonathan Wakely <jwakely@redhat.com>
+ * include/std/mutex [_GLIBCXX_HAVE_TLS] (_Once_call): Remove.
+ (call_once) [_GLIBCXX_HAVE_TLS]: Simplify by removing _Once_call.
+
* include/bits/stl_uninitialized.h
(__uninitialized_default_novalue_n_1<true>): Add missing return.
* testsuite/20_util/specialized_algorithms/memory_management_tools/
diff --git a/libstdc++-v3/include/std/mutex b/libstdc++-v3/include/std/mutex
index 4c6f036..e90006f 100644
--- a/libstdc++-v3/include/std/mutex
+++ b/libstdc++-v3/include/std/mutex
@@ -579,21 +579,6 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
#ifdef _GLIBCXX_HAVE_TLS
extern __thread void* __once_callable;
extern __thread void (*__once_call)();
-
- template<typename _Tuple, typename _IndexSeq
- = typename _Build_index_tuple<tuple_size<_Tuple>::value>::__type>
- struct _Once_call;
-
- template<typename _Tuple, size_t... _Ind>
- struct _Once_call<_Tuple, _Index_tuple<_Ind...>>
- {
- static void
- _S_call()
- {
- auto& __f_args = *static_cast<_Tuple*>(__once_callable);
- std::__invoke(std::get<_Ind>(std::move(__f_args))...);
- }
- };
#else
extern function<void()> __once_functor;
@@ -613,17 +598,16 @@ _GLIBCXX_BEGIN_NAMESPACE_VERSION
{
// _GLIBCXX_RESOLVE_LIB_DEFECTS
// 2442. call_once() shouldn't DECAY_COPY()
-#ifdef _GLIBCXX_HAVE_TLS
- auto __f_args = std::forward_as_tuple(
- std::forward<_Callable>(__f), std::forward<_Args>(__args)...);
- __once_callable = std::__addressof(__f_args);
- __once_call = _Once_call<decltype(__f_args)>::_S_call;
-#else
- unique_lock<mutex> __functor_lock(__get_once_mutex());
- __once_functor = [&] {
+ auto __callable = [&] {
std::__invoke(std::forward<_Callable>(__f),
std::forward<_Args>(__args)...);
};
+#ifdef _GLIBCXX_HAVE_TLS
+ __once_callable = std::__addressof(__callable);
+ __once_call = []{ (*(decltype(__callable)*)__once_callable)(); };
+#else
+ unique_lock<mutex> __functor_lock(__get_once_mutex());
+ __once_functor = __callable;
__set_once_functor_lock_ptr(&__functor_lock);
#endif