aboutsummaryrefslogtreecommitdiffstats
path: root/tests
diff options
context:
space:
mode:
authorBjoern Brandenburg <bbb@mpi-sws.org>2014-03-19 11:59:03 -0400
committerBjoern Brandenburg <bbb@mpi-sws.org>2014-04-01 13:38:32 -0400
commitc56eeff06a8e9726fe83797a228b82988f4f8ce2 (patch)
treef8454c268c479156d3d7d54acaf54ed600dc839c /tests
parentad6403fe186889fd934c7dcb495b1ffb60fae09f (diff)
Add add convenience wrapper and tests for the DFLP
Diffstat (limited to 'tests')
-rw-r--r--tests/locks.c115
-rw-r--r--tests/nesting.c98
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
113TESTCASE(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
113TESTCASE(srp_lock_mode_change, P_FP | PSN_EDF, 144TESTCASE(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
189TESTCASE(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(&params);
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(), &params) );
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
158TESTCASE(fmlp_lock_mode_change, P_FP | PSN_EDF | GSN_EDF, 233TESTCASE(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
356TESTCASE(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(&params);
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(), &params) );
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
470TESTCASE(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
502TESTCASE(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
535TESTCASE(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}