summaryrefslogtreecommitdiff
path: root/components/libc/cplusplus/cxx_Thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'components/libc/cplusplus/cxx_Thread.cpp')
-rw-r--r--components/libc/cplusplus/cxx_Thread.cpp117
1 files changed, 117 insertions, 0 deletions
diff --git a/components/libc/cplusplus/cxx_Thread.cpp b/components/libc/cplusplus/cxx_Thread.cpp
new file mode 100644
index 0000000000..f3484bb1f4
--- /dev/null
+++ b/components/libc/cplusplus/cxx_Thread.cpp
@@ -0,0 +1,117 @@
+/*
+ * Copyright (c) 2006-2021, RT-Thread Development Team
+ *
+ * SPDX-License-Identifier: Apache-2.0
+ *
+ * Change Logs:
+ * Date Author Notes
+ */
+
+#include "cxx_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;
+ }
+}