summaryrefslogtreecommitdiff
path: root/components/libc/cplusplus/cpp11/gcc/mutex.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'components/libc/cplusplus/cpp11/gcc/mutex.cpp')
-rw-r--r--components/libc/cplusplus/cpp11/gcc/mutex.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/components/libc/cplusplus/cpp11/gcc/mutex.cpp b/components/libc/cplusplus/cpp11/gcc/mutex.cpp
new file mode 100644
index 0000000000..e11f6d8990
--- /dev/null
+++ b/components/libc/cplusplus/cpp11/gcc/mutex.cpp
@@ -0,0 +1,52 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ * 2021-04-27 flybreak the first version.
+ */
+
+#include "mutex"
+
+namespace std
+{
+ // use a set of global and static objects
+ // a proxy function to pthread_once
+
+ function<void()> once_functor;
+
+ mutex& get_once_mutex()
+ {
+ static mutex once_mutex;
+ return once_mutex;
+ }
+
+ inline unique_lock<mutex>*& get_once_functor_lock_ptr()
+ {
+ static unique_lock<mutex>* once_functor_mutex_ptr = nullptr;
+ return once_functor_mutex_ptr;
+ }
+
+ void set_once_functor_lock_ptr(unique_lock<mutex>* m_ptr)
+ {
+ get_once_functor_lock_ptr() = m_ptr;
+ }
+
+ extern "C"
+ {
+ void once_proxy()
+ {
+ // need to first transfer the functor's ownership so as to call it
+ function<void()> once_call = std::move(once_functor);
+
+ // no need to hold the lock anymore
+ unique_lock<mutex>* lock_ptr = get_once_functor_lock_ptr();
+ get_once_functor_lock_ptr() = nullptr;
+ lock_ptr->unlock();
+
+ once_call();
+ }
+ }
+}