diff --git a/rtos/Thread.cpp b/rtos/Thread.cpp index 61bfe964c66..9969e096704 100644 --- a/rtos/Thread.cpp +++ b/rtos/Thread.cpp @@ -44,6 +44,7 @@ namespace rtos { void Thread::constructor(osPriority priority, uint32_t stack_size, unsigned char *stack_pointer) { _tid = 0; + _finished = false; _dynamic_stack = (stack_pointer == NULL); #if defined(__MBED_CMSIS_RTOS_CA9) || defined(__MBED_CMSIS_RTOS_CM) @@ -74,7 +75,7 @@ void Thread::constructor(Callback task, osStatus Thread::start(Callback task) { _mutex.lock(); - if (_tid != 0) { + if ((_tid != 0) || _finished) { _mutex.unlock(); return osErrorParameter; } @@ -117,6 +118,7 @@ osStatus Thread::terminate() { osThreadId local_id = _tid; _join_sem.release(); _tid = (osThreadId)NULL; + _finished = true; ret = osThreadTerminate(local_id); @@ -177,11 +179,15 @@ int32_t Thread::signal_clr(int32_t signals) { Thread::State Thread::get_state() { #if !defined(__MBED_CMSIS_RTOS_CA9) && !defined(__MBED_CMSIS_RTOS_CM) #ifdef CMSIS_OS_RTX - State status = Deleted; + State status; _mutex.lock(); if (_tid != NULL) { status = (State)_thread_def.tcb.state; + } else if (_finished) { + status = Deleted; + } else { + status = Inactive; } _mutex.unlock(); @@ -367,6 +373,7 @@ void Thread::_thunk(const void * thread_ptr) t->_task(); t->_mutex.lock(); t->_tid = (osThreadId)NULL; + t->_finished = true; t->_join_sem.release(); // rtos will release the mutex automatically } diff --git a/rtos/Thread.h b/rtos/Thread.h index 6c480d74b78..d2bae4fb012 100644 --- a/rtos/Thread.h +++ b/rtos/Thread.h @@ -197,6 +197,7 @@ class Thread { /** Starts a thread executing the specified function. @param task function to be executed by this thread. @return status code that indicates the execution status of the function. + @note a thread can only be started once */ osStatus start(mbed::Callback task); @@ -251,7 +252,7 @@ class Thread { /** State of the Thread */ enum State { - Inactive, /**< Not created or terminated */ + Inactive, /**< Not created */ Ready, /**< Ready to run */ Running, /**< Running */ WaitingDelay, /**< Waiting for a delay to occur */ @@ -330,6 +331,10 @@ class Thread { virtual ~Thread(); private: + /* disallow copy constructor and assignment operators */ + Thread(const Thread&); + Thread& operator=(const Thread&); + // Required to share definitions without // delegated constructors void constructor(osPriority priority=osPriorityNormal, @@ -344,9 +349,10 @@ class Thread { mbed::Callback _task; osThreadId _tid; osThreadDef_t _thread_def; - bool _dynamic_stack; Semaphore _join_sem; Mutex _mutex; + bool _dynamic_stack; + bool _finished; }; }