[PATCH 2/4] rtems: Add scheduler identification

Joel Sherrill Joel.Sherrill at OARcorp.com
Wed Apr 9 11:44:34 UTC 2014


I have a number of concerns about this.

The gap in the object type in the enum is very inconsistent with the other ids. Does it negatively impact the object class tables?

Does it negatively impact the RTEMS object services at the API level? Remember there are rtems_object services which work universally on any id. I think you are breaking the orthogonality of them.

What is the intended use case?

Where is documentation?

I assume this is part of having multiple  schedulers but you are basically tossing unjustified code over the wall without giving us a plan. I have no idea why the code is desirable based on what you have said.  And it breaks the uniform use of IDs.

--joel

On Apr 9, 2014 6:30 AM, Sebastian Huber <sebastian.huber at embedded-brains.de> wrote:
---
 cpukit/rtems/Makefile.am                         |    2 +
 cpukit/rtems/include/rtems/rtems/tasks.h         |   36 +++++++++++++++++
 cpukit/rtems/src/schedulerident.c                |   46 ++++++++++++++++++++++
 cpukit/rtems/src/scheduleridentbyindex.c         |   41 +++++++++++++++++++
 cpukit/score/include/rtems/score/objectimpl.h    |    5 ++-
 cpukit/score/include/rtems/score/schedulerimpl.h |   10 +++++
 testsuites/sptests/spscheduler01/init.c          |   36 +++++++++++++++++
 7 files changed, 175 insertions(+), 1 deletions(-)
 create mode 100644 cpukit/rtems/src/schedulerident.c
 create mode 100644 cpukit/rtems/src/scheduleridentbyindex.c

diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am
index 70a8855..3962fa9 100644
--- a/cpukit/rtems/Makefile.am
+++ b/cpukit/rtems/Makefile.am
@@ -116,6 +116,8 @@ 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
+librtems_a_SOURCES += src/scheduleridentbyindex.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 4da32c4..fb0869e 100644
--- a/cpukit/rtems/include/rtems/rtems/tasks.h
+++ b/cpukit/rtems/include/rtems/rtems/tasks.h
@@ -548,6 +548,42 @@ 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
+);
+
+/**
+ * @brief Identifies a scheduler by its index.
+ *
+ * The scheduler index is determined by the scheduler configuration.
+ *
+ * @param[in] scheduler_index The scheduler index.  The scheduler index ranges
+ * from zero to the scheduler count minus one.  This is in contrast to object
+ * indices, which start with one.
+ * @param[out] id The scheduler identifier associated with the scheduler index.
+ *
+ * @retval RTEMS_SUCCESSFUL Successful operation.
+ * @retval RTEMS_INVALID_ADDRESS The @a id parameter is @c NULL.
+ * @retval RTEMS_INVALID_NAME Invalid scheduler index.
+ */
+rtems_status_code rtems_scheduler_ident_by_index(
+  uint32_t  scheduler_index,
+  rtems_id *id
+);
+
 /**@}*/

 /**
diff --git a/cpukit/rtems/src/schedulerident.c b/cpukit/rtems/src/schedulerident.c
new file mode 100644
index 0000000..d9e913c
--- /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 at 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/rtems/src/scheduleridentbyindex.c b/cpukit/rtems/src/scheduleridentbyindex.c
new file mode 100644
index 0000000..66cd222
--- /dev/null
+++ b/cpukit/rtems/src/scheduleridentbyindex.c
@@ -0,0 +1,41 @@
+/*
+ * Copyright (c) 2014 embedded brains GmbH.  All rights reserved.
+ *
+ *  embedded brains GmbH
+ *  Dornierstr. 4
+ *  82178 Puchheim
+ *  Germany
+ *  <rtems at 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_by_index(
+  uint32_t  scheduler_index,
+  rtems_id *id
+)
+{
+  rtems_status_code sc;
+
+  if ( id != NULL ) {
+    if ( scheduler_index < _Scheduler_Count ) {
+      *id = _Scheduler_Build_id( scheduler_index );
+      sc = RTEMS_SUCCESSFUL;
+    } else {
+      sc = RTEMS_INVALID_NAME;
+    }
+  } else {
+    sc = RTEMS_INVALID_ADDRESS;
+  }
+
+  return sc;
+}
diff --git a/cpukit/score/include/rtems/score/objectimpl.h b/cpukit/score/include/rtems/score/objectimpl.h
index 383f0a7..e47c6a8 100644
--- a/cpukit/score/include/rtems/score/objectimpl.h
+++ b/cpukit/score/include/rtems/score/objectimpl.h
@@ -71,7 +71,10 @@ typedef enum {
   OBJECTS_RTEMS_PORTS          = 7,
   OBJECTS_RTEMS_PERIODS        = 8,
   OBJECTS_RTEMS_EXTENSIONS     = 9,
-  OBJECTS_RTEMS_BARRIERS       = 10
+  OBJECTS_RTEMS_BARRIERS       = 10,
+
+  /* The schedulers are no real objects, but they have an object identifier */
+  OBJECTS_RTEMS_SCHEDULERS     = 31
 } Objects_Classic_API;

 /** This macro is used to generically specify the last API index. */
diff --git a/cpukit/score/include/rtems/score/schedulerimpl.h b/cpukit/score/include/rtems/score/schedulerimpl.h
index abad068..e94c048 100644
--- a/cpukit/score/include/rtems/score/schedulerimpl.h
+++ b/cpukit/score/include/rtems/score/schedulerimpl.h
@@ -441,6 +441,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_CLASSIC_API,
+    OBJECTS_RTEMS_SCHEDULERS,
+    _Objects_Local_node,
+    scheduler_index + 1
+  );
+}
+
 /** @} */

 #ifdef __cplusplus
diff --git a/testsuites/sptests/spscheduler01/init.c b/testsuites/sptests/spscheduler01/init.c
index f8c4bb2..4452f60 100644
--- a/testsuites/sptests/spscheduler01/init.c
+++ b/testsuites/sptests/spscheduler01/init.c
@@ -98,6 +98,39 @@ 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(2, 31, 1, 1);
+  rtems_id scheduler_id;
+  rtems_name name = rtems_build_name('b', 'l', 'u', 'e');
+  rtems_name invalid_name = rtems_build_name(' ', 'r', 'e', 'd');
+
+  sc = rtems_scheduler_ident(name, NULL);
+  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
+
+  sc = rtems_scheduler_ident_by_index(0, NULL);
+  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
+
+  sc = rtems_scheduler_ident(invalid_name, &scheduler_id);
+  rtems_test_assert(sc == RTEMS_INVALID_NAME);
+
+  sc = rtems_scheduler_ident_by_index(1, &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);
+
+  scheduler_id = 0;
+  sc = rtems_scheduler_ident_by_index(0, &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 +140,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 +159,8 @@ static void Init(rtems_task_argument arg)

 #define CONFIGURE_RTEMS_INIT_TASKS_TABLE

+#define CONFIGURE_SCHEDULER_NAME rtems_build_name('b', 'l', 'u', 'e')
+
 #define CONFIGURE_INIT

 #include <rtems/confdefs.h>
--
1.7.7

_______________________________________________
rtems-devel mailing list
rtems-devel at rtems.org
http://www.rtems.org/mailman/listinfo/rtems-devel
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.rtems.org/pipermail/devel/attachments/20140409/2fd4f0ef/attachment-0001.html>


More information about the devel mailing list