xref: /illumos-gate/usr/src/tools/smatch/src/validation/sm_locking2.c (revision 1f5207b7604fb44407eb4342aff613f7c4508508)
1*1f5207b7SJohn Levon void _spin_lock(int name);
2*1f5207b7SJohn Levon void _spin_unlock(int name);
3*1f5207b7SJohn Levon int _spin_trylock(int name);
4*1f5207b7SJohn Levon 
5*1f5207b7SJohn Levon int a;
6*1f5207b7SJohn Levon int b;
7*1f5207b7SJohn Levon int func (void)
8*1f5207b7SJohn Levon {
9*1f5207b7SJohn Levon 	int mylock = 1;
10*1f5207b7SJohn Levon 	int mylock2 = 1;
11*1f5207b7SJohn Levon 	int mylock3 = 1;
12*1f5207b7SJohn Levon 
13*1f5207b7SJohn Levon 	if (!_spin_trylock(mylock)) {
14*1f5207b7SJohn Levon 		return;
15*1f5207b7SJohn Levon 	}
16*1f5207b7SJohn Levon 
17*1f5207b7SJohn Levon 	_spin_unlock(mylock);
18*1f5207b7SJohn Levon 	_spin_unlock(mylock2);
19*1f5207b7SJohn Levon 
20*1f5207b7SJohn Levon 	if (a)
21*1f5207b7SJohn Levon 		_spin_unlock(mylock);
22*1f5207b7SJohn Levon 	_spin_lock(mylock2);
23*1f5207b7SJohn Levon 
24*1f5207b7SJohn Levon 	if (!_spin_trylock(mylock3))
25*1f5207b7SJohn Levon 		return;
26*1f5207b7SJohn Levon 	return;
27*1f5207b7SJohn Levon }
28*1f5207b7SJohn Levon /*
29*1f5207b7SJohn Levon  * check-name: Smatch locking #2
30*1f5207b7SJohn Levon  * check-command: smatch --project=kernel sm_locking2.c
31*1f5207b7SJohn Levon  *
32*1f5207b7SJohn Levon  * check-output-start
33*1f5207b7SJohn Levon sm_locking2.c:21 func() error: double unlock 'spin_lock:mylock'
34*1f5207b7SJohn Levon sm_locking2.c:26 func() warn: inconsistent returns 'spin_lock:mylock3'.
35*1f5207b7SJohn Levon   Locked on:   line 26
36*1f5207b7SJohn Levon   Unlocked on: line 14
37*1f5207b7SJohn Levon                line 25
38*1f5207b7SJohn Levon  * check-output-end
39*1f5207b7SJohn Levon  */
40