From b427a92adfd16e8d68b275b44337f54f6ab0a3ca Mon Sep 17 00:00:00 2001 From: Sebastian Huber Date: Wed, 9 Apr 2014 10:09:24 +0200 Subject: rtems: Add scheduler identification --- cpukit/rtems/Makefile.am | 1 + cpukit/rtems/include/rtems/rtems/tasks.h | 17 +++++++++ cpukit/rtems/src/schedulerident.c | 46 ++++++++++++++++++++++++ cpukit/score/include/rtems/score/object.h | 3 +- cpukit/score/include/rtems/score/objectimpl.h | 9 +++++ cpukit/score/include/rtems/score/schedulerimpl.h | 10 ++++++ testsuites/sptests/spscheduler01/init.c | 30 +++++++++++++++- 7 files changed, 114 insertions(+), 2 deletions(-) create mode 100644 cpukit/rtems/src/schedulerident.c diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am index b6a19c4f14..57b15ca097 100644 --- a/cpukit/rtems/Makefile.am +++ b/cpukit/rtems/Makefile.am @@ -116,6 +116,7 @@ librtems_a_SOURCES += src/taskvariableget.c librtems_a_SOURCES += src/taskvariable_invoke_dtor.c endif librtems_a_SOURCES += src/taskdata.c +librtems_a_SOURCES += src/schedulerident.c ## RATEMON_C_FILES librtems_a_SOURCES += src/ratemon.c diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h index 87128be5f5..5816e7d884 100644 --- a/cpukit/rtems/include/rtems/rtems/tasks.h +++ b/cpukit/rtems/include/rtems/rtems/tasks.h @@ -548,6 +548,23 @@ rtems_status_code rtems_task_set_affinity( */ rtems_id rtems_task_self(void); +/** + * @brief Identifies a scheduler by its name. + * + * The scheduler name is determined by the scheduler configuration. + * + * @param[in] name The scheduler name. + * @param[out] id The scheduler identifier associated with the name. + * + * @retval RTEMS_SUCCESSFUL Successful operation. + * @retval RTEMS_INVALID_ADDRESS The @a id parameter is @c NULL. + * @retval RTEMS_INVALID_NAME Invalid scheduler name. + */ +rtems_status_code rtems_scheduler_ident( + rtems_name name, + rtems_id *id +); + /**@}*/ /** diff --git a/cpukit/rtems/src/schedulerident.c b/cpukit/rtems/src/schedulerident.c new file mode 100644 index 0000000000..d9e913c946 --- /dev/null +++ b/cpukit/rtems/src/schedulerident.c @@ -0,0 +1,46 @@ +/* + * Copyright (c) 2014 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 + +rtems_status_code rtems_scheduler_ident( + rtems_name name, + rtems_id *id +) +{ + rtems_status_code sc; + + if ( id != NULL ) { + size_t n = _Scheduler_Count; + size_t i; + + sc = RTEMS_INVALID_NAME; + + for ( i = 0 ; i < n && sc == RTEMS_INVALID_NAME ; ++i ) { + if ( _Scheduler_Table[ i ].name == name ) { + *id = _Scheduler_Build_id( i ); + sc = RTEMS_SUCCESSFUL; + } + } + } else { + sc = RTEMS_INVALID_ADDRESS; + } + + return sc; +} diff --git a/cpukit/score/include/rtems/score/object.h b/cpukit/score/include/rtems/score/object.h index 0ccafbfac9..4eb66ad487 100644 --- a/cpukit/score/include/rtems/score/object.h +++ b/cpukit/score/include/rtems/score/object.h @@ -217,7 +217,8 @@ typedef enum { OBJECTS_NO_API = 0, OBJECTS_INTERNAL_API = 1, OBJECTS_CLASSIC_API = 2, - OBJECTS_POSIX_API = 3 + OBJECTS_POSIX_API = 3, + OBJECTS_FAKE_OBJECTS_API = 7 } Objects_APIs; /** This macro is used to generically specify the last API index. */ diff --git a/cpukit/score/include/rtems/score/objectimpl.h b/cpukit/score/include/rtems/score/objectimpl.h index 383f0a738b..4e626ae663 100644 --- a/cpukit/score/include/rtems/score/objectimpl.h +++ b/cpukit/score/include/rtems/score/objectimpl.h @@ -100,6 +100,15 @@ typedef enum { /** This macro is used to generically specify the last API index. */ #define OBJECTS_POSIX_CLASSES_LAST OBJECTS_POSIX_RWLOCKS +/* + * For fake objects, which have an object identifier, but no objects + * information block. + */ +typedef enum { + OBJECTS_FAKE_OBJECTS_NO_CLASS = 0, + OBJECTS_FAKE_OBJECTS_SCHEDULERS = 1 +} Objects_Fake_objects_API; + /** * This enumerated type lists the locations which may be returned * by _Objects_Get. These codes indicate the success of locating diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h index e088d26b88..01be51518e 100644 --- a/cpukit/score/include/rtems/score/schedulerimpl.h +++ b/cpukit/score/include/rtems/score/schedulerimpl.h @@ -451,6 +451,16 @@ RTEMS_INLINE_ROUTINE const Scheduler_Control *_Scheduler_Get( return &_Scheduler_Table[ 0 ]; } +RTEMS_INLINE_ROUTINE Objects_Id _Scheduler_Build_id( uint32_t scheduler_index ) +{ + return _Objects_Build_id( + OBJECTS_FAKE_OBJECTS_API, + OBJECTS_FAKE_OBJECTS_SCHEDULERS, + _Objects_Local_node, + scheduler_index + 1 + ); +} + /** @} */ #ifdef __cplusplus diff --git a/testsuites/sptests/spscheduler01/init.c b/testsuites/sptests/spscheduler01/init.c index f8c4bb2717..80bdddf133 100644 --- a/testsuites/sptests/spscheduler01/init.c +++ b/testsuites/sptests/spscheduler01/init.c @@ -25,7 +25,11 @@ const char rtems_test_name[] = "SPSCHEDULER 1"; -static rtems_id invalid_id = 1; +#define BLUE rtems_build_name('b', 'l', 'u', 'e') + +#define RED rtems_build_name('r', 'e', 'd', ' ') + +static const rtems_id invalid_id = 1; static void test_task_get_set_affinity(void) { @@ -98,6 +102,27 @@ static void test_task_get_set_affinity(void) #endif /* defined(__RTEMS_HAVE_SYS_CPUSET_H__) */ } +static void test_scheduler_ident(void) +{ + rtems_status_code sc; + rtems_id expected_id = rtems_build_id(7, 1, 1, 1); + rtems_id scheduler_id; + rtems_name name = BLUE; + rtems_name invalid_name = RED; + + sc = rtems_scheduler_ident(name, NULL); + rtems_test_assert(sc == RTEMS_INVALID_ADDRESS); + + sc = rtems_scheduler_ident(invalid_name, &scheduler_id); + rtems_test_assert(sc == RTEMS_INVALID_NAME); + + scheduler_id = 0; + sc = rtems_scheduler_ident(name, &scheduler_id); + rtems_test_assert(sc == RTEMS_SUCCESSFUL); + + rtems_test_assert(scheduler_id == expected_id); +} + static void Init(rtems_task_argument arg) { rtems_resource_snapshot snapshot; @@ -107,6 +132,7 @@ static void Init(rtems_task_argument arg) rtems_resource_snapshot_take(&snapshot); test_task_get_set_affinity(); + test_scheduler_ident(); rtems_test_assert(rtems_resource_snapshot_check(&snapshot)); @@ -125,6 +151,8 @@ static void Init(rtems_task_argument arg) #define CONFIGURE_RTEMS_INIT_TASKS_TABLE +#define CONFIGURE_SCHEDULER_NAME BLUE + #define CONFIGURE_INIT #include -- cgit v1.2.3