diff options
| author | Bjoern Brandenburg <bbb@mpi-sws.org> | 2014-03-19 11:59:03 -0400 |
|---|---|---|
| committer | Bjoern Brandenburg <bbb@mpi-sws.org> | 2014-04-01 13:38:32 -0400 |
| commit | c56eeff06a8e9726fe83797a228b82988f4f8ce2 (patch) | |
| tree | f8454c268c479156d3d7d54acaf54ed600dc839c /tests | |
| parent | ad6403fe186889fd934c7dcb495b1ffb60fae09f (diff) | |
Add add convenience wrapper and tests for the DFLP
Diffstat (limited to 'tests')
| -rw-r--r-- | tests/locks.c | 115 | ||||
| -rw-r--r-- | tests/nesting.c | 98 |
2 files changed, 213 insertions, 0 deletions
diff --git a/tests/locks.c b/tests/locks.c index bc35a8e..d7cfdee 100644 --- a/tests/locks.c +++ b/tests/locks.c | |||
| @@ -110,6 +110,37 @@ TESTCASE(lock_fmlp, PSN_EDF | GSN_EDF | P_FP, | |||
| 110 | SYSCALL( remove(".fmlp_locks") ); | 110 | SYSCALL( remove(".fmlp_locks") ); |
| 111 | } | 111 | } |
| 112 | 112 | ||
| 113 | TESTCASE(lock_dflp, P_FP, | ||
| 114 | "DFLP acquisition and release") | ||
| 115 | { | ||
| 116 | int fd, od, cpu = 1; | ||
| 117 | |||
| 118 | SYSCALL( fd = open(".dflp_locks", O_RDONLY | O_CREAT) ); | ||
| 119 | |||
| 120 | SYSCALL( sporadic_partitioned(ms2ns(10), ms2ns(100), 0) ); | ||
| 121 | SYSCALL( task_mode(LITMUS_RT_TASK) ); | ||
| 122 | |||
| 123 | SYSCALL( od = open_dflp_sem(fd, 0, cpu) ); | ||
| 124 | |||
| 125 | SYSCALL( litmus_lock(od) ); | ||
| 126 | SYSCALL( litmus_unlock(od) ); | ||
| 127 | |||
| 128 | SYSCALL( litmus_lock(od) ); | ||
| 129 | SYSCALL( litmus_unlock(od) ); | ||
| 130 | |||
| 131 | SYSCALL( litmus_lock(od) ); | ||
| 132 | SYSCALL( litmus_unlock(od) ); | ||
| 133 | |||
| 134 | /* tasks may not unlock resources they don't own */ | ||
| 135 | SYSCALL_FAILS(EINVAL, litmus_unlock(od) ); | ||
| 136 | |||
| 137 | SYSCALL( od_close(od) ); | ||
| 138 | |||
| 139 | SYSCALL( close(fd) ); | ||
| 140 | |||
| 141 | SYSCALL( remove(".dflp_locks") ); | ||
| 142 | } | ||
| 143 | |||
| 113 | TESTCASE(srp_lock_mode_change, P_FP | PSN_EDF, | 144 | TESTCASE(srp_lock_mode_change, P_FP | PSN_EDF, |
| 114 | "SRP task becomes non-RT task while holding lock") | 145 | "SRP task becomes non-RT task while holding lock") |
| 115 | { | 146 | { |
| @@ -155,6 +186,50 @@ TESTCASE(srp_lock_mode_change, P_FP | PSN_EDF, | |||
| 155 | SYSCALL( remove(".locks") ); | 186 | SYSCALL( remove(".locks") ); |
| 156 | } | 187 | } |
| 157 | 188 | ||
| 189 | TESTCASE(dflp_lock_mode_change, P_FP, | ||
| 190 | "DFLP task becomes non-RT task while holding lock") | ||
| 191 | { | ||
| 192 | int fd, od, cpu = 0; | ||
| 193 | |||
| 194 | int child, status; | ||
| 195 | |||
| 196 | struct rt_task params; | ||
| 197 | init_rt_task_param(¶ms); | ||
| 198 | params.cpu = 1; | ||
| 199 | params.exec_cost = ms2ns(10000); | ||
| 200 | params.period = ms2ns(100000); | ||
| 201 | params.relative_deadline = params.period; | ||
| 202 | |||
| 203 | SYSCALL( fd = open(".locks", O_RDONLY | O_CREAT, S_IRUSR) ); | ||
| 204 | |||
| 205 | child = FORK_TASK( | ||
| 206 | params.priority = LITMUS_LOWEST_PRIORITY; | ||
| 207 | SYSCALL( set_rt_task_param(gettid(), ¶ms) ); | ||
| 208 | SYSCALL( be_migrate_to_cpu(params.cpu) ); | ||
| 209 | SYSCALL( task_mode(LITMUS_RT_TASK) ); | ||
| 210 | |||
| 211 | SYSCALL( od = open_dflp_sem(fd, 0, cpu) ); | ||
| 212 | |||
| 213 | SYSCALL( litmus_lock(od) ); | ||
| 214 | |||
| 215 | SYSCALL( task_mode(BACKGROUND_TASK) ); | ||
| 216 | |||
| 217 | SYSCALL( litmus_unlock(od) ); | ||
| 218 | |||
| 219 | SYSCALL( od_close(od) ); | ||
| 220 | |||
| 221 | exit(0); | ||
| 222 | ); | ||
| 223 | |||
| 224 | SYSCALL( waitpid(child, &status, 0) ); | ||
| 225 | ASSERT( WIFEXITED(status) ); | ||
| 226 | ASSERT( WEXITSTATUS(status) == 0 ); | ||
| 227 | |||
| 228 | SYSCALL( close(fd) ); | ||
| 229 | |||
| 230 | SYSCALL( remove(".locks") ); | ||
| 231 | } | ||
| 232 | |||
| 158 | TESTCASE(fmlp_lock_mode_change, P_FP | PSN_EDF | GSN_EDF, | 233 | TESTCASE(fmlp_lock_mode_change, P_FP | PSN_EDF | GSN_EDF, |
| 159 | "FMLP task becomes non-RT task while holding lock") | 234 | "FMLP task becomes non-RT task while holding lock") |
| 160 | { | 235 | { |
| @@ -277,3 +352,43 @@ TESTCASE(fmlp_lock_teardown, P_FP | PSN_EDF | GSN_EDF, | |||
| 277 | 352 | ||
| 278 | SYSCALL( remove(".locks") ); | 353 | SYSCALL( remove(".locks") ); |
| 279 | } | 354 | } |
| 355 | |||
| 356 | TESTCASE(dflp_lock_teardown, P_FP, | ||
| 357 | "DFLP task exits while holding lock") | ||
| 358 | { | ||
| 359 | int fd, od, cpu = 0; | ||
| 360 | |||
| 361 | int child, status; | ||
| 362 | |||
| 363 | struct rt_task params; | ||
| 364 | init_rt_task_param(¶ms); | ||
| 365 | params.cpu = 1; | ||
| 366 | params.exec_cost = ms2ns(10000); | ||
| 367 | params.period = ms2ns(100000); | ||
| 368 | params.relative_deadline = params.period; | ||
| 369 | |||
| 370 | SYSCALL( fd = open(".locks", O_RDONLY | O_CREAT, S_IRUSR) ); | ||
| 371 | |||
| 372 | exit(0); | ||
| 373 | |||
| 374 | child = FORK_TASK( | ||
| 375 | params.priority = LITMUS_LOWEST_PRIORITY; | ||
| 376 | SYSCALL( set_rt_task_param(gettid(), ¶ms) ); | ||
| 377 | SYSCALL( be_migrate_to_cpu(params.cpu) ); | ||
| 378 | SYSCALL( task_mode(LITMUS_RT_TASK) ); | ||
| 379 | |||
| 380 | SYSCALL( od = open_dflp_sem(fd, 0, cpu) ); | ||
| 381 | |||
| 382 | SYSCALL( litmus_lock(od) ); | ||
| 383 | exit(123); | ||
| 384 | ); | ||
| 385 | |||
| 386 | SYSCALL( waitpid(child, &status, 0) ); | ||
| 387 | ASSERT( WIFEXITED(status) ); | ||
| 388 | ASSERT( WEXITSTATUS(status) == 123 ); | ||
| 389 | |||
| 390 | SYSCALL( close(fd) ); | ||
| 391 | |||
| 392 | SYSCALL( remove(".locks") ); | ||
| 393 | } | ||
| 394 | |||
diff --git a/tests/nesting.c b/tests/nesting.c index b294334..f8a3f1a 100644 --- a/tests/nesting.c +++ b/tests/nesting.c | |||
| @@ -466,3 +466,101 @@ TESTCASE(dpcp_nesting, P_FP, | |||
| 466 | 466 | ||
| 467 | SYSCALL( remove(".dpcp_locks") ); | 467 | SYSCALL( remove(".dpcp_locks") ); |
| 468 | } | 468 | } |
| 469 | |||
| 470 | TESTCASE(dflp_nesting, P_FP, | ||
| 471 | "DFLP no nesting allowed") | ||
| 472 | { | ||
| 473 | int od, od2; | ||
| 474 | int cpu = 0; | ||
| 475 | |||
| 476 | SYSCALL( sporadic_partitioned(10, 100, 0) ); | ||
| 477 | SYSCALL( task_mode(LITMUS_RT_TASK) ); | ||
| 478 | |||
| 479 | SYSCALL( od = litmus_open_lock(DFLP_SEM, 0, ".dflp_locks", &cpu) ); | ||
| 480 | SYSCALL( od2 = litmus_open_lock(DFLP_SEM, 1, ".dflp_locks", &cpu) ); | ||
| 481 | |||
| 482 | SYSCALL( litmus_lock(od) ); | ||
| 483 | SYSCALL( litmus_unlock(od) ); | ||
| 484 | |||
| 485 | SYSCALL( litmus_lock(od2) ); | ||
| 486 | SYSCALL( litmus_unlock(od2) ); | ||
| 487 | |||
| 488 | SYSCALL( litmus_lock(od) ); | ||
| 489 | SYSCALL_FAILS(EBUSY, litmus_lock(od2)); | ||
| 490 | SYSCALL( litmus_unlock(od) ); | ||
| 491 | |||
| 492 | SYSCALL( litmus_lock(od2) ); | ||
| 493 | SYSCALL_FAILS(EBUSY, litmus_lock(od)); | ||
| 494 | SYSCALL( litmus_unlock(od2) ); | ||
| 495 | |||
| 496 | SYSCALL( od_close(od) ); | ||
| 497 | SYSCALL( od_close(od2) ); | ||
| 498 | |||
| 499 | SYSCALL( remove(".dflp_locks") ); | ||
| 500 | } | ||
| 501 | |||
| 502 | TESTCASE(lock_fmlp_dflp_no_nesting, P_FP, | ||
| 503 | "DFLP and FMLP nesting not allowed") | ||
| 504 | { | ||
| 505 | int od, od2; | ||
| 506 | const char* namespace = ".locks"; | ||
| 507 | int cpu = 0; | ||
| 508 | |||
| 509 | SYSCALL( sporadic_partitioned(10, 100, 0) ); | ||
| 510 | SYSCALL( task_mode(LITMUS_RT_TASK) ); | ||
| 511 | |||
| 512 | SYSCALL( od = litmus_open_lock(DFLP_SEM, 0, namespace, &cpu) ); | ||
| 513 | SYSCALL( od2 = litmus_open_lock(FMLP_SEM, 1, namespace, NULL) ); | ||
| 514 | |||
| 515 | SYSCALL( litmus_lock(od) ); | ||
| 516 | SYSCALL( litmus_unlock(od) ); | ||
| 517 | |||
| 518 | SYSCALL( litmus_lock(od2) ); | ||
| 519 | SYSCALL( litmus_unlock(od2) ); | ||
| 520 | |||
| 521 | SYSCALL( litmus_lock(od) ); | ||
| 522 | SYSCALL_FAILS(EBUSY, litmus_lock(od2)); | ||
| 523 | SYSCALL( litmus_unlock(od) ); | ||
| 524 | |||
| 525 | SYSCALL( litmus_lock(od2) ); | ||
| 526 | SYSCALL_FAILS(EBUSY, litmus_lock(od)); | ||
| 527 | SYSCALL( litmus_unlock(od2) ); | ||
| 528 | |||
| 529 | SYSCALL( od_close(od) ); | ||
| 530 | SYSCALL( od_close(od2) ); | ||
| 531 | |||
| 532 | SYSCALL( remove(namespace) ); | ||
| 533 | } | ||
| 534 | |||
| 535 | TESTCASE(lock_dflp_pcp_no_nesting, P_FP, | ||
| 536 | "PCP and DFLP nesting not allowed") | ||
| 537 | { | ||
| 538 | int od, od2; | ||
| 539 | int cpu = 0; | ||
| 540 | const char* namespace = ".locks"; | ||
| 541 | |||
| 542 | SYSCALL( sporadic_partitioned(10, 100, 0) ); | ||
| 543 | SYSCALL( task_mode(LITMUS_RT_TASK) ); | ||
| 544 | |||
| 545 | SYSCALL( od = litmus_open_lock(PCP_SEM, 0, namespace, NULL) ); | ||
| 546 | SYSCALL( od2 = litmus_open_lock(DFLP_SEM, 1, namespace, &cpu) ); | ||
| 547 | |||
| 548 | SYSCALL( litmus_lock(od) ); | ||
| 549 | SYSCALL( litmus_unlock(od) ); | ||
| 550 | |||
| 551 | SYSCALL( litmus_lock(od2) ); | ||
| 552 | SYSCALL( litmus_unlock(od2) ); | ||
| 553 | |||
| 554 | SYSCALL( litmus_lock(od) ); | ||
| 555 | SYSCALL_FAILS(EBUSY, litmus_lock(od2)); | ||
| 556 | SYSCALL( litmus_unlock(od) ); | ||
| 557 | |||
| 558 | SYSCALL( litmus_lock(od2) ); | ||
| 559 | SYSCALL_FAILS(EBUSY, litmus_lock(od)); | ||
| 560 | SYSCALL( litmus_unlock(od2) ); | ||
| 561 | |||
| 562 | SYSCALL( od_close(od) ); | ||
| 563 | SYSCALL( od_close(od2) ); | ||
| 564 | |||
| 565 | SYSCALL( remove(namespace) ); | ||
| 566 | } | ||
