xref: /haiku/headers/os/support/Autolock.h (revision 087882c26e81eabf9a459e634a33f8e978d8a66b)
1*087882c2SAxel Dörfler /*
2*087882c2SAxel Dörfler  * Copyright 2001-2007, Haiku, Inc. All Rights Reserved.
3*087882c2SAxel Dörfler  * Distributed under the terms of the MIT License.
4*087882c2SAxel Dörfler  */
5*087882c2SAxel Dörfler #ifndef	_SUPPORT_AUTOLOCK_H
6*087882c2SAxel Dörfler #define	_SUPPORT_AUTOLOCK_H
752a38012Sejakowatz 
852a38012Sejakowatz 
930fd5147Shaydentech #include <Locker.h>
1052a38012Sejakowatz #include <Looper.h>
1152a38012Sejakowatz 
1252a38012Sejakowatz 
1352a38012Sejakowatz class BAutolock {
1452a38012Sejakowatz 	public:
1552a38012Sejakowatz 		inline BAutolock(BLooper *looper);
1652a38012Sejakowatz 		inline BAutolock(BLocker *locker);
1752a38012Sejakowatz 		inline BAutolock(BLocker &locker);
1852a38012Sejakowatz 		inline ~BAutolock();
1952a38012Sejakowatz 
2052a38012Sejakowatz 		inline bool IsLocked(void);
2152a38012Sejakowatz 
2252a38012Sejakowatz 	private:
23*087882c2SAxel Dörfler 		BLocker *fLocker;
24*087882c2SAxel Dörfler 		BLooper *fLooper;
2552a38012Sejakowatz 		bool	fIsLocked;
2652a38012Sejakowatz };
2752a38012Sejakowatz 
2852a38012Sejakowatz 
29*087882c2SAxel Dörfler inline
30*087882c2SAxel Dörfler BAutolock::BAutolock(BLooper *looper)
31*087882c2SAxel Dörfler 	: fLocker(NULL), fLooper(looper), fIsLocked(looper->Lock())
3252a38012Sejakowatz {
3352a38012Sejakowatz }
3452a38012Sejakowatz 
3552a38012Sejakowatz 
36*087882c2SAxel Dörfler inline
37*087882c2SAxel Dörfler BAutolock::BAutolock(BLocker *locker)
38*087882c2SAxel Dörfler 	: fLocker(locker), fLooper(NULL), fIsLocked(locker->Lock())
3952a38012Sejakowatz {
4052a38012Sejakowatz }
4152a38012Sejakowatz 
4252a38012Sejakowatz 
43*087882c2SAxel Dörfler inline
44*087882c2SAxel Dörfler BAutolock::BAutolock(BLocker &locker)
45*087882c2SAxel Dörfler 	: fLocker(&locker), fLooper(NULL), fIsLocked(locker.Lock())
4652a38012Sejakowatz {
4752a38012Sejakowatz }
4852a38012Sejakowatz 
4952a38012Sejakowatz 
50*087882c2SAxel Dörfler inline
51*087882c2SAxel Dörfler BAutolock::~BAutolock()
5252a38012Sejakowatz {
5352a38012Sejakowatz 	if (fIsLocked) {
54*087882c2SAxel Dörfler 		if (fLooper != NULL)
55*087882c2SAxel Dörfler 			fLooper->Unlock();
56*087882c2SAxel Dörfler 		else
57*087882c2SAxel Dörfler 			fLocker->Unlock();
5852a38012Sejakowatz 	}
5952a38012Sejakowatz }
6052a38012Sejakowatz 
6152a38012Sejakowatz 
62*087882c2SAxel Dörfler inline bool
63*087882c2SAxel Dörfler BAutolock::IsLocked()
6452a38012Sejakowatz {
6552a38012Sejakowatz 	return fIsLocked;
6652a38012Sejakowatz }
6752a38012Sejakowatz 
68*087882c2SAxel Dörfler #endif // _SUPPORT_AUTOLOCK_H
69