diff options
author | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-09-08 15:32:22 +0200 |
---|---|---|
committer | Sebastian Huber <sebastian.huber@embedded-brains.de> | 2016-09-21 08:59:33 +0200 |
commit | 8123cae864579219e5003a67b451ca4cc07d998b (patch) | |
tree | e50feb997422afc2d20af9cd730d43d5896e0e5c /cpukit | |
parent | smptests/smpmutex01: Use test case functions (diff) | |
download | rtems-8123cae864579219e5003a67b451ca4cc07d998b.tar.bz2 |
rtems: Add rtems_task_get_priority()
Update #2556.
Update #2784.
Diffstat (limited to 'cpukit')
-rw-r--r-- | cpukit/rtems/Makefile.am | 1 | ||||
-rw-r--r-- | cpukit/rtems/include/rtems/rtems/tasks.h | 29 | ||||
-rw-r--r-- | cpukit/rtems/src/taskgetpriority.c | 77 |
3 files changed, 107 insertions, 0 deletions
diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am index 0a452c8121..4be426620c 100644 --- a/cpukit/rtems/Makefile.am +++ b/cpukit/rtems/Makefile.am @@ -88,6 +88,7 @@ librtems_a_SOURCES += src/tasks.c librtems_a_SOURCES += src/taskcreate.c librtems_a_SOURCES += src/taskdelete.c librtems_a_SOURCES += src/taskgetaffinity.c +librtems_a_SOURCES += src/taskgetpriority.c librtems_a_SOURCES += src/taskgetscheduler.c librtems_a_SOURCES += src/taskident.c librtems_a_SOURCES += src/taskinitusers.c diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h index e690e60557..0eaaeca4a3 100644 --- a/cpukit/rtems/include/rtems/rtems/tasks.h +++ b/cpukit/rtems/include/rtems/rtems/tasks.h @@ -320,6 +320,35 @@ rtems_status_code rtems_task_set_priority( ); /** + * @brief Gets the current priority of the specified task with respect to the + * specified scheduler instance. + * + * The current priority reflects temporary priority adjustments due to locking + * protocols, the rate-monotonic period objects on some schedulers and other + * mechanisms. + * + * @param[in] task_id Identifier of the task. Use @ref RTEMS_SELF to select + * the executing task. + * @param[in] scheduler_id Identifier of the scheduler instance. + * @param[out] priority Returns the current priority of the specified task with + * respect to the specified scheduler instance. + * + * @retval RTEMS_SUCCESSFUL Successful operation. + * @retval RTEMS_ILLEGAL_ON_REMOTE_OBJECT Directive is illegal on remote tasks. + * @retval RTEMS_INVALID_ADDRESS The priority parameter is @c NULL. + * @retval RTEMS_INVALID_ID Invalid task or scheduler identifier. + * @retval RTEMS_NOT_DEFINED The task has no priority within the specified + * scheduler instance. This error is only possible on SMP configurations. + * + * @see rtems_scheduler_ident(). + */ +rtems_status_code rtems_task_get_priority( + rtems_id task_id, + rtems_id scheduler_id, + rtems_task_priority *priority +); + +/** * @brief RTEMS Start Task * * RTEMS Task Manager diff --git a/cpukit/rtems/src/taskgetpriority.c b/cpukit/rtems/src/taskgetpriority.c new file mode 100644 index 0000000000..b6800e2133 --- /dev/null +++ b/cpukit/rtems/src/taskgetpriority.c @@ -0,0 +1,77 @@ +/* + * Copyright (c) 2016 embedded brains GmbH. All rights reserved. + * + * embedded brains GmbH + * Dornierstr. 4 + * 82178 Puchheim + * Germany + * <rtems@embedded-brains.de> + * + * The license and distribution terms for this file may be + * found in the file LICENSE in this distribution or at + * http://www.rtems.org/license/LICENSE. + */ + +#if HAVE_CONFIG_H +#include "config.h" +#endif + +#include <rtems/rtems/tasksimpl.h> +#include <rtems/score/schedulerimpl.h> +#include <rtems/score/threadimpl.h> + +rtems_status_code rtems_task_get_priority( + rtems_id task_id, + rtems_id scheduler_id, + rtems_task_priority *priority +) +{ + Thread_Control *the_thread; + Thread_queue_Context queue_context; + const Scheduler_Control *scheduler; + const Scheduler_Node *scheduler_node; + Priority_Control core_priority; + + if ( priority == NULL ) { + return RTEMS_INVALID_ADDRESS; + } + + if ( !_Scheduler_Get_by_id( scheduler_id, &scheduler ) ) { + return RTEMS_INVALID_ID; + } + + _Thread_queue_Context_initialize( &queue_context ); + the_thread = _Thread_Get( task_id, + &queue_context.Lock_context.Lock_context + ); + + if ( the_thread == NULL ) { +#if defined(RTEMS_MULTIPROCESSING) + if ( _Thread_MP_Is_remote( task_id ) ) { + return RTEMS_ILLEGAL_ON_REMOTE_OBJECT; + } +#endif + + return RTEMS_INVALID_ID; + } + + scheduler_node = _Thread_Scheduler_get_node_by_index( + the_thread, + _Scheduler_Get_index( scheduler ) + ); + + _Thread_Wait_acquire_critical( the_thread, &queue_context ); + +#if defined(RTEMS_SMP) + if ( _Priority_Is_empty( &scheduler_node->Wait.Priority ) ) { + _Thread_Wait_release( the_thread, &queue_context ); + return RTEMS_NOT_DEFINED; + } +#endif + + core_priority = _Priority_Get_priority( &scheduler_node->Wait.Priority ); + + _Thread_Wait_release( the_thread, &queue_context ); + *priority = _RTEMS_Priority_From_core( scheduler, core_priority ); + return RTEMS_SUCCESSFUL; +} |