summaryrefslogtreecommitdiffstats
path: root/testsuites/smptests/smpscheduler02
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2016-10-31 13:08:33 +0100
committerSebastian Huber <sebastian.huber@embedded-brains.de>2016-11-10 09:22:09 +0100
commit05ca53ddf6bc8333c2f3ad861c5415467c3262d2 (patch)
tree9b011af47a8304527c77ba8992418e473f540ecf /testsuites/smptests/smpscheduler02
parentscore: Add and use Thread_Control::is_idle (diff)
downloadrtems-05ca53ddf6bc8333c2f3ad861c5415467c3262d2.tar.bz2
rtems: Add scheduler processor add/remove
Update #2797.
Diffstat (limited to 'testsuites/smptests/smpscheduler02')
-rw-r--r--testsuites/smptests/smpscheduler02/init.c130
1 files changed, 130 insertions, 0 deletions
diff --git a/testsuites/smptests/smpscheduler02/init.c b/testsuites/smptests/smpscheduler02/init.c
index 1492d4c881..082bd21cd4 100644
--- a/testsuites/smptests/smpscheduler02/init.c
+++ b/testsuites/smptests/smpscheduler02/init.c
@@ -37,6 +37,8 @@ static rtems_id cmtx_id;
static rtems_id imtx_id;
+static volatile bool ready;
+
static void task(rtems_task_argument arg)
{
rtems_status_code sc;
@@ -67,6 +69,131 @@ static void task(rtems_task_argument arg)
}
}
+static void sticky_task(rtems_task_argument arg)
+{
+ rtems_status_code sc;
+ rtems_id mtx_id;
+
+ (void) arg;
+
+ rtems_test_assert(rtems_get_current_processor() == 0);
+
+ sc = rtems_semaphore_create(
+ rtems_build_name(' ', 'M', 'T', 'X'),
+ 1,
+ RTEMS_BINARY_SEMAPHORE | RTEMS_MULTIPROCESSOR_RESOURCE_SHARING,
+ 2,
+ &mtx_id
+ );
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_semaphore_obtain(mtx_id, RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ ready = true;
+
+ sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_semaphore_release(mtx_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_semaphore_delete(mtx_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_event_transient_send(main_task_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ while (1) {
+ /* Do nothing */
+ }
+}
+
+static void test_scheduler_add_remove_processors(void)
+{
+ rtems_status_code sc;
+ rtems_id scheduler_a_id;
+ rtems_id scheduler_c_id;
+
+ sc = rtems_scheduler_ident(SCHED_A, &scheduler_a_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_scheduler_ident(SCHED_C, &scheduler_c_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_scheduler_add_processor(scheduler_c_id, 62);
+ rtems_test_assert(sc == RTEMS_NOT_CONFIGURED);
+
+ sc = rtems_scheduler_add_processor(scheduler_c_id, 63);
+ rtems_test_assert(sc == RTEMS_INCORRECT_STATE);
+
+ sc = rtems_scheduler_remove_processor(scheduler_c_id, 62);
+ rtems_test_assert(sc == RTEMS_INVALID_NUMBER);
+
+ sc = rtems_scheduler_remove_processor(scheduler_a_id, 0);
+ rtems_test_assert(sc == RTEMS_RESOURCE_IN_USE);
+
+ if (rtems_get_processor_count() > 1) {
+ rtems_id scheduler_b_id;
+ rtems_id task_id;
+
+ sc = rtems_scheduler_ident(SCHED_B, &scheduler_b_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_scheduler_remove_processor(scheduler_b_id, 1);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_scheduler_add_processor(scheduler_a_id, 1);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ rtems_test_assert(rtems_get_current_processor() == 0);
+
+ sc = rtems_scheduler_remove_processor(scheduler_a_id, 0);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ rtems_test_assert(rtems_get_current_processor() == 1);
+
+ sc = rtems_scheduler_add_processor(scheduler_a_id, 0);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ rtems_test_assert(rtems_get_current_processor() == 1);
+
+ sc = rtems_task_create(
+ rtems_build_name('T', 'A', 'S', 'K'),
+ 2,
+ RTEMS_MINIMUM_STACK_SIZE,
+ RTEMS_DEFAULT_MODES,
+ RTEMS_DEFAULT_ATTRIBUTES,
+ &task_id
+ );
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_task_start(task_id, sticky_task, 0);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ while (!ready) {
+ /* Wait */
+ }
+
+ sc = rtems_scheduler_remove_processor(scheduler_a_id, 1);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ rtems_test_assert(rtems_get_current_processor() == 0);
+
+ sc = rtems_event_transient_send(task_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_event_transient_receive(RTEMS_WAIT, RTEMS_NO_TIMEOUT);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_task_delete(task_id);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ sc = rtems_scheduler_add_processor(scheduler_b_id, 1);
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+ }
+}
+
static void test(void)
{
rtems_status_code sc;
@@ -248,6 +375,8 @@ static void test(void)
sc = rtems_semaphore_delete(imtx_id);
rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+
+ test_scheduler_add_remove_processors();
}
static void Init(rtems_task_argument arg)
@@ -271,6 +400,7 @@ static void Init(rtems_task_argument arg)
#define CONFIGURE_MAXIMUM_TASKS 2
#define CONFIGURE_MAXIMUM_SEMAPHORES 2
+#define CONFIGURE_MAXIMUM_MRSP_SEMAPHORES 1
#define CONFIGURE_SMP_APPLICATION