summaryrefslogtreecommitdiff
path: root/components/cplusplus/Thread.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'components/cplusplus/Thread.cpp')
-rw-r--r--components/cplusplus/Thread.cpp103
1 files changed, 103 insertions, 0 deletions
diff --git a/components/cplusplus/Thread.cpp b/components/cplusplus/Thread.cpp
new file mode 100644
index 0000000000..4d2d8a59ea
--- /dev/null
+++ b/components/cplusplus/Thread.cpp
@@ -0,0 +1,103 @@
+#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), 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(RT_NULL), started(false), _param(p)
+{
+ rt_event_init(&_event, name, 0);
+
+ _thread = rt_thread_create(name,
+ (thread_func_t)func,
+ this,
+ stack_size,
+ priority,
+ tick);
+}
+
+Thread::~Thread()
+{
+ 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();
+ }
+
+ rt_event_send(&pThis->_event, 1);
+}
+
+void Thread::run()
+{
+ /* please overload this method */
+}
+
+void Thread::wait(int32_t millisec)
+{
+ join(millisec);
+}
+
+void Thread::join(int32_t millisec)
+{
+ if (started)
+ {
+ rt_int32_t tick;
+
+ if (millisec < 0)
+ tick = -1;
+ else
+ tick = rt_tick_from_millisecond(millisec);
+
+ rt_event_recv(&_event, 1, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, tick, RT_NULL);
+ }
+}