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