summaryrefslogtreecommitdiff
path: root/components/cplusplus/cpp11/gcc/mutex.cpp
diff options
context:
space:
mode:
authorWBI\nxf44444 <[email protected]>2022-01-26 01:43:05 +0800
committerWBI\nxf44444 <[email protected]>2022-01-26 01:43:05 +0800
commit8b0f50b7e211ee32ab08ba085ecd74588c3a3c63 (patch)
tree75440be5ecd30cc1403a9387851c0530ed057981 /components/cplusplus/cpp11/gcc/mutex.cpp
parent3be35fecae513b07c35bd6f3992bf7824434bdd6 (diff)
parent32a5668593c578b85560338c29d76f3a252c8dbc (diff)
Update i2c driver, add read ACK and BUS status check
Diffstat (limited to 'components/cplusplus/cpp11/gcc/mutex.cpp')
-rw-r--r--components/cplusplus/cpp11/gcc/mutex.cpp52
1 files changed, 52 insertions, 0 deletions
diff --git a/components/cplusplus/cpp11/gcc/mutex.cpp b/components/cplusplus/cpp11/gcc/mutex.cpp
new file mode 100644
index 0000000000..e11f6d8990
--- /dev/null
+++ b/components/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();
+ }
+ }
+}