11f5207b7SJohn Levon int _spin_trylock(int name); 21f5207b7SJohn Levon void _spin_lock(int name); 31f5207b7SJohn Levon void _spin_unlock(int name); 41f5207b7SJohn Levon func(void)51f5207b7SJohn Levonint func (void) 61f5207b7SJohn Levon { 71f5207b7SJohn Levon int mylock = 1; 81f5207b7SJohn Levon 91f5207b7SJohn Levon if (!({frob(); frob(); _spin_trylock(mylock);})) 101f5207b7SJohn Levon return; 111f5207b7SJohn Levon 121f5207b7SJohn Levon frob(); 131f5207b7SJohn Levon _spin_unlock(mylock); 141f5207b7SJohn Levon 151f5207b7SJohn Levon if (((_spin_trylock(mylock)?1:0)?1:0)) 161f5207b7SJohn Levon return; 171f5207b7SJohn Levon frob_somemore(); 181f5207b7SJohn Levon _spin_unlock(mylock); 191f5207b7SJohn Levon 201f5207b7SJohn Levon return; 211f5207b7SJohn Levon } 221f5207b7SJohn Levon /* 231f5207b7SJohn Levon * check-name: Smatch locking #3 241f5207b7SJohn Levon * check-command: smatch --project=kernel sm_locking3.c 251f5207b7SJohn Levon * 261f5207b7SJohn Levon * check-output-start 27*31ad075eSJohn Levon sm_locking3.c:18 func() error: double unlocked 'mylock' (orig line 15) 28*31ad075eSJohn Levon sm_locking3.c:20 func() warn: inconsistent returns 'mylock'. 29*31ad075eSJohn Levon Locked on : 16 30*31ad075eSJohn Levon Unlocked on: 10,20 311f5207b7SJohn Levon * check-output-end 321f5207b7SJohn Levon */ 33