Enhanced registry.

git-svn-id: svn://svn.code.sf.net/p/chibios/svn/trunk@8939 35acf78f-673a-0410-8e92-d51de3d6d3f4
This commit is contained in:
Giovanni Di Sirio 2016-02-24 10:28:43 +00:00
parent 54e8a6c9e2
commit 5181b1e391
4 changed files with 75 additions and 16 deletions

View File

@ -1318,8 +1318,12 @@ int32 OS_TaskInstallDeleteHandler(void *function_pointer) {
* @api * @api
*/ */
int32 OS_TaskDelete(uint32 task_id) { 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; return OS_ERR_NOT_IMPLEMENTED;
} }
@ -1361,6 +1365,11 @@ int32 OS_TaskSetPriority (uint32 task_id, uint32 new_priority) {
tprio_t rt_newprio; tprio_t rt_newprio;
thread_t *tp = (thread_t *)task_id; thread_t *tp = (thread_t *)task_id;
/* Check for thread validity.*/
if (chRegFindThreadByPointer(tp) == NULL) {
return OS_ERR_INVALID_ID;
}
/* Checking priority range.*/ /* Checking priority range.*/
if ((new_priority < MIN_PRIORITY) || (new_priority > MAX_PRIORITY)) { if ((new_priority < MIN_PRIORITY) || (new_priority > MAX_PRIORITY)) {
return OS_ERR_INVALID_PRIORITY; return OS_ERR_INVALID_PRIORITY;
@ -1373,8 +1382,6 @@ int32 OS_TaskSetPriority (uint32 task_id, uint32 new_priority) {
return OS_SUCCESS; return OS_SUCCESS;
} }
/* TODO: Check presence in registry.*/
chSysLock(); chSysLock();
/* Changing priority.*/ /* Changing priority.*/
@ -1464,19 +1471,15 @@ int32 OS_TaskGetIdByName (uint32 *task_id, const char *task_name) {
return OS_ERR_NAME_TOO_LONG; return OS_ERR_NAME_TOO_LONG;
} }
/* TODO: Check presence in registry.*/ /* Searching in the registry.*/
tp = chRegFindThreadByName(task_name);
/* Scanning registry.*/ if (tp == NULL) {
tp = chRegFirstThread();
do {
if (strcmp(chRegGetThreadNameX(tp), task_name) == 0) {
*task_id = (uint32)tp;
return OS_SUCCESS;
}
tp = chRegNextThread(tp);
} while (tp != NULL);
return OS_ERR_NAME_NOT_FOUND; return OS_ERR_NAME_NOT_FOUND;
}
*task_id = (uint32)tp;
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; thread_t *tp = (thread_t *)task_id;
size_t wasize = (size_t)tp - (size_t)tp->stklimit + sizeof (thread_t); 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.*/ /* NULL pointer checks.*/
if (task_prop == NULL) { if (task_prop == NULL) {
return OS_INVALID_POINTER; return OS_INVALID_POINTER;
} }
/* TODO: Check presence in registry.*/
strncpy(task_prop->name, tp->name, OS_MAX_API_NAME - 1); strncpy(task_prop->name, tp->name, OS_MAX_API_NAME - 1);
task_prop->creator = (uint32)chSysGetIdleThreadX(); task_prop->creator = (uint32)chSysGetIdleThreadX();
task_prop->stack_size = (uint32)MEM_ALIGN_NEXT(wasize, PORT_STACK_ALIGN); task_prop->stack_size = (uint32)MEM_ALIGN_NEXT(wasize, PORT_STACK_ALIGN);

View File

@ -108,6 +108,8 @@ extern "C" {
extern ROMCONST chdebug_t ch_debug; extern ROMCONST chdebug_t ch_debug;
thread_t *chRegFirstThread(void); thread_t *chRegFirstThread(void);
thread_t *chRegNextThread(thread_t *tp); thread_t *chRegNextThread(thread_t *tp);
thread_t *chRegFindThreadByName(const char *name);
thread_t *chRegFindThreadByPointer(thread_t *tp);
#ifdef __cplusplus #ifdef __cplusplus
} }
#endif #endif

View File

@ -44,6 +44,9 @@
* option must be enabled in @p chconf.h. * option must be enabled in @p chconf.h.
* @{ * @{
*/ */
#include <string.h>
#include "ch.h" #include "ch.h"
#if (CH_CFG_USE_REGISTRY == TRUE) || defined(__DOXYGEN__) #if (CH_CFG_USE_REGISTRY == TRUE) || defined(__DOXYGEN__)
@ -160,6 +163,53 @@ thread_t *chRegNextThread(thread_t *tp) {
return ntp; 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 */ #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;
}
/** @} */ /** @} */

View File

@ -25,6 +25,7 @@ a series of important new features.
- Ability to use the new shared RTOS components. - Ability to use the new shared RTOS components.
- Enhanced trace buffer, it is able to store events regarding not just threads - Enhanced trace buffer, it is able to store events regarding not just threads
but also IRQs, halts and user events. 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 - Simplified the dynamic threading model, now it is the thread creator
responsible for memory release, the references counter has been removed responsible for memory release, the references counter has been removed
and the code is much simpler. and the code is much simpler.