diff --git a/headers/private/kernel/util/AutoLock.h b/headers/private/kernel/util/AutoLock.h index 2d85673775..d99bec9425 100644 --- a/headers/private/kernel/util/AutoLock.h +++ b/headers/private/kernel/util/AutoLock.h @@ -69,49 +69,64 @@ public: { } - inline AutoLocker(Lockable *lockable, bool alreadyLocked = false) + inline AutoLocker(Lockable *lockable, bool alreadyLocked = false, + bool lockIfNotLocked = true) : fLockable(lockable), fLocked(fLockable && alreadyLocked) { - if (!fLocked) - _Lock(); + if (!alreadyLocked && lockIfNotLocked) + Lock(); } - inline AutoLocker(Lockable &lockable, bool alreadyLocked = false) + inline AutoLocker(Lockable &lockable, bool alreadyLocked = false, + bool lockIfNotLocked = true) : fLockable(&lockable), fLocked(fLockable && alreadyLocked) { - if (!fLocked) - _Lock(); + if (!alreadyLocked && lockIfNotLocked) + Lock(); } inline ~AutoLocker() { - _Unlock(); + Unlock(); } - inline void SetTo(Lockable *lockable, bool alreadyLocked) + inline void SetTo(Lockable *lockable, bool alreadyLocked, + bool lockIfNotLocked = true) { - _Unlock(); + Unlock(); fLockable = lockable; fLocked = alreadyLocked; - if (!fLocked) - _Lock(); + if (!alreadyLocked && lockIfNotLocked) + Lock(); } - inline void SetTo(Lockable &lockable, bool alreadyLocked) + inline void SetTo(Lockable &lockable, bool alreadyLocked, + bool lockIfNotLocked = true) { - SetTo(&lockable, alreadyLocked); + SetTo(&lockable, alreadyLocked, lockIfNotLocked); } inline void Unset() { - _Unlock(); + Unlock(); + Detach(); + } + + inline bool Lock() + { + if (fLockable && !fLocked) + fLocked = fLocking.Lock(fLockable); + return fLocked; } inline void Unlock() { - _Unlock(); + if (fLockable && fLocked) { + fLocking.Unlock(fLockable); + fLocked = false; + } } inline void Detach() @@ -136,21 +151,6 @@ public: inline operator bool() const { return fLocked; } -private: - inline void _Lock() - { - if (fLockable) - fLocked = fLocking.Lock(fLockable); - } - - inline void _Unlock() - { - if (fLockable && fLocked) { - fLocking.Unlock(fLockable); - fLocked = false; - } - } - private: Lockable *fLockable; bool fLocked; diff --git a/headers/private/userlandfs/shared/AutoLocker.h b/headers/private/userlandfs/shared/AutoLocker.h index c622978839..18a4f0f566 100644 --- a/headers/private/userlandfs/shared/AutoLocker.h +++ b/headers/private/userlandfs/shared/AutoLocker.h @@ -77,27 +77,35 @@ public: } }; -// AutoLocker + template > class AutoLocker { private: typedef AutoLocker ThisClass; public: - inline AutoLocker(Lockable *lockable, bool alreadyLocked = false) + inline AutoLocker() + : fLockable(NULL), + fLocked(false) + { + } + + inline AutoLocker(Lockable *lockable, bool alreadyLocked = false, + bool lockIfNotLocked = true) : fLockable(lockable), fLocked(fLockable && alreadyLocked) { - if (!fLocked) - _Lock(); + if (!alreadyLocked && lockIfNotLocked) + Lock(); } - inline AutoLocker(Lockable &lockable, bool alreadyLocked = false) + inline AutoLocker(Lockable &lockable, bool alreadyLocked = false, + bool lockIfNotLocked = true) : fLockable(&lockable), fLocked(fLockable && alreadyLocked) { - if (!fLocked) - _Lock(); + if (!alreadyLocked && lockIfNotLocked) + Lock(); } inline ~AutoLocker() @@ -105,23 +113,47 @@ public: Unlock(); } - inline void SetTo(Lockable *lockable, bool alreadyLocked) + inline void SetTo(Lockable *lockable, bool alreadyLocked, + bool lockIfNotLocked = true) { Unlock(); fLockable = lockable; fLocked = alreadyLocked; - if (!fLocked) - _Lock(); + if (!alreadyLocked && lockIfNotLocked) + Lock(); } - inline void SetTo(Lockable &lockable, bool alreadyLocked) + inline void SetTo(Lockable &lockable, bool alreadyLocked, + bool lockIfNotLocked = true) { - SetTo(&lockable, alreadyLocked); + SetTo(&lockable, alreadyLocked, lockIfNotLocked); } inline void Unset() { Unlock(); + Detach(); + } + + inline bool Lock() + { + if (fLockable && !fLocked) + fLocked = fLocking.Lock(fLockable); + return fLocked; + } + + inline void Unlock() + { + if (fLockable && fLocked) { + fLocking.Unlock(fLockable); + fLocked = false; + } + } + + inline void Detach() + { + fLockable = NULL; + fLocked = false; } inline AutoLocker &operator=(Lockable *lockable) @@ -138,23 +170,8 @@ public: inline bool IsLocked() const { return fLocked; } - inline void Unlock() - { - if (fLockable && fLocked) { - fLocking.Unlock(fLockable); - fLocked = false; - } - } - inline operator bool() const { return fLocked; } -private: - inline void _Lock() - { - if (fLockable) - fLocked = fLocking.Lock(fLockable); - } - private: Lockable *fLockable; bool fLocked;