diff options
| author | Bernard Xiong <[email protected]> | 2020-04-30 21:08:04 +0800 |
|---|---|---|
| committer | Bernard Xiong <[email protected]> | 2020-04-30 21:08:04 +0800 |
| commit | 786eb5ae9c77970f25f662d57a83276d09c9a72d (patch) | |
| tree | 660fc9e43e4d80d79cb7d147a63bafcc05bf20c7 /components/cplusplus/cxx_Thread.cpp | |
| parent | 5d696a2460eb593f4217be45d2d5c730c1e26c75 (diff) | |
[C++] rename the Thread/Mutex to cxx_Thread/Mutex to avoid same name issue
Diffstat (limited to 'components/cplusplus/cxx_Thread.cpp')
| -rw-r--r-- | components/cplusplus/cxx_Thread.cpp | 116 |
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; + } +} |
