summaryrefslogtreecommitdiffstats
path: root/testsuites
diff options
context:
space:
mode:
authorSebastian Huber <sebastian.huber@embedded-brains.de>2015-09-03 10:27:16 +0200
committerSebastian Huber <sebastian.huber@embedded-brains.de>2015-09-04 13:26:17 +0200
commitdafa5d88435853809040761b79ab9d8f2217281b (patch)
tree35d9d87cbe8d00279cc3fa905792569937ed7fea /testsuites
parentscore: Implement SMP-specific priority queue (diff)
downloadrtems-dafa5d88435853809040761b79ab9d8f2217281b.tar.bz2
score: Implement priority boosting
Diffstat (limited to 'testsuites')
-rw-r--r--testsuites/smptests/smpmutex01/init.c61
1 files changed, 56 insertions, 5 deletions
diff --git a/testsuites/smptests/smpmutex01/init.c b/testsuites/smptests/smpmutex01/init.c
index 1b2a1895ef..80b16fec90 100644
--- a/testsuites/smptests/smpmutex01/init.c
+++ b/testsuites/smptests/smpmutex01/init.c
@@ -26,7 +26,7 @@ const char rtems_test_name[] = "SMPMUTEX 1";
#define PART_COUNT 2
-#define TASK_COUNT 8
+#define TASK_COUNT 9
typedef enum {
REQ_WAKE_UP_MASTER = RTEMS_EVENT_0,
@@ -43,7 +43,8 @@ typedef enum {
B_4,
B_5_0,
B_5_1,
- H,
+ H_A,
+ H_B,
NONE
} task_id;
@@ -111,15 +112,21 @@ static rtems_event_set wait_for_events(void)
return events;
}
-static void sync_with_helper(test_context *ctx)
+static void sync_with_helper_by_id(test_context *ctx, task_id id)
{
rtems_event_set events;
- send_event(ctx, H, REQ_WAKE_UP_HELPER);
+ send_event(ctx, id, REQ_WAKE_UP_HELPER);
events = wait_for_events();
rtems_test_assert(events == REQ_WAKE_UP_MASTER);
}
+static void sync_with_helper(test_context *ctx)
+{
+ sync_with_helper_by_id(ctx, H_A);
+ sync_with_helper_by_id(ctx, H_B);
+}
+
static void request(test_context *ctx, task_id id, request_id req)
{
send_event(ctx, id, req);
@@ -159,6 +166,24 @@ static void check_generations(test_context *ctx, task_id a, task_id b)
}
}
+static void assert_prio(
+ test_context *ctx,
+ task_id id,
+ rtems_task_priority expected
+)
+{
+ rtems_task_priority actual;
+ rtems_status_code sc;
+
+ sc = rtems_task_set_priority(
+ ctx->tasks[id],
+ RTEMS_CURRENT_PRIORITY,
+ &actual
+ );
+ rtems_test_assert(sc == RTEMS_SUCCESSFUL);
+ rtems_test_assert(expected == actual);
+}
+
static void helper(rtems_task_argument arg)
{
test_context *ctx = &test_instance;
@@ -202,7 +227,8 @@ static void test(void)
start_task(ctx, B_4, worker, 4, SCHED_B);
start_task(ctx, B_5_0, worker, 5, SCHED_B);
start_task(ctx, B_5_1, worker, 5, SCHED_B);
- start_task(ctx, H, helper, 6, SCHED_B);
+ start_task(ctx, H_A, helper, 3, SCHED_A);
+ start_task(ctx, H_B, helper, 6, SCHED_B);
sc = rtems_semaphore_create(
rtems_build_name(' ', 'M', 'T', 'X'),
@@ -216,8 +242,10 @@ static void test(void)
obtain(ctx);
request(ctx, A_1, REQ_MTX_OBTAIN);
check_generations(ctx, NONE, NONE);
+ assert_prio(ctx, M, 1);
release(ctx);
check_generations(ctx, A_1, NONE);
+ assert_prio(ctx, M, 3);
request(ctx, A_1, REQ_MTX_RELEASE);
check_generations(ctx, A_1, NONE);
@@ -226,8 +254,11 @@ static void test(void)
request(ctx, A_1, REQ_MTX_OBTAIN);
request(ctx, A_2_1, REQ_MTX_OBTAIN);
check_generations(ctx, NONE, NONE);
+ assert_prio(ctx, M, 1);
release(ctx);
check_generations(ctx, A_1, NONE);
+ assert_prio(ctx, M, 3);
+ assert_prio(ctx, A_1, 1);
request(ctx, A_1, REQ_MTX_RELEASE);
check_generations(ctx, A_1, A_2_0);
request(ctx, A_2_0, REQ_MTX_RELEASE);
@@ -240,8 +271,10 @@ static void test(void)
request(ctx, B_4, REQ_MTX_OBTAIN);
request(ctx, B_5_1, REQ_MTX_OBTAIN);
check_generations(ctx, NONE, NONE);
+ assert_prio(ctx, M, 0);
release(ctx);
sync_with_helper(ctx);
+ assert_prio(ctx, M, 3);
check_generations(ctx, B_4, NONE);
request(ctx, B_4, REQ_MTX_RELEASE);
check_generations(ctx, B_4, B_5_0);
@@ -252,26 +285,44 @@ static void test(void)
obtain(ctx);
request(ctx, A_2_0, REQ_MTX_OBTAIN);
+ check_generations(ctx, NONE, NONE);
+ assert_prio(ctx, M, 2);
request(ctx, B_5_0, REQ_MTX_OBTAIN);
+ check_generations(ctx, NONE, NONE);
+ assert_prio(ctx, M, 0);
request(ctx, B_5_1, REQ_MTX_OBTAIN);
request(ctx, B_4, REQ_MTX_OBTAIN);
request(ctx, A_2_1, REQ_MTX_OBTAIN);
request(ctx, A_1, REQ_MTX_OBTAIN);
check_generations(ctx, NONE, NONE);
release(ctx);
+ sync_with_helper(ctx);
check_generations(ctx, A_1, NONE);
+ assert_prio(ctx, M, 3);
+ assert_prio(ctx, A_1, 0);
request(ctx, A_1, REQ_MTX_RELEASE);
check_generations(ctx, A_1, B_4);
+ assert_prio(ctx, A_1, 1);
+ assert_prio(ctx, B_4, 0);
request(ctx, B_4, REQ_MTX_RELEASE);
check_generations(ctx, B_4, A_2_0);
+ assert_prio(ctx, B_4, 4);
+ assert_prio(ctx, A_2_0, 0);
request(ctx, A_2_0, REQ_MTX_RELEASE);
check_generations(ctx, A_2_0, B_5_0);
+ assert_prio(ctx, A_2_0, 2);
+ assert_prio(ctx, B_5_0, 0);
request(ctx, B_5_0, REQ_MTX_RELEASE);
check_generations(ctx, B_5_0, A_2_1);
+ assert_prio(ctx, B_5_0, 5);
+ assert_prio(ctx, A_2_1, 0);
request(ctx, A_2_1, REQ_MTX_RELEASE);
check_generations(ctx, A_2_1, B_5_1);
+ assert_prio(ctx, A_2_1, 2);
+ assert_prio(ctx, B_5_1, 5);
request(ctx, B_5_1, REQ_MTX_RELEASE);
check_generations(ctx, B_5_1, NONE);
+ assert_prio(ctx, B_5_1, 5);
}
static void Init(rtems_task_argument arg)