1/* 2 * Copyright 2001-2009, Haiku, Inc. All Rights Reserved. 3 * Distributed under the terms of the MIT License. 4 */ 5#ifndef _AUTOLOCK_H 6#define _AUTOLOCK_H 7 8 9#include <Locker.h> 10#include <Looper.h> 11 12 13class BAutolock { 14public: 15 inline BAutolock(BLooper* looper); 16 inline BAutolock(BLocker* locker); 17 inline BAutolock(BLocker& locker); 18 inline ~BAutolock(); 19 20 inline bool IsLocked(); 21 22 inline bool Lock(); 23 inline void Unlock(); 24 25private: 26 BLocker* fLocker; 27 BLooper* fLooper; 28 bool fIsLocked; 29}; 30 31 32inline 33BAutolock::BAutolock(BLooper *looper) 34 : 35 fLocker(NULL), 36 fLooper(looper), 37 fIsLocked(looper->Lock()) 38{ 39} 40 41 42inline 43BAutolock::BAutolock(BLocker *locker) 44 : 45 fLocker(locker), 46 fLooper(NULL), 47 fIsLocked(locker->Lock()) 48{ 49} 50 51 52inline 53BAutolock::BAutolock(BLocker &locker) 54 : 55 fLocker(&locker), 56 fLooper(NULL), 57 fIsLocked(locker.Lock()) 58{ 59} 60 61 62inline 63BAutolock::~BAutolock() 64{ 65 Unlock(); 66} 67 68 69inline bool 70BAutolock::IsLocked() 71{ 72 return fIsLocked; 73} 74 75 76inline bool 77BAutolock::Lock() 78{ 79 if (fIsLocked) 80 return true; 81 82 if (fLooper != NULL) 83 fIsLocked = fLooper->Lock(); 84 else 85 fIsLocked = fLocker->Lock(); 86 87 return fIsLocked; 88} 89 90 91inline void 92BAutolock::Unlock() 93{ 94 if (!fIsLocked) 95 return; 96 97 fIsLocked = false; 98 if (fLooper != NULL) 99 fLooper->Unlock(); 100 else 101 fLocker->Unlock(); 102} 103 104 105#endif // _AUTOLOCK_H 106