summaryrefslogtreecommitdiff
path: root/components/cplusplus/cxx_Thread.cpp
diff options
context:
space:
mode:
authorBernard Xiong <[email protected]>2020-05-01 16:37:22 +0800
committerGitHub <[email protected]>2020-05-01 16:37:22 +0800
commit084b0b0675ad5ab1bab77f37d0ea9a8b46a4fd72 (patch)
tree660fc9e43e4d80d79cb7d147a63bafcc05bf20c7 /components/cplusplus/cxx_Thread.cpp
parent5d696a2460eb593f4217be45d2d5c730c1e26c75 (diff)
parent786eb5ae9c77970f25f662d57a83276d09c9a72d (diff)
Merge pull request #3572 from BernardXiong/cxx_rename
[C++] rename the Thread/Mutex to cxx_Thread/Mutex to avoid same name …
Diffstat (limited to 'components/cplusplus/cxx_Thread.cpp')
-rw-r--r--components/cplusplus/cxx_Thread.cpp116
1 files changed, 116 insertions, 0 deletions
diff --git a/components/cplusplus/cxx_Thread.cpp b/components/cplusplus/cxx_Thread.cpp
new file mode 100644
index 0000000000..b21fbdce1f
--- /dev/null
+++ b/components/cplusplus/cxx_Thread.cpp
@@ -0,0 +1,116 @@
+/*
+ * Copyright (c) 2006-2018, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+#include "Thread.h"
+
+using namespace rtthread;
+
+Thread::Thread(rt_uint32_t stack_size,
+ rt_uint8_t priority,
+ rt_uint32_t tick,
+ const char *name)
+ : _entry(RT_NULL), _param(RT_NULL), started(false)
+{
+ rt_event_init(&_event, name, 0);
+
+ _thread = rt_thread_create(name,
+ (thread_func_t)func,
+ this,
+ stack_size,
+ priority,
+ tick);
+}
+
+Thread::Thread(void (*entry)(void *p),
+ void *p,
+ rt_uint32_t stack_size,
+ rt_uint8_t priority,
+ rt_uint32_t tick,
+ const char *name)
+ : _entry(entry), _param(p), started(false)
+{
+ rt_event_init(&_event, name, 0);
+
+ _thread = rt_thread_create(name,
+ (thread_func_t)func,
+ this,
+ stack_size,
+ priority,
+ tick);
+}
+
+Thread::~Thread()
+{
+ rt_event_detach(&_event);
+ rt_thread_delete(_thread);
+}
+
+bool Thread::start()
+{
+ if (rt_thread_startup(_thread) == RT_EOK)
+ {
+ started = true;
+ }
+
+ return started;
+}
+
+void Thread::sleep(int32_t millisec)
+{
+ rt_int32_t tick;
+
+ if (millisec < 0)
+ tick = 1;
+ else
+ tick = rt_tick_from_millisecond(millisec);
+
+ rt_thread_delay(tick);
+}
+
+void Thread::func(Thread *pThis)
+{
+ if (pThis->_entry != RT_NULL)
+ {
+ pThis->_entry(pThis->_param);
+ }
+ else
+ {
+ pThis->run(pThis->_param);
+ }
+
+ rt_event_send(&pThis->_event, 1);
+}
+
+void Thread::run(void *parameter)
+{
+ /* please overload this method */
+}
+
+rt_err_t Thread::wait(int32_t millisec)
+{
+ return join(millisec);
+}
+
+rt_err_t Thread::join(int32_t millisec)
+{
+ if (started)
+ {
+ rt_int32_t tick;
+
+ if (millisec < 0)
+ tick = -1;
+ else
+ tick = rt_tick_from_millisecond(millisec);
+
+ return rt_event_recv(&_event, 1, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, tick, RT_NULL);
+ }
+ else
+ {
+ return -RT_ENOSYS;
+ }
+}