diff --git a/Cache/BlockCache.cpp b/Cache/BlockCache.cpp index b6670b5..5c07030 100644 --- a/Cache/BlockCache.cpp +++ b/Cache/BlockCache.cpp @@ -23,16 +23,15 @@ using ProFUSE::Exception; using ProFUSE::POSIXException; -BlockCache::BlockCache(BlockDevice *device) +BlockCache::BlockCache(BlockDevicePointer device) : + _device(device) { - _device = device; _blocks = device->blocks(); _readOnly = device->readOnly(); } BlockCache::~BlockCache() { - delete _device; } void BlockCache::write(unsigned block, const void *bp) @@ -50,11 +49,11 @@ void BlockCache::read(unsigned block, void *bp) } -BlockCache *BlockCache::Create(BlockDevice *device) +BlockCachePointer BlockCache::Create(BlockDevicePointer device) { - if (!device) return NULL; + if (!device.get()) return BlockCachePointer(); - return device->createBlockCache(); + return device->createBlockCache(device); } diff --git a/Cache/BlockCache.h b/Cache/BlockCache.h index c4587d1..2b9e839 100644 --- a/Cache/BlockCache.h +++ b/Cache/BlockCache.h @@ -3,12 +3,13 @@ #include #include +#include + class MappedFile; namespace Device { -class BlockDevice; enum BlockReleaseFlags { kBlockDirty = 1, @@ -19,13 +20,13 @@ enum BlockReleaseFlags { class BlockCache { public: - static BlockCache *Create(BlockDevice *device); + static BlockCachePointer Create(BlockDevicePointer device); virtual ~BlockCache(); bool readOnly() { return _readOnly; } unsigned blocks() { return _blocks; } - BlockDevice *device() { return _device; } + BlockDevicePointer device() { return _device; } virtual void sync() = 0; @@ -46,16 +47,16 @@ public: } protected: - BlockCache(BlockDevice *device); + BlockCache(BlockDevicePointer device); - BlockDevice *_device; + BlockDevicePointer _device; private: unsigned _blocks; bool _readOnly; }; - + } // namespace #endif diff --git a/Cache/ConcreteBlockCache.cpp b/Cache/ConcreteBlockCache.cpp index 5e0bd69..d18ccb3 100644 --- a/Cache/ConcreteBlockCache.cpp +++ b/Cache/ConcreteBlockCache.cpp @@ -59,7 +59,7 @@ using ProFUSE::POSIXException; -ConcreteBlockCache::ConcreteBlockCache(BlockDevice *device, unsigned size) : +ConcreteBlockCache::ConcreteBlockCache(BlockDevicePointer device, unsigned size) : BlockCache(device) { if (size < 16) size = 16; diff --git a/Cache/ConcreteBlockCache.h b/Cache/ConcreteBlockCache.h index 2ca5698..8191be0 100644 --- a/Cache/ConcreteBlockCache.h +++ b/Cache/ConcreteBlockCache.h @@ -9,7 +9,7 @@ namespace Device { class ConcreteBlockCache : public BlockCache { public: - ConcreteBlockCache(BlockDevice *device, unsigned size = 16); + ConcreteBlockCache(BlockDevicePointer device, unsigned size = 16); virtual ~ConcreteBlockCache(); virtual void sync(); diff --git a/Cache/MappedBlockCache.cpp b/Cache/MappedBlockCache.cpp index 1d1be58..46fb1b2 100644 --- a/Cache/MappedBlockCache.cpp +++ b/Cache/MappedBlockCache.cpp @@ -20,7 +20,7 @@ using ProFUSE::Exception; using ProFUSE::POSIXException; -MappedBlockCache::MappedBlockCache(BlockDevice *device, void *data) : +MappedBlockCache::MappedBlockCache(BlockDevicePointer device, void *data) : BlockCache(device) { _data = (uint8_t *)data; diff --git a/Cache/MappedBlockCache.h b/Cache/MappedBlockCache.h index a3402ff..c36ab3c 100644 --- a/Cache/MappedBlockCache.h +++ b/Cache/MappedBlockCache.h @@ -8,7 +8,7 @@ namespace Device { class MappedBlockCache : public BlockCache { public: - MappedBlockCache(BlockDevice *, void *data); + MappedBlockCache(BlockDevicePointer device, void *data); virtual ~MappedBlockCache(); virtual void sync(); diff --git a/Device/BlockDevice.cpp b/Device/BlockDevice.cpp index d86f4d7..3643dd2 100644 --- a/Device/BlockDevice.cpp +++ b/Device/BlockDevice.cpp @@ -233,9 +233,9 @@ void BlockDevice::sync(TrackSector ts) } */ -BlockCache *BlockDevice::createBlockCache() +BlockCachePointer BlockDevice::createBlockCache(BlockDevicePointer device) { unsigned b = blocks(); unsigned size = std::max(16u, b / 16); - return new ConcreteBlockCache(this, size); + return BlockCachePointer(new ConcreteBlockCache(device, size)); } diff --git a/Device/BlockDevice.h b/Device/BlockDevice.h index 8e8feb5..0356e3d 100644 --- a/Device/BlockDevice.h +++ b/Device/BlockDevice.h @@ -4,11 +4,11 @@ #include #include -#include - +#include #include -#include +#include + #include @@ -30,7 +30,7 @@ public: virtual ~BlockDevice(); - virtual BlockCache *createBlockCache(); + virtual BlockCachePointer createBlockCache(BlockDevicePointer device); virtual void read(unsigned block, void *bp) = 0; diff --git a/Device/DavexDiskImage.cpp b/Device/DavexDiskImage.cpp index e63a04f..65c53cc 100644 --- a/Device/DavexDiskImage.cpp +++ b/Device/DavexDiskImage.cpp @@ -158,8 +158,9 @@ DavexDiskImage *DavexDiskImage::Create(const char *name, size_t blocks, const ch } -BlockCache *DavexDiskImage::createBlockCache() +BlockCachePointer DavexDiskImage::createBlockCache(BlockDevicePointer device) { - return new MappedBlockCache(this, 512 + (uint8_t *)address()); + // need a smart pointer, but only have this.... + return BlockCachePointer(new MappedBlockCache(device, 512 + (uint8_t *)address())); } diff --git a/Device/DavexDiskImage.h b/Device/DavexDiskImage.h index ff659e0..46dbe68 100644 --- a/Device/DavexDiskImage.h +++ b/Device/DavexDiskImage.h @@ -20,7 +20,7 @@ public: static DavexDiskImage *Create(const char *name, size_t blocks, const char *vname); static DavexDiskImage *Open(MappedFile *); - virtual BlockCache *createBlockCache(); + virtual BlockCachePointer createBlockCache(BlockDevicePointer device); private: diff --git a/Device/Device.h b/Device/Device.h new file mode 100644 index 0000000..3c280d0 --- /dev/null +++ b/Device/Device.h @@ -0,0 +1,26 @@ +// +// Device.h +// profuse +// +// Created by Kelvin Sherlock on 2/19/2011. +// Copyright 2011 __MyCompanyName__. All rights reserved. +// + +#ifndef __DEVICE_DEVICE_H__ +#define __DEVICE_DEVICE_H__ + +#include + +namespace Device { + + class BlockDevice; + class BlockCache; + + typedef std::tr1::shared_ptr BlockDevicePointer; + typedef std::tr1::shared_ptr BlockCachePointer; + + +} + + +#endif diff --git a/Device/DiskCopy42Image.cpp b/Device/DiskCopy42Image.cpp index 9af488b..c1a072d 100644 --- a/Device/DiskCopy42Image.cpp +++ b/Device/DiskCopy42Image.cpp @@ -218,11 +218,11 @@ void DiskCopy42Image::write(unsigned block, const void *bp) } -BlockCache *DiskCopy42Image::createBlockCache() +BlockCachePointer DiskCopy42Image::createBlockCache(BlockDevicePointer device) { // if not readonly, mark changed so crc will be updated at close. if (!readOnly()) _changed = true; - return new MappedBlockCache(this, address()); + return BlockCachePointer(new MappedBlockCache(device, address())); } \ No newline at end of file diff --git a/Device/DiskCopy42Image.h b/Device/DiskCopy42Image.h index f4ce443..ea70d18 100644 --- a/Device/DiskCopy42Image.h +++ b/Device/DiskCopy42Image.h @@ -22,7 +22,7 @@ public: virtual void write(unsigned block, const void *bp); - virtual BlockCache *createBlockCache(); + virtual BlockCachePointer createBlockCache(BlockDevicePointer device); private: diff --git a/Device/DiskImage.cpp b/Device/DiskImage.cpp index 113eb22..f54a195 100644 --- a/Device/DiskImage.cpp +++ b/Device/DiskImage.cpp @@ -138,9 +138,9 @@ void ProDOSOrderDiskImage::Validate(MappedFile *f) } -BlockCache *ProDOSOrderDiskImage::createBlockCache() +BlockCachePointer ProDOSOrderDiskImage::createBlockCache(BlockDevicePointer device) { - return new MappedBlockCache(this, address()); + return BlockCachePointer(new MappedBlockCache(device, address())); } #pragma mark - diff --git a/Device/DiskImage.h b/Device/DiskImage.h index 52a7303..69d6db7 100644 --- a/Device/DiskImage.h +++ b/Device/DiskImage.h @@ -61,7 +61,7 @@ public: static ProDOSOrderDiskImage *Open(MappedFile *); - virtual BlockCache *createBlockCache(); + virtual BlockCachePointer createBlockCache(BlockDevicePointer device); private: ProDOSOrderDiskImage(); diff --git a/Device/UniversalDiskImage.cpp b/Device/UniversalDiskImage.cpp index dedb9c9..6764e04 100644 --- a/Device/UniversalDiskImage.cpp +++ b/Device/UniversalDiskImage.cpp @@ -141,14 +141,14 @@ bool UniversalDiskImage::readOnly() } -BlockCache *UniversalDiskImage::createBlockCache() +BlockCachePointer UniversalDiskImage::createBlockCache(BlockDevicePointer device) { if (_format == 1) { - return new MappedBlockCache(this, _dataOffset + (uint8_t *)address()); + return BlockCachePointer(new MappedBlockCache(device, _dataOffset + (uint8_t *)address())); } - return DiskImage::createBlockCache(); + return DiskImage::createBlockCache(device); } diff --git a/Device/UniversalDiskImage.h b/Device/UniversalDiskImage.h index e552af5..8a0ae7d 100644 --- a/Device/UniversalDiskImage.h +++ b/Device/UniversalDiskImage.h @@ -19,7 +19,7 @@ public: virtual bool readOnly(); - virtual BlockCache *createBlockCache(); + virtual BlockCachePointer createBlockCache(BlockDevicePointer device); private: