pps_fetch: introduce a helper to handle timeouts
[dragonfly.git] / test / cocci / unlock_return.cocci
blobecc380a51c4b63e9a4eec2d837a97543e38c822e
1 //
2 // Look for missing lock releases before returning from an error path.
3 //
4 // Target: DragonFly
5 // Copyright:  2012 - LIP6/INRIA
6 // License:  Licensed under ISC. See LICENSE or http://www.isc.org/software/license
7 // Author: Julia Lawall <Julia.Lawall@lip6.fr>
8 //         (original code, adapted for DragonFly by swildner)
9 // URL: http://coccinelle.lip6.fr/ 
10 // URL: http://coccinellery.org/ 
12 // Applies to kernel code.
14 // NOTES
15 // -----
16 // * The results of running this patch have to be carefully reviewed.
17 //   Some functions legally return with the lock held, even if the
18 //   below pattern matches. Some other functions begin with the lock
19 //   held, only to release and then reacquire it again.
21 // * Consider using -timeout because it might run a long time
22 //   (indefinitely?) on some files.
25 // ACPI_SERIAL_BEGIN(...) / ACPI_SERIAL_END(...)
27 @rcu_ACPI_SERIAL_BEGIN exists@
28 position p1;
29 expression E;
32 ACPI_SERIAL_BEGIN@p1(E);
33 ...
34 ACPI_SERIAL_END(E);
36 @exists@
37 position rcu_ACPI_SERIAL_BEGIN.p1;
38 expression E;
41 *ACPI_SERIAL_BEGIN@p1(E);
42 ... when != ACPI_SERIAL_END(E);
43 ?*return ...;
45 // crit_enter() / crit_exit()
47 @rcu_crit_enter exists@
48 position p1;
51 crit_enter@p1();
52 ...
53 crit_exit();
55 @exists@
56 position rcu_crit_enter.p1;
59 *crit_enter@p1();
60 ... when != crit_exit();
61 ?*return ...;
63 // get_mplock() / rel_mplock()
65 @rcu_get_mplock exists@
66 position p1;
69 get_mplock@p1();
70 ...
71 rel_mplock();
73 @exists@
74 position rcu_get_mplock.p1;
77 *get_mplock@p1();
78 ... when != rel_mplock();
79 ?*return ...;
81 // lockmgr(..., {LK_EXCLUSIVE,LK_SHARED}) / lockmgr(..., LK_RELEASE)
83 @rcu_lockmgr exists@
84 position p1;
85 expression E;
88 lockmgr@p1(E,\(LK_SHARED\|LK_EXCLUSIVE\));
89 ...
90 lockmgr(E,LK_RELEASE);
92 @exists@
93 position rcu_lockmgr.p1;
94 expression E;
97 *lockmgr@p1(E,\(LK_SHARED\|LK_EXCLUSIVE\));
98 ... when != lockmgr(E,LK_RELEASE);
99 ?*return ...;
101 // lwkt_gettoken(...) / lwkt_reltoken(...)
103 @rcu_lwkt_gettoken exists@
104 position p1;
105 expression E;
108 lwkt_gettoken@p1(E);
110 lwkt_reltoken(E);
112 @exists@
113 position rcu_lwkt_gettoken.p1;
114 expression E;
117 *lwkt_gettoken@p1(E);
118 ... when != lwkt_reltoken(E);
119 ?*return ...;
121 // lwkt_serialize_enter(...) / lwkt_serialize_exit(...)
123 @rcu_lwkt_serialize_enter exists@
124 position p1;
125 expression E;
128 lwkt_serialize_enter@p1(E);
130 lwkt_serialize_exit(E);
132 @exists@
133 position rcu_lwkt_serialize_enter.p1;
134 expression E;
137 *lwkt_serialize_enter@p1(E);
138 ... when != lwkt_serialize_exit(E);
139 ?*return ...;
141 // nlookup_init(...) / nlookup_done(...)
143 @rcu_nlookup_init exists@
144 position p1;
145 expression E;
148 nlookup_init@p1(E,...);
150 nlookup_done(E);
152 @exists@
153 position rcu_nlookup_init.p1;
154 expression E;
157 *nlookup_init@p1(E,...);
158 ... when != nlookup_done(E);
159 ?*return ...;
161 // spin_lock(...) / spin_unlock(...)
163 @rcu_spin_lock exists@
164 position p1;
165 expression E;
168 spin_lock@p1(E);
170 spin_unlock(E);
172 @exists@
173 position rcu_spin_lock.p1;
174 expression E;
177 *spin_lock@p1(E);
178 ... when != spin_unlock(E);
179 ?*return ...;
181 // vm_object_hold(...) / vm_object_drop(...)
183 @rcu_vm_object_hold exists@
184 position p1;
185 expression E;
188 vm_object_hold@p1(E);
190 vm_object_drop(E);
192 @exists@
193 position rcu_vm_object_hold.p1;
194 expression E;
197 *vm_object_hold@p1(E);
198 ... when != vm_object_drop(E);
199 ?*return ...;
201 // vn_lock(...) / vn_unlock(...)
203 @rcu_vn_lock exists@
204 position p1;
205 expression E;
209 vn_lock@p1(E,...);
211 vget@p1(E);
215 vn_unlock(E);
217 vput(E);
220 @exists@
221 position rcu_vn_lock.p1;
222 expression E;
226 *vn_lock@p1(E,...);
228 *vget@p1(E);
230 ... when != \(vn_unlock\|vput\)(E);
231 ?*return ...;
233 // wlan_serialize_enter() / wlan_serialize_exit()
235 @rcu_wlan_serialize_enter exists@
236 position p1;
239 wlan_serialize_enter@p1();
241 wlan_serialize_exit();
243 @exists@
244 position rcu_wlan_serialize_enter.p1;
247 *wlan_serialize_enter@p1();
248 ... when != wlan_serialize_exit();
249 ?*return ...;