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 | } | ||