xref: /haiku/src/apps/installer/SemaphoreLocker.h (revision 8e3916f8ef7f29c7fc15250c8d3f5ac510988116)
1*8e3916f8SStephan Aßmus /*
2*8e3916f8SStephan Aßmus  * Copyright 2008-2009, Stephan Aßmus <superstippi@gmx.de>
3*8e3916f8SStephan Aßmus  *  All rights reserved. Distributed under the terms of the MIT License.
4*8e3916f8SStephan Aßmus  */
5*8e3916f8SStephan Aßmus #ifndef _SEMAPHORE_LOCKER_H
6*8e3916f8SStephan Aßmus #define _SEMAPHORE_LOCKER_H
7*8e3916f8SStephan Aßmus 
8*8e3916f8SStephan Aßmus 
9*8e3916f8SStephan Aßmus #include "AutoLocker.h"
10*8e3916f8SStephan Aßmus 
11*8e3916f8SStephan Aßmus 
12*8e3916f8SStephan Aßmus class SemaphoreLocking {
13*8e3916f8SStephan Aßmus public:
Lock(sem_id * lockable)14*8e3916f8SStephan Aßmus 	inline bool Lock(sem_id* lockable)
15*8e3916f8SStephan Aßmus 	{
16*8e3916f8SStephan Aßmus 		return acquire_sem(*lockable) == B_OK;
17*8e3916f8SStephan Aßmus 	}
18*8e3916f8SStephan Aßmus 
Unlock(sem_id * lockable)19*8e3916f8SStephan Aßmus 	inline void Unlock(sem_id* lockable)
20*8e3916f8SStephan Aßmus 	{
21*8e3916f8SStephan Aßmus 		release_sem(*lockable);
22*8e3916f8SStephan Aßmus 	}
23*8e3916f8SStephan Aßmus };
24*8e3916f8SStephan Aßmus 
25*8e3916f8SStephan Aßmus 
26*8e3916f8SStephan Aßmus class SemaphoreLocker : public AutoLocker<sem_id, SemaphoreLocking> {
27*8e3916f8SStephan Aßmus public:
28*8e3916f8SStephan Aßmus 	inline SemaphoreLocker(sem_id semaphore, bool alreadyLocked = false,
29*8e3916f8SStephan Aßmus 			bool lockIfNotLocked = true)
30*8e3916f8SStephan Aßmus 		:
31*8e3916f8SStephan Aßmus 		AutoLocker<sem_id, SemaphoreLocking>(),
32*8e3916f8SStephan Aßmus 		fSem(semaphore)
33*8e3916f8SStephan Aßmus 	{
34*8e3916f8SStephan Aßmus 		SetTo(&fSem, alreadyLocked, lockIfNotLocked);
35*8e3916f8SStephan Aßmus 	}
36*8e3916f8SStephan Aßmus 
37*8e3916f8SStephan Aßmus private:
38*8e3916f8SStephan Aßmus 	sem_id	fSem;
39*8e3916f8SStephan Aßmus };
40*8e3916f8SStephan Aßmus 
41*8e3916f8SStephan Aßmus #endif // _SEMAPHORE_LOCKER_H
42