[rtems commit] rtems: Add rtems_scheduler_ident_by_processor()

Sebastian Huber sebh at rtems.org
Wed Jul 12 06:01:37 UTC 2017


Module:    rtems
Branch:    master
Commit:    548d65a52b1b90690236756a9bffc308e4d245db
Changeset: http://git.rtems.org/rtems/commit/?id=548d65a52b1b90690236756a9bffc308e4d245db

Author:    Sebastian Huber <sebastian.huber at embedded-brains.de>
Date:      Tue Jul 11 07:24:39 2017 +0200

rtems: Add rtems_scheduler_ident_by_processor()

Update #3069.

---

 cpukit/rtems/Makefile.am                     |  1 +
 cpukit/rtems/include/rtems/rtems/tasks.h     | 17 ++++++++++
 cpukit/rtems/src/scheduleridentbyprocessor.c | 49 ++++++++++++++++++++++++++++
 testsuites/smptests/smpfatal04/init.c        |  6 ++++
 testsuites/sptests/spscheduler01/init.c      | 12 +++++++
 5 files changed, 85 insertions(+)

diff --git a/cpukit/rtems/Makefile.am b/cpukit/rtems/Makefile.am
index ada1f83..e9ad2de 100644
--- a/cpukit/rtems/Makefile.am
+++ b/cpukit/rtems/Makefile.am
@@ -108,6 +108,7 @@ librtems_a_SOURCES += src/taskwakewhen.c
 librtems_a_SOURCES += src/scheduleraddprocessor.c
 librtems_a_SOURCES += src/schedulergetprocessorset.c
 librtems_a_SOURCES += src/schedulerident.c
+librtems_a_SOURCES += src/scheduleridentbyprocessor.c
 librtems_a_SOURCES += src/schedulerremoveprocessor.c
 
 ## RATEMON_C_FILES
diff --git a/cpukit/rtems/include/rtems/rtems/tasks.h b/cpukit/rtems/include/rtems/rtems/tasks.h
index 88e4355..e68c789 100644
--- a/cpukit/rtems/include/rtems/rtems/tasks.h
+++ b/cpukit/rtems/include/rtems/rtems/tasks.h
@@ -560,6 +560,23 @@ rtems_status_code rtems_scheduler_ident(
 );
 
 /**
+ * @brief Identifies a scheduler by a processor index.
+ *
+ * @param[in] cpu_index The processor index.
+ * @param[out] id The scheduler identifier associated with the processor index.
+ *
+ * @retval RTEMS_SUCCESSFUL Successful operation.
+ * @retval RTEMS_INVALID_ADDRESS The @a id parameter is @c NULL.
+ * @retval RTEMS_INVALID_NAME Invalid processor index.
+ * @retval RTEMS_INCORRECT_STATE The processor index is valid, however, this
+ *   processor is not owned by a scheduler.
+ */
+rtems_status_code rtems_scheduler_ident_by_processor(
+  uint32_t  cpu_index,
+  rtems_id *id
+);
+
+/**
  * @brief Gets the set of processors owned by the specified scheduler instance.
  *
  * @param[in] scheduler_id Identifier of the scheduler instance.
diff --git a/cpukit/rtems/src/scheduleridentbyprocessor.c b/cpukit/rtems/src/scheduleridentbyprocessor.c
new file mode 100644
index 0000000..2bc64d7
--- /dev/null
+++ b/cpukit/rtems/src/scheduleridentbyprocessor.c
@@ -0,0 +1,49 @@
+/*
+ * Copyright (c) 2017 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/assert.h>
+#include <rtems/score/schedulerimpl.h>
+
+rtems_status_code rtems_scheduler_ident_by_processor(
+  uint32_t  cpu_index,
+  rtems_id *id
+)
+{
+  const Scheduler_Control *scheduler;
+
+  if ( id == NULL ) {
+    return RTEMS_INVALID_ADDRESS;
+  }
+
+  if ( cpu_index >= _SMP_Get_processor_count() ) {
+    return RTEMS_INVALID_NAME;
+  }
+
+  scheduler = _Scheduler_Get_by_CPU( _Per_CPU_Get_by_index( cpu_index ) );
+#if defined(RTEMS_SMP)
+  if ( scheduler == NULL ) {
+    return RTEMS_INCORRECT_STATE;
+  }
+#else
+  _Assert( scheduler != NULL );
+#endif
+
+  *id = _Scheduler_Build_id( _Scheduler_Get_index( scheduler ) );
+  return RTEMS_SUCCESSFUL;
+}
diff --git a/testsuites/smptests/smpfatal04/init.c b/testsuites/smptests/smpfatal04/init.c
index 0215914..73ef701 100644
--- a/testsuites/smptests/smpfatal04/init.c
+++ b/testsuites/smptests/smpfatal04/init.c
@@ -45,6 +45,12 @@ static void fatal_extension(
       && !always_set_to_false
       && code == SMP_FATAL_BOOT_PROCESSOR_NOT_ASSIGNED_TO_SCHEDULER
   ) {
+    rtems_status_code sc;
+    rtems_id id;
+
+    sc = rtems_scheduler_ident_by_processor(0, &id);
+    assert(sc == RTEMS_INCORRECT_STATE);
+
     TEST_END();
   }
 }
diff --git a/testsuites/sptests/spscheduler01/init.c b/testsuites/sptests/spscheduler01/init.c
index 9bdfacc..2415ace 100644
--- a/testsuites/sptests/spscheduler01/init.c
+++ b/testsuites/sptests/spscheduler01/init.c
@@ -355,6 +355,18 @@ static void test_scheduler_ident(void)
   rtems_test_assert(sc == RTEMS_SUCCESSFUL);
 
   rtems_test_assert(scheduler_id == expected_id);
+
+  sc = rtems_scheduler_ident_by_processor(1, NULL);
+  rtems_test_assert(sc == RTEMS_INVALID_ADDRESS);
+
+  sc = rtems_scheduler_ident_by_processor(1, &scheduler_id);
+  rtems_test_assert(sc == RTEMS_INVALID_NAME);
+
+  scheduler_id = 0;
+  sc = rtems_scheduler_ident_by_processor(0, &scheduler_id);
+  rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+  rtems_test_assert(scheduler_id == expected_id);
 }
 
 static void test_scheduler_get_processors(void)




More information about the vc mailing list