aboutsummaryrefslogtreecommitdiffstats
path: root/tests/locks.c
diff options
context:
space:
mode:
Diffstat (limited to 'tests/locks.c')
-rw-r--r--tests/locks.c110
1 files changed, 110 insertions, 0 deletions
diff --git a/tests/locks.c b/tests/locks.c
new file mode 100644
index 0000000..65b932a
--- /dev/null
+++ b/tests/locks.c
@@ -0,0 +1,110 @@
1#include <fcntl.h>
2#include <unistd.h>
3#include <stdio.h>
4
5#include "tests.h"
6#include "litmus.h"
7
8
9TESTCASE(not_lock_fmlp_be, GSN_EDF | PSN_EDF,
10 "don't let best-effort tasks lock FMLP semaphores")
11{
12 int fd, od;
13
14 SYSCALL( fd = open(".fmlp_locks", O_RDONLY | O_CREAT) );
15
16 SYSCALL( od = open_fmlp_sem(fd, 0) );
17
18 /* BE tasks may not lock FMLP semaphores */
19 SYSCALL_FAILS(EPERM, litmus_lock(od) );
20
21 /* tasks may not unlock resources they don't own */
22 SYSCALL_FAILS(EINVAL, litmus_unlock(od) );
23
24 SYSCALL( od_close(od) );
25
26 SYSCALL( close(fd) );
27
28 SYSCALL( remove(".fmlp_locks") );
29
30}
31
32TESTCASE(not_lock_srp_be, PSN_EDF,
33 "don't let best-effort tasks open SRP semaphores")
34{
35 int fd, od;
36
37 SYSCALL( fd = open(".srp_locks", O_RDONLY | O_CREAT) );
38
39 /* BE tasks may not open SRP semaphores */
40
41 SYSCALL_FAILS(EPERM, od = open_srp_sem(fd, 0) );
42
43 SYSCALL( close(fd) );
44
45 SYSCALL( remove(".srp_locks") );
46
47}
48
49TESTCASE(lock_srp, PSN_EDF,
50 "SRP acquisition and release")
51{
52 int fd, od;
53
54 SYSCALL( fd = open(".srp_locks", O_RDONLY | O_CREAT) );
55
56 SYSCALL( sporadic_partitioned(10, 100, 0) );
57 SYSCALL( task_mode(LITMUS_RT_TASK) );
58
59 SYSCALL( od = open_srp_sem(fd, 0) );
60
61 SYSCALL( litmus_lock(od) );
62 SYSCALL( litmus_unlock(od) );
63
64 SYSCALL( litmus_lock(od) );
65 SYSCALL( litmus_unlock(od) );
66
67 SYSCALL( litmus_lock(od) );
68 SYSCALL( litmus_unlock(od) );
69
70 /* tasks may not unlock resources they don't own */
71 SYSCALL_FAILS(EINVAL, litmus_unlock(od) );
72
73 SYSCALL( od_close(od) );
74
75 SYSCALL( close(fd) );
76
77 SYSCALL( remove(".srp_locks") );
78}
79
80
81TESTCASE(lock_fmlp, PSN_EDF | GSN_EDF,
82 "FMLP acquisition and release")
83{
84 int fd, od;
85
86 SYSCALL( fd = open(".fmlp_locks", O_RDONLY | O_CREAT) );
87
88 SYSCALL( sporadic_partitioned(10, 100, 0) );
89 SYSCALL( task_mode(LITMUS_RT_TASK) );
90
91 SYSCALL( od = open_fmlp_sem(fd, 0) );
92
93 SYSCALL( litmus_lock(od) );
94 SYSCALL( litmus_unlock(od) );
95
96 SYSCALL( litmus_lock(od) );
97 SYSCALL( litmus_unlock(od) );
98
99 SYSCALL( litmus_lock(od) );
100 SYSCALL( litmus_unlock(od) );
101
102 /* tasks may not unlock resources they don't own */
103 SYSCALL_FAILS(EINVAL, litmus_unlock(od) );
104
105 SYSCALL( od_close(od) );
106
107 SYSCALL( close(fd) );
108
109 SYSCALL( remove(".fmlp_locks") );
110}