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örflerBAutolock::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örflerBAutolock::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örflerBAutolock::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örflerBAutolock::~BAutolock() 6452a38012Sejakowatz { 65ace6934dSMichael Lotz Unlock(); 6652a38012Sejakowatz } 6752a38012Sejakowatz 6852a38012Sejakowatz 69087882c2SAxel Dörfler inline bool IsLocked()70087882c2SAxel DörflerBAutolock::IsLocked() 7152a38012Sejakowatz { 7252a38012Sejakowatz return fIsLocked; 7352a38012Sejakowatz } 7452a38012Sejakowatz 75ace6934dSMichael Lotz 76ace6934dSMichael Lotz inline bool Lock()77ace6934dSMichael LotzBAutolock::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 LotzBAutolock::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