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