1// KDiskDeviceUtils.h 2 3#ifndef _K_DISK_DEVICE_UTILS_H 4#define _K_DISK_DEVICE_UTILS_H 5 6#include <stdlib.h> 7#include <string.h> 8 9#include <SupportDefs.h> 10 11#include <util/AutoLock.h> 12 13// instantiations 14#include <KDiskDevice.h> 15#include <KDiskDeviceManager.h> 16#include <KDiskSystem.h> 17#include <KPartition.h> 18 19namespace BPrivate { 20namespace DiskDevice { 21 22// helper functions 23 24// min 25template<typename T> 26static inline 27const T& 28min(const T &a, const T &b) 29{ 30 if (a < b) 31 return a; 32 return b; 33} 34 35// max 36template<typename T> 37static inline 38const T& 39max(const T &a, const T &b) 40{ 41 if (a < b) 42 return b; 43 return a; 44} 45 46// set_string 47static inline 48status_t 49set_string(char *&location, const char *newValue) 50{ 51 // unset old value 52 if (location) { 53 free(location); 54 location = NULL; 55 } 56 // set new value 57 status_t error = B_OK; 58 if (newValue) { 59 location = strdup(newValue); 60 if (!location) 61 error = B_NO_MEMORY; 62 } 63 return error; 64} 65 66// compare_string 67/*! \brief \c NULL aware strcmp(). 68 69 \c NULL is considered the least of all strings. \c NULL equals \c NULL. 70 71 \param str1 First string. 72 \param str2 Second string. 73 \return A value less than 0, if \a str1 is less than \a str2, 74 0, if they are equal, or a value greater than 0, if 75 \a str1 is greater \a str2. 76*/ 77static inline 78int 79compare_string(const char *str1, const char *str2) 80{ 81 if (str1 == NULL) { 82 if (str2 == NULL) 83 return 0; 84 return 1; 85 } else if (str2 == NULL) 86 return -1; 87 return strcmp(str1, str2); 88} 89 90 91// locking 92 93// instantiations 94class KDiskDevice; 95class KDiskDeviceManager; 96class KDiskSystem; 97class KPartition; 98//typedef struct disk_device_data disk_device_data; 99 100typedef AutoLocker<KDiskDevice, AutoLockerReadLocking<KDiskDevice> > 101 DeviceReadLocker; 102typedef AutoLocker<KDiskDevice, AutoLockerWriteLocking<KDiskDevice> > 103 DeviceWriteLocker; 104typedef AutoLocker<KDiskDeviceManager > ManagerLocker; 105 106// AutoLockerPartitionRegistration 107template<const int dummy = 0> 108class AutoLockerPartitionRegistration { 109public: 110 inline bool Lock(KPartition *partition) 111 { 112 if (partition == NULL) 113 return true; 114 partition->Register(); 115 return true; 116 } 117 118 inline void Unlock(KPartition *partition) 119 { 120 if (partition != NULL) 121 partition->Unregister(); 122 } 123}; 124 125typedef AutoLocker<KPartition, AutoLockerPartitionRegistration<> > 126 PartitionRegistrar; 127 128// AutoLockerDiskSystemLoading 129template<const int dummy = 0> 130class AutoLockerDiskSystemLoading { 131public: 132 inline bool Lock(KDiskSystem *diskSystem) 133 { 134 return (diskSystem->Load() == B_OK); 135 } 136 137 inline void Unlock(KDiskSystem *diskSystem) 138 { 139 diskSystem->Unload(); 140 } 141}; 142 143typedef AutoLocker<KDiskSystem, AutoLockerDiskSystemLoading<> > 144 DiskSystemLoader; 145 146/* 147// AutoLockerDeviceStructReadLocker 148template<const int dummy = 0> 149class AutoLockerDeviceStructReadLocker { 150public: 151 inline bool Lock(disk_device_data *device) 152 { 153 return read_lock_disk_device(device->id); 154 } 155 156 inline void Unlock(disk_device_data *device) 157 { 158 read_unlock_disk_device(device->id); 159 } 160}; 161 162typedef AutoLocker<disk_device_data, AutoLockerDeviceStructReadLocker<> > 163 DeviceStructReadLocker; 164 165// AutoLockerDeviceStructWriteLocker 166template<const int dummy = 0> 167class AutoLockerDeviceStructWriteLocker { 168public: 169 inline bool Lock(disk_device_data *device) 170 { 171 return write_lock_disk_device(device->id); 172 } 173 174 inline void Unlock(disk_device_data *device) 175 { 176 write_unlock_disk_device(device->id); 177 } 178}; 179 180typedef AutoLocker<disk_device_data, AutoLockerDeviceStructWriteLocker<> > 181 DeviceStructWriteLocker; 182*/ 183 184} // namespace DiskDevice 185} // namespace BPrivate 186 187using BPrivate::DiskDevice::set_string; 188using BPrivate::DiskDevice::DeviceReadLocker; 189using BPrivate::DiskDevice::DeviceWriteLocker; 190using BPrivate::DiskDevice::ManagerLocker; 191using BPrivate::DiskDevice::PartitionRegistrar; 192using BPrivate::DiskDevice::DiskSystemLoader; 193//using BPrivate::DiskDevice::DeviceStructReadLocker; 194//using BPrivate::DiskDevice::DeviceStructReadLocker; 195 196#endif // _K_DISK_DEVICE_H 197