xref: /haiku/headers/os/support/Autolock.h (revision 29e8fa5922c9f9a5eb09a2fcc92e7fb321d4cc59)
1087882c2SAxel Dörfler /*
2ace6934dSMichael Lotz  * Copyright 2001-2009, Haiku, Inc. All Rights Reserved.
3087882c2SAxel Dörfler  * Distributed under the terms of the MIT License.
4087882c2SAxel Dörfler  */
5*29e8fa59SJohn Scipione #ifndef	_AUTOLOCK_H
6*29e8fa59SJohn Scipione #define	_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 
20ace6934dSMichael Lotz 	inline	bool				IsLocked();
21ace6934dSMichael Lotz 
22ace6934dSMichael Lotz 	inline	bool				Lock();
23ace6934dSMichael Lotz 	inline	void				Unlock();
2452a38012Sejakowatz 
2552a38012Sejakowatz private:
26087882c2SAxel Dörfler 			BLocker*			fLocker;
27087882c2SAxel Dörfler 			BLooper*			fLooper;
2852a38012Sejakowatz 			bool				fIsLocked;
2952a38012Sejakowatz };
3052a38012Sejakowatz 
3152a38012Sejakowatz 
32087882c2SAxel Dörfler inline
BAutolock(BLooper * looper)33087882c2SAxel Dörfler BAutolock::BAutolock(BLooper *looper)
34ace6934dSMichael Lotz 	:
35ace6934dSMichael Lotz 	fLocker(NULL),
36ace6934dSMichael Lotz 	fLooper(looper),
37ace6934dSMichael Lotz 	fIsLocked(looper->Lock())
3852a38012Sejakowatz {
3952a38012Sejakowatz }
4052a38012Sejakowatz 
4152a38012Sejakowatz 
42087882c2SAxel Dörfler inline
BAutolock(BLocker * locker)43087882c2SAxel Dörfler BAutolock::BAutolock(BLocker *locker)
44ace6934dSMichael Lotz 	:
45ace6934dSMichael Lotz 	fLocker(locker),
46ace6934dSMichael Lotz 	fLooper(NULL),
47ace6934dSMichael Lotz 	fIsLocked(locker->Lock())
4852a38012Sejakowatz {
4952a38012Sejakowatz }
5052a38012Sejakowatz 
5152a38012Sejakowatz 
52087882c2SAxel Dörfler inline
BAutolock(BLocker & locker)53087882c2SAxel Dörfler BAutolock::BAutolock(BLocker &locker)
54ace6934dSMichael Lotz 	:
55ace6934dSMichael Lotz 	fLocker(&locker),
56ace6934dSMichael Lotz 	fLooper(NULL),
57ace6934dSMichael Lotz 	fIsLocked(locker.Lock())
5852a38012Sejakowatz {
5952a38012Sejakowatz }
6052a38012Sejakowatz 
6152a38012Sejakowatz 
62087882c2SAxel Dörfler inline
~BAutolock()63087882c2SAxel Dörfler BAutolock::~BAutolock()
6452a38012Sejakowatz {
65ace6934dSMichael Lotz 	Unlock();
6652a38012Sejakowatz }
6752a38012Sejakowatz 
6852a38012Sejakowatz 
69087882c2SAxel Dörfler inline bool
IsLocked()70087882c2SAxel Dörfler BAutolock::IsLocked()
7152a38012Sejakowatz {
7252a38012Sejakowatz 	return fIsLocked;
7352a38012Sejakowatz }
7452a38012Sejakowatz 
75ace6934dSMichael Lotz 
76ace6934dSMichael Lotz inline bool
Lock()77ace6934dSMichael Lotz BAutolock::Lock()
78ace6934dSMichael Lotz {
79ace6934dSMichael Lotz 	if (fIsLocked)
80ace6934dSMichael Lotz 		return true;
81ace6934dSMichael Lotz 
82ace6934dSMichael Lotz 	if (fLooper != NULL)
83ace6934dSMichael Lotz 		fIsLocked = fLooper->Lock();
84ace6934dSMichael Lotz 	else
85ace6934dSMichael Lotz 		fIsLocked = fLocker->Lock();
86ace6934dSMichael Lotz 
87ace6934dSMichael Lotz 	return fIsLocked;
88ace6934dSMichael Lotz }
89ace6934dSMichael Lotz 
90ace6934dSMichael Lotz 
91ace6934dSMichael Lotz inline void
Unlock()92ace6934dSMichael Lotz BAutolock::Unlock()
93ace6934dSMichael Lotz {
94ace6934dSMichael Lotz 	if (!fIsLocked)
95ace6934dSMichael Lotz 		return;
96ace6934dSMichael Lotz 
97ace6934dSMichael Lotz 	fIsLocked = false;
98ace6934dSMichael Lotz 	if (fLooper != NULL)
99ace6934dSMichael Lotz 		fLooper->Unlock();
100ace6934dSMichael Lotz 	else
101ace6934dSMichael Lotz 		fLocker->Unlock();
102ace6934dSMichael Lotz }
103ace6934dSMichael Lotz 
104*29e8fa59SJohn Scipione 
105*29e8fa59SJohn Scipione #endif	// _AUTOLOCK_H
106