From 8123cae864579219e5003a67b451ca4cc07d998b Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Thu, 8 Sep 2016 15:32:22 +0200 Subject: rtems: Add rtems_task_get_priority() Update #2556. Update #2784. --- cpukit/rtems/src/taskgetpriority.c | 77 ++++++++++++++++++++++++++++++++++++++ 1 file changed, 77 insertions(+) create mode 100644 cpukit/rtems/src/taskgetpriority.c (limited to 'cpukit/rtems/src/taskgetpriority.c') 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 + * + * + * 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 +#include +#include + +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; +} -- cgit v1.2.3