1 /*
2 * Copyright (c) 2006-2021, RT-Thread Development Team
3 *
4 * SPDX-License-Identifier: Apache-2.0
5 *
6 * Change Logs:
7 * Date Author Notes
8 */
9
10 #include "cxx_thread.h"
11
12 using namespace rtthread;
13
Thread(rt_uint32_t stack_size,rt_uint8_t priority,rt_uint32_t tick,const char * name)14 Thread::Thread(rt_uint32_t stack_size,
15 rt_uint8_t priority,
16 rt_uint32_t tick,
17 const char *name)
18 : _entry(RT_NULL), _param(RT_NULL), started(false)
19 {
20 rt_event_init(&_event, name, 0);
21
22 _thread = rt_thread_create(name,
23 (thread_func_t)func,
24 this,
25 stack_size,
26 priority,
27 tick);
28 }
29
Thread(void (* entry)(void * p),void * p,rt_uint32_t stack_size,rt_uint8_t priority,rt_uint32_t tick,const char * name)30 Thread::Thread(void (*entry)(void *p),
31 void *p,
32 rt_uint32_t stack_size,
33 rt_uint8_t priority,
34 rt_uint32_t tick,
35 const char *name)
36 : _entry(entry), _param(p), started(false)
37 {
38 rt_event_init(&_event, name, 0);
39
40 _thread = rt_thread_create(name,
41 (thread_func_t)func,
42 this,
43 stack_size,
44 priority,
45 tick);
46 }
47
~Thread()48 Thread::~Thread()
49 {
50 rt_event_detach(&_event);
51 rt_thread_delete(_thread);
52 }
53
start()54 bool Thread::start()
55 {
56 if (rt_thread_startup(_thread) == RT_EOK)
57 {
58 started = true;
59 }
60
61 return started;
62 }
63
sleep(int32_t millisec)64 void Thread::sleep(int32_t millisec)
65 {
66 rt_int32_t tick;
67
68 if (millisec < 0)
69 tick = 1;
70 else
71 tick = rt_tick_from_millisecond(millisec);
72
73 rt_thread_delay(tick);
74 }
75
func(Thread * pThis)76 void Thread::func(Thread *pThis)
77 {
78 if (pThis->_entry != RT_NULL)
79 {
80 pThis->_entry(pThis->_param);
81 }
82 else
83 {
84 pThis->run(pThis->_param);
85 }
86
87 rt_event_send(&pThis->_event, 1);
88 }
89
run(void * parameter)90 void Thread::run(void *parameter)
91 {
92 /* please overload this method */
93 }
94
wait(int32_t millisec)95 rt_err_t Thread::wait(int32_t millisec)
96 {
97 return join(millisec);
98 }
99
join(int32_t millisec)100 rt_err_t Thread::join(int32_t millisec)
101 {
102 if (started)
103 {
104 rt_int32_t tick;
105
106 if (millisec < 0)
107 tick = -1;
108 else
109 tick = rt_tick_from_millisecond(millisec);
110
111 return rt_event_recv(&_event, 1, RT_EVENT_FLAG_OR | RT_EVENT_FLAG_CLEAR, tick, RT_NULL);
112 }
113 else
114 {
115 return -RT_ENOSYS;
116 }
117 }
118