From b8777f30dc1c5578c3933bec623d61e298ff91ec Mon Sep 17 00:00:00 2001 From: Ingo Weinhold Date: Mon, 23 Jun 2003 23:42:15 +0000 Subject: [PATCH] * Added bool to the AutoLocker constructor indicating that the object has already been locked. Defaults to false, of course. * `Abused' the AutoLocker for partition registration/unregistration (PartitionRegistrar). git-svn-id: file:///srv/svn/repos/haiku/trunk/current@3631 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- .../disk_device_manager/KDiskDeviceUtils.h | 34 +++++++++++++++---- 1 file changed, 28 insertions(+), 6 deletions(-) diff --git a/headers/private/kernel/disk_device_manager/KDiskDeviceUtils.h b/headers/private/kernel/disk_device_manager/KDiskDeviceUtils.h index 0b65abd50b..e634efb813 100644 --- a/headers/private/kernel/disk_device_manager/KDiskDeviceUtils.h +++ b/headers/private/kernel/disk_device_manager/KDiskDeviceUtils.h @@ -88,18 +88,20 @@ class AutoLocker { private: typedef AutoLocker ThisClass; public: - inline AutoLocker(Lockable *lockable) + inline AutoLocker(Lockable *lockable, bool alreadyLocked = false) : fLockable(lockable), - fLocked(false) + fLocked(fLockable && alreadyLocked) { - _Lock(); + if (!fLocked) + _Lock(); } - inline AutoLocker(Lockable &lockable) + inline AutoLocker(Lockable &lockable, bool alreadyLocked = false) : fLockable(&lockable), - fLocked(false) + fLocked(fLockable && alreadyLocked) { - _Lock(); + if (!fLocked) + _Lock(); } inline ~AutoLocker() @@ -149,6 +151,7 @@ private: // instantiations class KDiskDevice; class KDiskDeviceManager; +class KPartition; typedef AutoLocker > DeviceReadLocker; @@ -156,6 +159,25 @@ typedef AutoLocker > DeviceWriteLocker; typedef AutoLocker ManagerLocker; +// AutoLockerPartitionRegistration +template +class AutoLockerPartitionRegistration { +public: + inline bool Lock(KPartition *partition) + { + partition->Register(); + return true; + } + + inline void Unlock(KPartition *partition) + { + partition->Unregister(); + } +}; + +typedef AutoLocker > + PartitionRegistrar; + } // namespace DiskDevice } // namespace BPrivate