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