summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-09 10:09:24 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2014-04-15 09:29:31 +0200
commitb427a92adfd16e8d68b275b44337f54f6ab0a3ca (patch)
tree07d5c10ecb3fec438ef9fcacf9d5960b3e558d9e
parentscore: Add scheduler name (diff)
downloadrtems-b427a92adfd16e8d68b275b44337f54f6ab0a3ca.tar.bz2
rtems: Add scheduler identification
-rw-r--r--cpukit/rtems/Makefile.am1
-rw-r--r--cpukit/rtems/include/rtems/rtems/tasks.h17
-rw-r--r--cpukit/rtems/src/schedulerident.c46
-rw-r--r--cpukit/score/include/rtems/score/object.h3
-rw-r--r--cpukit/score/include/rtems/score/objectimpl.h9
-rw-r--r--cpukit/score/include/rtems/score/schedulerimpl.h10
-rw-r--r--testsuites/sptests/spscheduler01/init.c30
7 files changed, 114 insertions, 2 deletions
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
+ * <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/tasks.h>
+#include <rtems/score/schedulerimpl.h>
+
+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 <rtems/confdefs.h>