From 5181b1e391f3480d375a484fb55e70fd5586a5d1 Mon Sep 17 00:00:00 2001 From: Giovanni Di Sirio Date: Wed, 24 Feb 2016 10:28:43 +0000 Subject: [PATCH] Enhanced registry. git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@8939 35acf78f-673a-0410-8e92-d51de3d6d3f4 --- os/common/abstractions/nasa_osal/src/osapi.c | 38 ++++++++------- os/rt/include/chregistry.h | 2 + os/rt/src/chregistry.c | 50 ++++++++++++++++++++ release_note_next.txt | 1 + 4 files changed, 75 insertions(+), 16 deletions(-) diff --git a/os/common/abstractions/nasa_osal/src/osapi.c b/os/common/abstractions/nasa_osal/src/osapi.c index c84065c34..367d0f2d4 100644 --- a/os/common/abstractions/nasa_osal/src/osapi.c +++ b/os/common/abstractions/nasa_osal/src/osapi.c @@ -1318,8 +1318,12 @@ int32 OS_TaskInstallDeleteHandler(void *function_pointer) { * @api */ int32 OS_TaskDelete(uint32 task_id) { + thread_t *tp = (thread_t *)task_id; - (void)task_id; + /* Check for thread validity.*/ + if (chRegFindThreadByPointer(tp) == NULL) { + return OS_ERR_INVALID_ID; + } return OS_ERR_NOT_IMPLEMENTED; } @@ -1361,6 +1365,11 @@ int32 OS_TaskSetPriority (uint32 task_id, uint32 new_priority) { tprio_t rt_newprio; thread_t *tp = (thread_t *)task_id; + /* Check for thread validity.*/ + if (chRegFindThreadByPointer(tp) == NULL) { + return OS_ERR_INVALID_ID; + } + /* Checking priority range.*/ if ((new_priority < MIN_PRIORITY) || (new_priority > MAX_PRIORITY)) { return OS_ERR_INVALID_PRIORITY; @@ -1373,8 +1382,6 @@ int32 OS_TaskSetPriority (uint32 task_id, uint32 new_priority) { return OS_SUCCESS; } - /* TODO: Check presence in registry.*/ - chSysLock(); /* Changing priority.*/ @@ -1464,19 +1471,15 @@ int32 OS_TaskGetIdByName (uint32 *task_id, const char *task_name) { return OS_ERR_NAME_TOO_LONG; } - /* TODO: Check presence in registry.*/ + /* Searching in the registry.*/ + tp = chRegFindThreadByName(task_name); + if (tp == NULL) { + return OS_ERR_NAME_NOT_FOUND; + } - /* Scanning registry.*/ - tp = chRegFirstThread(); - do { - if (strcmp(chRegGetThreadNameX(tp), task_name) == 0) { - *task_id = (uint32)tp; - return OS_SUCCESS; - } - tp = chRegNextThread(tp); - } while (tp != NULL); + *task_id = (uint32)tp; - return OS_ERR_NAME_NOT_FOUND; + return OS_SUCCESS; } /** @@ -1494,13 +1497,16 @@ int32 OS_TaskGetInfo(uint32 task_id, OS_task_prop_t *task_prop) { thread_t *tp = (thread_t *)task_id; size_t wasize = (size_t)tp - (size_t)tp->stklimit + sizeof (thread_t); + /* Check for thread validity.*/ + if (chRegFindThreadByPointer(tp) == NULL) { + return OS_ERR_INVALID_ID; + } + /* NULL pointer checks.*/ if (task_prop == NULL) { return OS_INVALID_POINTER; } - /* TODO: Check presence in registry.*/ - strncpy(task_prop->name, tp->name, OS_MAX_API_NAME - 1); task_prop->creator = (uint32)chSysGetIdleThreadX(); task_prop->stack_size = (uint32)MEM_ALIGN_NEXT(wasize, PORT_STACK_ALIGN); diff --git a/os/rt/include/chregistry.h b/os/rt/include/chregistry.h index 39029b195..a786e93a0 100644 --- a/os/rt/include/chregistry.h +++ b/os/rt/include/chregistry.h @@ -108,6 +108,8 @@ extern "C" { extern ROMCONST chdebug_t ch_debug; thread_t *chRegFirstThread(void); thread_t *chRegNextThread(thread_t *tp); + thread_t *chRegFindThreadByName(const char *name); + thread_t *chRegFindThreadByPointer(thread_t *tp); #ifdef __cplusplus } #endif diff --git a/os/rt/src/chregistry.c b/os/rt/src/chregistry.c index 07185d331..944383bf1 100644 --- a/os/rt/src/chregistry.c +++ b/os/rt/src/chregistry.c @@ -44,6 +44,9 @@ * option must be enabled in @p chconf.h. * @{ */ + +#include + #include "ch.h" #if (CH_CFG_USE_REGISTRY == TRUE) || defined(__DOXYGEN__) @@ -160,6 +163,53 @@ thread_t *chRegNextThread(thread_t *tp) { return ntp; } +/** + * @brief Retrieves a thread pointer by name. + * + * @param[in] name the thread name + * @return A pointer to the found thread. + * @retval NULL if a matching thread has not been found. + * + * @api + */ +thread_t *chRegFindThreadByName(const char *name) { + thread_t *ctp; + + /* Scanning registry.*/ + ctp = chRegFirstThread(); + do { + if (strcmp(chRegGetThreadNameX(ctp), name) == 0) { + return ctp; + } + ctp = chRegNextThread(ctp); + } while (ctp != NULL); + + return NULL; +} #endif /* CH_CFG_USE_REGISTRY == TRUE */ +/** + * @brief Confirms that a pointer is a valid thread pointer. + * + * @param[in] tp pointer to the thread + * @return A pointer to the found thread. + * @retval NULL if a matching thread has not been found. + * + * @api + */ +thread_t *chRegFindThreadByPointer(thread_t *tp) { + thread_t *ctp; + + /* Scanning registry.*/ + ctp = chRegFirstThread(); + do { + if (ctp == tp) { + return ctp; + } + ctp = chRegNextThread(ctp); + } while (ctp != NULL); + + return NULL; +} + /** @} */ diff --git a/release_note_next.txt b/release_note_next.txt index 0d921c24e..4026ad9e8 100644 --- a/release_note_next.txt +++ b/release_note_next.txt @@ -25,6 +25,7 @@ a series of important new features. - Ability to use the new shared RTOS components. - Enhanced trace buffer, it is able to store events regarding not just threads but also IRQs, halts and user events. +- Enhanced Registry, it is now possible to find threads by name or by pointer. - Simplified the dynamic threading model, now it is the thread creator responsible for memory release, the references counter has been removed and the code is much simpler.