added 4 changesets to branch 'refs/remotes/weinhold-github/new-hpkg-format' old head: a730597be6255ca69ed96eb2e5296e35c1861862 new head: d1f1dd4262029d3e4e699c3a4e7e0f7a94d0b359 overview: https://github.com/weinhold/HaikuPM/compare/a730597...d1f1dd4 ---------------------------------------------------------------------------- 7fede5f: Rename BBlockBufferCache and friends to *Pool* Also move BBlockBufferPoolNoLock into BHPKG namespace with the other classes. Not sure why it wasn't there before. e61db51: Some comment updates d4171e4: Some *DataReader improvements * BFDDataReader: Add SetFD(). * BBufferDataReader: Derive from BAbstractBufferedDataReader. d1f1dd4: hpkg format: compress the whole heap Instead of handling compression for individual file/attribute data we do now compress the whole heap where they are stored. This significantly improves compression ratios. We still divide the uncompressed data into 64 KiB chunks and use a chunk offset array for the compressed chunks to allow for quick random access without too much overhead. The tradeoff is a limited possible compression ratio -- i.e. we won't be as good as tar.gz (though surprisingly with my test archives we did better than zip). The other package file sections (package attributes and TOC) are no longer compressed individually. Their uncompressed data are simply pushed onto the heap where the usual compression strategy applies. To simplify things the repository format has been changed in the same manner although it doesn't otherwise use the heap, since it only stores meta data. Due to the data compression having been exposed in public and private API, this change touches a lot of package kit using code, including packagefs and the boot loader packagefs support. The latter two haven't been tested yet. Moreover packagefs needs a new kind of cache so we avoid re-reading the same heap chunk for two different data items it contains. [ Ingo Weinhold <ingo_weinhold@xxxxxx> ] ---------------------------------------------------------------------------- 82 files changed, 3154 insertions(+), 2513 deletions(-) .../build/os/package/BlockBufferCacheNoLock.h | 1 - headers/build/os/package/hpkg/BlockBufferCache.h | 1 - headers/build/os/package/hpkg/BlockBufferPool.h | 1 + .../os/package/hpkg/BlockBufferPoolNoLock.h | 1 + headers/build/os/package/hpkg/BufferCache.h | 1 - headers/build/os/package/hpkg/BufferPool.h | 1 + .../private/package/hpkg/BlockBufferCacheImpl.h | 1 - .../private/package/hpkg/BlockBufferPoolImpl.h | 1 + .../build/private/package/hpkg/CachedBuffer.h | 1 - headers/build/private/package/hpkg/DataWriters.h | 1 + .../package/hpkg/PackageFileHeapAccessorBase.h | 1 + .../private/package/hpkg/PackageFileHeapReader.h | 1 + .../private/package/hpkg/PackageFileHeapWriter.h | 1 + headers/build/private/package/hpkg/PoolBuffer.h | 1 + headers/os/package/BlockBufferCacheNoLock.h | 29 - headers/os/package/hpkg/BlockBufferCache.h | 49 -- headers/os/package/hpkg/BlockBufferPool.h | 49 ++ headers/os/package/hpkg/BlockBufferPoolNoLock.h | 33 + .../package/hpkg/{BufferCache.h => BufferPool.h} | 26 +- headers/os/package/hpkg/DataReader.h | 6 +- headers/os/package/hpkg/HPKGDefs.h | 65 +- headers/os/package/hpkg/PackageData.h | 22 +- headers/os/package/hpkg/PackageDataReader.h | 11 +- headers/os/package/hpkg/PackageReader.h | 9 +- headers/os/package/hpkg/RepositoryReader.h | 1 + headers/os/package/hpkg/v1/PackageDataReader.h | 6 +- .../private/package/hpkg/BlockBufferCacheImpl.h | 67 -- .../private/package/hpkg/BlockBufferPoolImpl.h | 67 ++ headers/private/package/hpkg/DataWriters.h | 101 +++ headers/private/package/hpkg/HPKGDefsPrivate.h | 32 +- .../package/hpkg/PackageFileHeapAccessorBase.h | 143 ++++ .../private/package/hpkg/PackageFileHeapReader.h | 57 ++ .../private/package/hpkg/PackageFileHeapWriter.h | 99 +++ headers/private/package/hpkg/PackageReaderImpl.h | 10 +- headers/private/package/hpkg/PackageWriterImpl.h | 31 +- .../hpkg/{CachedBuffer.h => PoolBuffer.h} | 44 +- headers/private/package/hpkg/ReaderImplBase.h | 457 ++++++++----- .../private/package/hpkg/RepositoryReaderImpl.h | 4 +- .../private/package/hpkg/RepositoryWriterImpl.h | 7 +- headers/private/package/hpkg/WriterImplBase.h | 123 +--- .../kernel/file_systems/packagefs/Jamfile | 10 +- .../packagefs/nodes/UnpackingAttributeCookie.cpp | 29 +- .../packagefs/package/BlockBufferCacheKernel.cpp | 37 -- .../packagefs/package/BlockBufferCacheKernel.h | 34 - .../packagefs/package/BlockBufferPoolKernel.cpp | 37 ++ .../packagefs/package/BlockBufferPoolKernel.h | 33 + .../packagefs/package/GlobalFactory.cpp | 25 +- .../packagefs/package/GlobalFactory.h | 18 +- .../file_systems/packagefs/package/Package.cpp | 190 +++++- .../file_systems/packagefs/package/Package.h | 9 + .../file_systems/packagefs/package/PackageData.h | 4 +- .../packagefs/package/PackageFile.cpp | 26 +- src/bin/package/command_dump.cpp | 2 +- src/bin/package/command_extract.cpp | 161 +++-- src/bin/package/command_list.cpp | 22 +- src/build/libpackage/Jamfile | 14 +- src/kits/package/BlockBufferCacheNoLock.cpp | 40 -- src/kits/package/Jamfile | 14 +- ...{BlockBufferCache.cpp => BlockBufferPool.cpp} | 20 +- ...fferCacheImpl.cpp => BlockBufferPoolImpl.cpp} | 50 +- src/kits/package/hpkg/BlockBufferPoolNoLock.cpp | 44 ++ .../hpkg/{BufferCache.cpp => BufferPool.cpp} | 6 +- src/kits/package/hpkg/DataReader.cpp | 17 + src/kits/package/hpkg/DataWriters.cpp | 125 ++++ src/kits/package/hpkg/FDDataReader.cpp | 7 + src/kits/package/hpkg/PackageContentHandler.cpp | 3 - src/kits/package/hpkg/PackageData.cpp | 9 +- src/kits/package/hpkg/PackageDataReader.cpp | 373 +---------- .../package/hpkg/PackageFileHeapAccessorBase.cpp | 247 +++++++ src/kits/package/hpkg/PackageFileHeapReader.cpp | 131 ++++ src/kits/package/hpkg/PackageFileHeapWriter.cpp | 645 +++++++++++++++++++ src/kits/package/hpkg/PackageReader.cpp | 12 +- src/kits/package/hpkg/PackageReaderImpl.cpp | 287 ++------- src/kits/package/hpkg/PackageWriterImpl.cpp | 617 +++--------------- .../hpkg/{CachedBuffer.cpp => PoolBuffer.cpp} | 6 +- src/kits/package/hpkg/ReaderImplBase.cpp | 165 ++--- src/kits/package/hpkg/RepositoryReaderImpl.cpp | 164 +---- src/kits/package/hpkg/RepositoryWriterImpl.cpp | 145 ++--- src/kits/package/hpkg/WriterImplBase.cpp | 134 +--- src/kits/package/hpkg/v1/PackageDataReaderV1.cpp | 69 +- .../boot/loader/file_systems/packagefs/Jamfile | 12 +- .../loader/file_systems/packagefs/packagefs.cpp | 112 +--- ############################################################################ Commit: 7fede5f1cc1bba44d4332c6d6f56624bfb31c21e Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Tue May 14 16:59:57 2013 UTC Rename BBlockBufferCache and friends to *Pool* Also move BBlockBufferPoolNoLock into BHPKG namespace with the other classes. Not sure why it wasn't there before. ---------------------------------------------------------------------------- diff --git a/headers/build/os/package/BlockBufferCacheNoLock.h b/headers/build/os/package/BlockBufferCacheNoLock.h deleted file mode 100644 index 49b1d8e..0000000 --- a/headers/build/os/package/BlockBufferCacheNoLock.h +++ /dev/null @@ -1 +0,0 @@ -#include <../os/package/BlockBufferCacheNoLock.h> diff --git a/headers/build/os/package/hpkg/BlockBufferCache.h b/headers/build/os/package/hpkg/BlockBufferCache.h deleted file mode 100644 index 53f9dd5..0000000 --- a/headers/build/os/package/hpkg/BlockBufferCache.h +++ /dev/null @@ -1 +0,0 @@ -#include <../os/package/hpkg/BlockBufferCache.h> diff --git a/headers/build/os/package/hpkg/BlockBufferPool.h b/headers/build/os/package/hpkg/BlockBufferPool.h new file mode 100644 index 0000000..8f75461 --- /dev/null +++ b/headers/build/os/package/hpkg/BlockBufferPool.h @@ -0,0 +1 @@ +#include <../os/package/hpkg/BlockBufferPool.h> diff --git a/headers/build/os/package/hpkg/BlockBufferPoolNoLock.h b/headers/build/os/package/hpkg/BlockBufferPoolNoLock.h new file mode 100644 index 0000000..490a814 --- /dev/null +++ b/headers/build/os/package/hpkg/BlockBufferPoolNoLock.h @@ -0,0 +1 @@ +#include <../os/package/hpkg/BlockBufferPoolNoLock.h> diff --git a/headers/build/os/package/hpkg/BufferCache.h b/headers/build/os/package/hpkg/BufferCache.h deleted file mode 100644 index c82ddeb..0000000 --- a/headers/build/os/package/hpkg/BufferCache.h +++ /dev/null @@ -1 +0,0 @@ -#include <../os/package/hpkg/BufferCache.h> diff --git a/headers/build/os/package/hpkg/BufferPool.h b/headers/build/os/package/hpkg/BufferPool.h new file mode 100644 index 0000000..3067221 --- /dev/null +++ b/headers/build/os/package/hpkg/BufferPool.h @@ -0,0 +1 @@ +#include <../os/package/hpkg/BufferPool.h> diff --git a/headers/build/private/package/hpkg/BlockBufferCacheImpl.h b/headers/build/private/package/hpkg/BlockBufferCacheImpl.h deleted file mode 100644 index 7e6db95..0000000 --- a/headers/build/private/package/hpkg/BlockBufferCacheImpl.h +++ /dev/null @@ -1 +0,0 @@ -#include <../private/package/hpkg/BlockBufferCacheImpl.h> diff --git a/headers/build/private/package/hpkg/BlockBufferPoolImpl.h b/headers/build/private/package/hpkg/BlockBufferPoolImpl.h new file mode 100644 index 0000000..888dffe --- /dev/null +++ b/headers/build/private/package/hpkg/BlockBufferPoolImpl.h @@ -0,0 +1 @@ +#include <../private/package/hpkg/BlockBufferPoolImpl.h> diff --git a/headers/build/private/package/hpkg/CachedBuffer.h b/headers/build/private/package/hpkg/CachedBuffer.h deleted file mode 100644 index f7a5c1d..0000000 --- a/headers/build/private/package/hpkg/CachedBuffer.h +++ /dev/null @@ -1 +0,0 @@ -#include <../private/package/hpkg/CachedBuffer.h> diff --git a/headers/build/private/package/hpkg/PoolBuffer.h b/headers/build/private/package/hpkg/PoolBuffer.h new file mode 100644 index 0000000..b6bceac --- /dev/null +++ b/headers/build/private/package/hpkg/PoolBuffer.h @@ -0,0 +1 @@ +#include <../private/package/hpkg/PoolBuffer.h> diff --git a/headers/os/package/BlockBufferCacheNoLock.h b/headers/os/package/BlockBufferCacheNoLock.h deleted file mode 100644 index 5bc766d..0000000 --- a/headers/os/package/BlockBufferCacheNoLock.h +++ /dev/null @@ -1,29 +0,0 @@ -/* - * Copyright 2009,2011, Haiku, Inc. - * Distributed under the terms of the MIT License. - */ -#ifndef _PACKAGE__BLOCK_BUFFER_CACHE_NO_LOCK_H -#define _PACKAGE__BLOCK_BUFFER_CACHE_NO_LOCK_H - - -#include <package/hpkg/BlockBufferCache.h> - - -namespace BPackageKit { - - -class BBlockBufferCacheNoLock : public BHPKG::BBlockBufferCache { -public: - BBlockBufferCacheNoLock(size_t blockSize, - uint32 maxCachedBlocks); - virtual ~BBlockBufferCacheNoLock(); - - virtual bool Lock(); - virtual void Unlock(); -}; - - -} // namespace BPackageKit - - -#endif // _PACKAGE__BLOCK_BUFFER_CACHE_NO_LOCK_H diff --git a/headers/os/package/hpkg/BlockBufferCache.h b/headers/os/package/hpkg/BlockBufferCache.h deleted file mode 100644 index 22da6e6..0000000 --- a/headers/os/package/hpkg/BlockBufferCache.h +++ /dev/null @@ -1,49 +0,0 @@ -/* - * Copyright 2009,2011, Haiku, Inc. - * Distributed under the terms of the MIT License. - */ -#ifndef _PACKAGE__HPKG__BLOCK_BUFFER_CACHE_H_ -#define _PACKAGE__HPKG__BLOCK_BUFFER_CACHE_H_ - - -#include <SupportDefs.h> - -#include <package/hpkg/BufferCache.h> - - -namespace BPackageKit { - -namespace BHPKG { - - -namespace BPrivate { - class BlockBufferCacheImpl; -} -using BPrivate::BlockBufferCacheImpl; - - -class BBlockBufferCache : public BBufferCache, public BBufferCacheLockable { -public: - BBlockBufferCache(size_t blockSize, - uint32 maxCachedBlocks); - virtual ~BBlockBufferCache(); - - virtual status_t Init(); - - virtual CachedBuffer* GetBuffer(size_t size, - CachedBuffer** owner = NULL, - bool* _newBuffer = NULL); - virtual void PutBufferAndCache(CachedBuffer** owner); - virtual void PutBuffer(CachedBuffer** owner); - -private: - BlockBufferCacheImpl* fImpl; -}; - - -} // namespace BHPKG - -} // namespace BPackageKit - - -#endif // _PACKAGE__HPKG__BLOCK_BUFFER_CACHE_H_ diff --git a/headers/os/package/hpkg/BlockBufferPool.h b/headers/os/package/hpkg/BlockBufferPool.h new file mode 100644 index 0000000..c9457a4 --- /dev/null +++ b/headers/os/package/hpkg/BlockBufferPool.h @@ -0,0 +1,49 @@ +/* + * Copyright 2009,2011, Haiku, Inc. + * Distributed under the terms of the MIT License. + */ +#ifndef _PACKAGE__HPKG__BLOCK_BUFFER_POOL_H_ +#define _PACKAGE__HPKG__BLOCK_BUFFER_POOL_H_ + + +#include <SupportDefs.h> + +#include <package/hpkg/BufferPool.h> + + +namespace BPackageKit { + +namespace BHPKG { + + +namespace BPrivate { + class BlockBufferPoolImpl; +} +using BPrivate::BlockBufferPoolImpl; + + +class BBlockBufferPool : public BBufferPool, public BBufferPoolLockable { +public: + BBlockBufferPool(size_t blockSize, + uint32 maxCachedBlocks); + virtual ~BBlockBufferPool(); + + virtual status_t Init(); + + virtual PoolBuffer* GetBuffer(size_t size, + PoolBuffer** owner = NULL, + bool* _newBuffer = NULL); + virtual void PutBufferAndCache(PoolBuffer** owner); + virtual void PutBuffer(PoolBuffer** owner); + +private: + BlockBufferPoolImpl* fImpl; +}; + + +} // namespace BHPKG + +} // namespace BPackageKit + + +#endif // _PACKAGE__HPKG__BLOCK_BUFFER_POOL_H_ diff --git a/headers/os/package/hpkg/BlockBufferPoolNoLock.h b/headers/os/package/hpkg/BlockBufferPoolNoLock.h new file mode 100644 index 0000000..cf89904 --- /dev/null +++ b/headers/os/package/hpkg/BlockBufferPoolNoLock.h @@ -0,0 +1,33 @@ +/* + * Copyright 2009,2011, Haiku, Inc. + * Distributed under the terms of the MIT License. + */ +#ifndef _PACKAGE__BLOCK_BUFFER_POOL_NO_LOCK_H +#define _PACKAGE__BLOCK_BUFFER_POOL_NO_LOCK_H + + +#include <package/hpkg/BlockBufferPool.h> + + +namespace BPackageKit { + +namespace BHPKG { + + +class BBlockBufferPoolNoLock : public BHPKG::BBlockBufferPool { +public: + BBlockBufferPoolNoLock(size_t blockSize, + uint32 maxCachedBlocks); + virtual ~BBlockBufferPoolNoLock(); + + virtual bool Lock(); + virtual void Unlock(); +}; + + +} // namespace BHPKG + +} // namespace BPackageKit + + +#endif // _PACKAGE__BLOCK_BUFFER_POOL_NO_LOCK_H diff --git a/headers/os/package/hpkg/BufferCache.h b/headers/os/package/hpkg/BufferPool.h similarity index 54% rename from headers/os/package/hpkg/BufferCache.h rename to headers/os/package/hpkg/BufferPool.h index 7bb9e2f..90b0ef2 100644 --- a/headers/os/package/hpkg/BufferCache.h +++ b/headers/os/package/hpkg/BufferPool.h @@ -2,8 +2,8 @@ * Copyright 2009,2011, Haiku, Inc. * Distributed under the terms of the MIT License. */ -#ifndef _PACKAGE__HPKG__BUFFER_CACHE_H_ -#define _PACKAGE__HPKG__BUFFER_CACHE_H_ +#ifndef _PACKAGE__HPKG__BUFFER_POOL_H_ +#define _PACKAGE__HPKG__BUFFER_POOL_H_ #include <stddef.h> @@ -15,31 +15,31 @@ namespace BHPKG { namespace BPrivate { - class CachedBuffer; + class PoolBuffer; } -using BPrivate::CachedBuffer; +using BPrivate::PoolBuffer; -class BBufferCache { +class BBufferPool { public: - virtual ~BBufferCache(); + virtual ~BBufferPool(); - virtual CachedBuffer* GetBuffer(size_t size, - CachedBuffer** owner = NULL, + virtual PoolBuffer* GetBuffer(size_t size, + PoolBuffer** owner = NULL, bool* _newBuffer = NULL) = 0; - virtual void PutBufferAndCache(CachedBuffer** owner) = 0; + virtual void PutBufferAndCache(PoolBuffer** owner) = 0; // caller is buffer owner and wants the // buffer cached, if possible - virtual void PutBuffer(CachedBuffer** owner) = 0; + virtual void PutBuffer(PoolBuffer** owner) = 0; // puts the buffer for good, owner might // have called PutBufferAndCache() before // and might not own a buffer anymore }; -class BBufferCacheLockable { +class BBufferPoolLockable { public: - virtual ~BBufferCacheLockable(); + virtual ~BBufferPoolLockable(); virtual bool Lock() = 0; virtual void Unlock() = 0; @@ -51,4 +51,4 @@ public: } // namespace BPackageKit -#endif // _PACKAGE__HPKG__BUFFER_CACHE_H_ +#endif // _PACKAGE__HPKG__BUFFER_POOL_H_ diff --git a/headers/os/package/hpkg/PackageDataReader.h b/headers/os/package/hpkg/PackageDataReader.h index 8a4e5a8..1152fba 100644 --- a/headers/os/package/hpkg/PackageDataReader.h +++ b/headers/os/package/hpkg/PackageDataReader.h @@ -14,21 +14,21 @@ namespace BPackageKit { namespace BHPKG { -class BBufferCache; +class BBufferPool; class BPackageData; class BPackageDataReaderFactory { public: BPackageDataReaderFactory( - BBufferCache* bufferCache); + BBufferPool* bufferPool); status_t CreatePackageDataReader(BDataReader* dataReader, const BPackageData& data, BAbstractBufferedDataReader*& _reader); private: - BBufferCache* fBufferCache; + BBufferPool* fBufferPool; }; diff --git a/headers/os/package/hpkg/v1/PackageDataReader.h b/headers/os/package/hpkg/v1/PackageDataReader.h index 15d94f6..b0b30ce 100644 --- a/headers/os/package/hpkg/v1/PackageDataReader.h +++ b/headers/os/package/hpkg/v1/PackageDataReader.h @@ -14,7 +14,7 @@ namespace BPackageKit { namespace BHPKG { -class BBufferCache; +class BBufferPool; namespace V1 { @@ -26,14 +26,14 @@ class BPackageData; class BPackageDataReaderFactory { public: BPackageDataReaderFactory( - BBufferCache* bufferCache); + BBufferPool* bufferPool); status_t CreatePackageDataReader(BDataReader* dataReader, const BPackageData& data, BAbstractBufferedDataReader*& _reader); private: - BBufferCache* fBufferCache; + BBufferPool* fBufferPool; }; diff --git a/headers/private/package/hpkg/BlockBufferCacheImpl.h b/headers/private/package/hpkg/BlockBufferCacheImpl.h deleted file mode 100644 index 1b6df57..0000000 --- a/headers/private/package/hpkg/BlockBufferCacheImpl.h +++ /dev/null @@ -1,67 +0,0 @@ -/* - * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. - * Copyright 2011, Oliver Tappe <zooey@xxxxxxxxxxxxxxx> - * Distributed under the terms of the MIT License. - */ -#ifndef _PACKAGE__HPKG__PRIVATE__BLOCK_BUFFER_CACHE_H_ -#define _PACKAGE__HPKG__PRIVATE__BLOCK_BUFFER_CACHE_H_ - - -#include <SupportDefs.h> - -#include <util/DoublyLinkedList.h> - -#include <package/hpkg/BufferCache.h> - - -namespace BPackageKit { - -namespace BHPKG { - -namespace BPrivate { - - -class CachedBuffer; - - -class BlockBufferCacheImpl : public BBufferCache { -public: - BlockBufferCacheImpl(size_t blockSize, - uint32 maxCachedBlocks, - BBufferCacheLockable* lockable); - ~BlockBufferCacheImpl(); - - status_t Init(); - - CachedBuffer* GetBuffer(size_t size, - CachedBuffer** owner = NULL, - bool* _newBuffer = NULL); - void PutBufferAndCache(CachedBuffer** owner); - void PutBuffer(CachedBuffer** owner); - -private: - typedef DoublyLinkedList<CachedBuffer> BufferList; - -private: - CachedBuffer* _AllocateBuffer(size_t size, - CachedBuffer** owner, bool* _newBuffer); - // object must not be locked - -private: - size_t fBlockSize; - uint32 fMaxCachedBlocks; - uint32 fAllocatedBlocks; - BufferList fUnusedBuffers; - BufferList fCachedBuffers; - BBufferCacheLockable* fLockable; -}; - - -} // namespace BPrivate - -} // namespace BHPKG - -} // namespace BPackageKit - - -#endif // _PACKAGE__HPKG__PRIVATE__BLOCK_BUFFER_CACHE_H_ diff --git a/headers/private/package/hpkg/BlockBufferPoolImpl.h b/headers/private/package/hpkg/BlockBufferPoolImpl.h new file mode 100644 index 0000000..8fa4faf --- /dev/null +++ b/headers/private/package/hpkg/BlockBufferPoolImpl.h @@ -0,0 +1,67 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Copyright 2011, Oliver Tappe <zooey@xxxxxxxxxxxxxxx> + * Distributed under the terms of the MIT License. + */ +#ifndef _PACKAGE__HPKG__PRIVATE__BLOCK_BUFFER_POOL_H_ +#define _PACKAGE__HPKG__PRIVATE__BLOCK_BUFFER_POOL_H_ + + +#include <SupportDefs.h> + +#include <util/DoublyLinkedList.h> + +#include <package/hpkg/BufferPool.h> + + +namespace BPackageKit { + +namespace BHPKG { + +namespace BPrivate { + + +class PoolBuffer; + + +class BlockBufferPoolImpl : public BBufferPool { +public: + BlockBufferPoolImpl(size_t blockSize, + uint32 maxCachedBlocks, + BBufferPoolLockable* lockable); + ~BlockBufferPoolImpl(); + + status_t Init(); + + PoolBuffer* GetBuffer(size_t size, + PoolBuffer** owner = NULL, + bool* _newBuffer = NULL); + void PutBufferAndCache(PoolBuffer** owner); + void PutBuffer(PoolBuffer** owner); + +private: + typedef DoublyLinkedList<PoolBuffer> BufferList; + +private: + PoolBuffer* _AllocateBuffer(size_t size, + PoolBuffer** owner, bool* _newBuffer); + // object must not be locked + +private: + size_t fBlockSize; + uint32 fMaxCachedBlocks; + uint32 fAllocatedBlocks; + BufferList fUnusedBuffers; + BufferList fCachedBuffers; + BBufferPoolLockable* fLockable; +}; + + +} // namespace BPrivate + +} // namespace BHPKG + +} // namespace BPackageKit + + +#endif // _PACKAGE__HPKG__PRIVATE__BLOCK_BUFFER_POOL_H_ diff --git a/headers/private/package/hpkg/HPKGDefsPrivate.h b/headers/private/package/hpkg/HPKGDefsPrivate.h index edbdb7f..7b29f00 100644 --- a/headers/private/package/hpkg/HPKGDefsPrivate.h +++ b/headers/private/package/hpkg/HPKGDefsPrivate.h @@ -25,6 +25,9 @@ struct hpkg_header { uint16 version; uint64 total_size; + // heap +// uint64 heap_compression; + // package attributes section uint32 attributes_compression; uint32 attributes_length_compressed; diff --git a/headers/private/package/hpkg/CachedBuffer.h b/headers/private/package/hpkg/PoolBuffer.h similarity index 52% rename from headers/private/package/hpkg/CachedBuffer.h rename to headers/private/package/hpkg/PoolBuffer.h index 5c99327..d82cd13 100644 --- a/headers/private/package/hpkg/CachedBuffer.h +++ b/headers/private/package/hpkg/PoolBuffer.h @@ -3,15 +3,15 @@ * Copyright 2011, Oliver Tappe <zooey@xxxxxxxxxxxxxxx> * Distributed under the terms of the MIT License. */ -#ifndef _PACKAGE__HPKG__PRIVATE__BUFFER_CACHE_H_ -#define _PACKAGE__HPKG__PRIVATE__BUFFER_CACHE_H_ +#ifndef _PACKAGE__HPKG__PRIVATE__POOL_BUFFER_H_ +#define _PACKAGE__HPKG__PRIVATE__POOL_BUFFER_H_ #include <stddef.h> #include <util/DoublyLinkedList.h> -#include <package/hpkg/BufferCache.h> +#include <package/hpkg/BufferPool.h> namespace BPackageKit { @@ -21,63 +21,63 @@ namespace BHPKG { namespace BPrivate { -class CachedBuffer : public DoublyLinkedListLinkImpl<CachedBuffer> { +class PoolBuffer : public DoublyLinkedListLinkImpl<PoolBuffer> { public: - CachedBuffer(size_t size); - ~CachedBuffer(); + PoolBuffer(size_t size); + ~PoolBuffer(); void* Buffer() const { return fBuffer; } size_t Size() const { return fSize; } // implementation private - CachedBuffer** Owner() const { return fOwner; } - void SetOwner(CachedBuffer** owner) + PoolBuffer** Owner() const { return fOwner; } + void SetOwner(PoolBuffer** owner) { fOwner = owner; } void SetCached(bool cached) { fCached = cached; } bool IsCached() const { return fCached; } private: - CachedBuffer** fOwner; + PoolBuffer** fOwner; void* fBuffer; size_t fSize; bool fCached; }; -class CachedBufferPutter { +class PoolBufferPutter { public: - CachedBufferPutter(BBufferCache* cache, CachedBuffer** owner) + PoolBufferPutter(BBufferPool* pool, PoolBuffer** owner) : - fCache(cache), + fPool(pool), fOwner(owner), fBuffer(NULL) { } - CachedBufferPutter(BBufferCache* cache, CachedBuffer* buffer) + PoolBufferPutter(BBufferPool* pool, PoolBuffer* buffer) : - fCache(cache), + fPool(pool), fOwner(NULL), fBuffer(buffer) { } - ~CachedBufferPutter() + ~PoolBufferPutter() { - if (fCache != NULL) { + if (fPool != NULL) { if (fOwner != NULL) - fCache->PutBufferAndCache(fOwner); + fPool->PutBufferAndCache(fOwner); else if (fBuffer != NULL) - fCache->PutBuffer(&fBuffer); + fPool->PutBuffer(&fBuffer); } } private: - BBufferCache* fCache; - CachedBuffer** fOwner; - CachedBuffer* fBuffer; + BBufferPool* fPool; + PoolBuffer** fOwner; + PoolBuffer* fBuffer; }; @@ -88,4 +88,4 @@ private: } // namespace BPackageKit -#endif // _PACKAGE__HPKG__PRIVATE__BUFFER_CACHE_H_ +#endif // _PACKAGE__HPKG__PRIVATE__POOL_BUFFER_H_ diff --git a/src/add-ons/kernel/file_systems/packagefs/Jamfile b/src/add-ons/kernel/file_systems/packagefs/Jamfile index a100e16..28f9826 100644 --- a/src/add-ons/kernel/file_systems/packagefs/Jamfile +++ b/src/add-ons/kernel/file_systems/packagefs/Jamfile @@ -23,7 +23,7 @@ HAIKU_PACKAGE_FS_SOURCES = AttributeDirectoryCookie.cpp AttributeIndex.cpp AutoPackageAttributes.cpp - BlockBufferCacheKernel.cpp + BlockBufferPoolKernel.cpp DebugSupport.cpp Dependency.cpp Directory.cpp @@ -70,14 +70,14 @@ HAIKU_PACKAGE_FS_SHARED_SOURCES = ; HAIKU_PACKAGE_FS_PACKAGE_READER_SOURCES = - BlockBufferCacheImpl.cpp - BufferCache.cpp - CachedBuffer.cpp + BlockBufferPoolImpl.cpp + BufferPool.cpp DataOutput.cpp DataReader.cpp ErrorOutput.cpp FDDataReader.cpp HPKGDefs.cpp + PoolBuffer.cpp PackageContentHandler.cpp PackageData.cpp PackageDataReader.cpp diff --git a/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferCacheKernel.cpp b/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferCacheKernel.cpp deleted file mode 100644 index fdc27b8..0000000 --- a/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferCacheKernel.cpp +++ /dev/null @@ -1,37 +0,0 @@ -/* - * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. - * Distributed under the terms of the MIT License. - */ - - -#include "BlockBufferCacheKernel.h" - - -BlockBufferCacheKernel::BlockBufferCacheKernel(size_t blockSize, - uint32 maxCachedBlocks) - : - BlockBufferCacheImpl(blockSize, maxCachedBlocks, this) -{ - mutex_init(&fLock, "BlockBufferCache"); -} - - -BlockBufferCacheKernel::~BlockBufferCacheKernel() -{ - mutex_destroy(&fLock); -} - - -bool -BlockBufferCacheKernel::Lock() -{ - mutex_lock(&fLock); - return true; -} - - -void -BlockBufferCacheKernel::Unlock() -{ - mutex_unlock(&fLock); -} diff --git a/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferCacheKernel.h b/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferCacheKernel.h deleted file mode 100644 index 3756e02..0000000 --- a/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferCacheKernel.h +++ /dev/null @@ -1,34 +0,0 @@ -/* - * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. - * Distributed under the terms of the MIT License. - */ -#ifndef BLOCK_BUFFER_CACHE_KERNEL_H -#define BLOCK_BUFFER_CACHE_KERNEL_H - - -#include <lock.h> - -#include <package/hpkg/BlockBufferCacheImpl.h> -#include <package/hpkg/BufferCache.h> - - -using BPackageKit::BHPKG::BBufferCacheLockable; -using BPackageKit::BHPKG::BPrivate::BlockBufferCacheImpl; - - -class BlockBufferCacheKernel - : public BlockBufferCacheImpl, BBufferCacheLockable { -public: - BlockBufferCacheKernel(size_t blockSize, - uint32 maxCachedBlocks); - virtual ~BlockBufferCacheKernel(); - - virtual bool Lock(); - virtual void Unlock(); - -private: - mutex fLock; -}; - - -#endif // BLOCK_BUFFER_CACHE_KERNEL_H diff --git a/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferPoolKernel.cpp b/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferPoolKernel.cpp new file mode 100644 index 0000000..5446d41 --- /dev/null +++ b/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferPoolKernel.cpp @@ -0,0 +1,37 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. + */ + + +#include "BlockBufferPoolKernel.h" + + +BlockBufferPoolKernel::BlockBufferPoolKernel(size_t blockSize, + uint32 maxCachedBlocks) + : + BlockBufferPoolImpl(blockSize, maxCachedBlocks, this) +{ + mutex_init(&fLock, "BlockBufferPool"); +} + + +BlockBufferPoolKernel::~BlockBufferPoolKernel() +{ + mutex_destroy(&fLock); +} + + +bool +BlockBufferPoolKernel::Lock() +{ + mutex_lock(&fLock); + return true; +} + + +void +BlockBufferPoolKernel::Unlock() +{ + mutex_unlock(&fLock); +} diff --git a/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferPoolKernel.h b/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferPoolKernel.h new file mode 100644 index 0000000..6812d95 --- /dev/null +++ b/src/add-ons/kernel/file_systems/packagefs/package/BlockBufferPoolKernel.h @@ -0,0 +1,33 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. + */ +#ifndef BLOCK_BUFFER_POOL_KERNEL_H +#define BLOCK_BUFFER_POOL_KERNEL_H + + +#include <lock.h> + +#include <package/hpkg/BlockBufferPoolImpl.h> +#include <package/hpkg/BufferPool.h> + + +using BPackageKit::BHPKG::BBufferPoolLockable; +using BPackageKit::BHPKG::BPrivate::BlockBufferPoolImpl; + + +class BlockBufferPoolKernel : public BlockBufferPoolImpl, BBufferPoolLockable { +public: + BlockBufferPoolKernel(size_t blockSize, + uint32 maxCachedBlocks); + virtual ~BlockBufferPoolKernel(); + + virtual bool Lock(); + virtual void Unlock(); + +private: + mutex fLock; +}; + + +#endif // BLOCK_BUFFER_POOL_KERNEL_H diff --git a/src/add-ons/kernel/file_systems/packagefs/package/GlobalFactory.cpp b/src/add-ons/kernel/file_systems/packagefs/package/GlobalFactory.cpp index afec712..9f9d2a3 100644 --- a/src/add-ons/kernel/file_systems/packagefs/package/GlobalFactory.cpp +++ b/src/add-ons/kernel/file_systems/packagefs/package/GlobalFactory.cpp @@ -20,10 +20,10 @@ static const uint32 kMaxCachedBuffers = 32; GlobalFactory::GlobalFactory() : - fBufferCache(BPackageKit::BHPKG::B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB, + fBufferPool(BPackageKit::BHPKG::B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB, kMaxCachedBuffers), - fPackageDataReaderFactoryV1(&fBufferCache), - fPackageDataReaderFactoryV2(&fBufferCache) + fPackageDataReaderFactoryV1(&fBufferPool), + fPackageDataReaderFactoryV2(&fBufferPool) { STATIC_ASSERT((int)BPackageKit::BHPKG::B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB == (int)BPackageKit::BHPKG::V1::B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB); @@ -93,7 +93,7 @@ GlobalFactory::CreatePackageDataReader(BDataReader* dataReader, status_t GlobalFactory::_Init() { - status_t error = fBufferCache.Init(); + status_t error = fBufferPool.Init(); if (error != B_OK) return error; diff --git a/src/add-ons/kernel/file_systems/packagefs/package/GlobalFactory.h b/src/add-ons/kernel/file_systems/packagefs/package/GlobalFactory.h index 929e956..ca06a9d 100644 --- a/src/add-ons/kernel/file_systems/packagefs/package/GlobalFactory.h +++ b/src/add-ons/kernel/file_systems/packagefs/package/GlobalFactory.h @@ -9,7 +9,7 @@ #include <package/hpkg/PackageDataReader.h> #include <package/hpkg/v1/PackageDataReader.h> -#include "BlockBufferCacheKernel.h" +#include "BlockBufferPoolKernel.h" using BPackageKit::BHPKG::BDataReader; @@ -44,7 +44,7 @@ private: private: static GlobalFactory* sDefaultInstance; - BlockBufferCacheKernel fBufferCache; + BlockBufferPoolKernel fBufferPool; BPackageDataReaderFactoryV1 fPackageDataReaderFactoryV1; BPackageDataReaderFactoryV2 fPackageDataReaderFactoryV2; }; diff --git a/src/bin/package/command_extract.cpp b/src/bin/package/command_extract.cpp index deab785..9d85a1f 100644 --- a/src/bin/package/command_extract.cpp +++ b/src/bin/package/command_extract.cpp @@ -25,7 +25,7 @@ #include <util/OpenHashTable.h> -#include <package/BlockBufferCacheNoLock.h> +#include <package/hpkg/BlockBufferPoolNoLock.h> #include <package/hpkg/PackageContentHandler.h> #include <package/hpkg/PackageDataReader.h> #include <package/hpkg/PackageEntry.h> @@ -41,8 +41,8 @@ #include "package.h" -using BPackageKit::BBlockBufferCacheNoLock; using BPackageKit::BHPKG::BAbstractBufferedDataReader; +using BPackageKit::BHPKG::BBlockBufferPoolNoLock; using BPackageKit::BHPKG::BBufferDataReader; using BPackageKit::BHPKG::BDataReader; using BPackageKit::BHPKG::BFDDataReader; @@ -229,7 +229,7 @@ template<typename VersionPolicy> struct PackageContentExtractHandler : VersionPolicy::PackageContentHandler { PackageContentExtractHandler(int packageFileFD) : - fBufferCache(VersionPolicy::kDefaultDataChunkSize, 2), + fBufferPool(VersionPolicy::kDefaultDataChunkSize, 2), fPackageFileReader(packageFileFD), fDataBuffer(NULL), fDataBufferSize(0), @@ -247,7 +247,7 @@ struct PackageContentExtractHandler : VersionPolicy::PackageContentHandler { status_t Init() { - status_t error = fBufferCache.Init(); + status_t error = fBufferPool.Init(); if (error != B_OK) return error; @@ -648,7 +648,7 @@ private: // create a PackageDataReader BAbstractBufferedDataReader* reader; status_t error = typename VersionPolicy::PackageDataReaderFactory( - &fBufferCache) + &fBufferPool) .CreatePackageDataReader(dataReader, data, reader); if (error != B_OK) return error; @@ -688,7 +688,7 @@ private: } private: - BBlockBufferCacheNoLock fBufferCache; + BBlockBufferPoolNoLock fBufferPool; BFDDataReader fPackageFileReader; void* fDataBuffer; size_t fDataBufferSize; diff --git a/src/build/libpackage/Jamfile b/src/build/libpackage/Jamfile index ab11171..e558365 100644 --- a/src/build/libpackage/Jamfile +++ b/src/build/libpackage/Jamfile @@ -21,10 +21,11 @@ USES_BE_API on libpackage_build.so = true ; HPKG_SOURCES = AttributeDataReader.cpp - BlockBufferCache.cpp - BlockBufferCacheImpl.cpp - BufferCache.cpp - CachedBuffer.cpp + BlockBufferPool.cpp + BlockBufferPoolImpl.cpp + BlockBufferPoolNoLock.cpp + BufferPool.cpp + PoolBuffer.cpp DataOutput.cpp DataReader.cpp ErrorOutput.cpp @@ -75,7 +76,6 @@ BuildPlatformSharedLibrary libpackage_build.so ActivationTransaction.cpp AddRepositoryRequest.cpp Attributes.cpp - BlockBufferCacheNoLock.cpp ChecksumAccessors.cpp Context.cpp DownloadFileRequest.cpp diff --git a/src/kits/package/BlockBufferCacheNoLock.cpp b/src/kits/package/BlockBufferCacheNoLock.cpp deleted file mode 100644 index 261703e0..0000000 --- a/src/kits/package/BlockBufferCacheNoLock.cpp +++ /dev/null @@ -1,40 +0,0 @@ -/* - * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. - * Copyright 2011, Oliver Tappe <zooey@xxxxxxxxxxxxxxx> - * Distributed under the terms of the MIT License. - */ - - -#include <package/BlockBufferCacheNoLock.h> - - -namespace BPackageKit { - - -BBlockBufferCacheNoLock::BBlockBufferCacheNoLock(size_t blockSize, - uint32 maxCachedBlocks) - : - BBlockBufferCache(blockSize, maxCachedBlocks) -{ -} - - -BBlockBufferCacheNoLock::~BBlockBufferCacheNoLock() -{ -} - - -bool -BBlockBufferCacheNoLock::Lock() -{ - return true; -} - - -void -BBlockBufferCacheNoLock::Unlock() -{ -} - - -} // namespace BPackageKit diff --git a/src/kits/package/Jamfile b/src/kits/package/Jamfile index 0588901..ac7bd2c 100644 --- a/src/kits/package/Jamfile +++ b/src/kits/package/Jamfile @@ -12,10 +12,10 @@ SEARCH_SOURCE += [ FDirName $(HAIKU_TOP) src kits package solver ] ; HPKG_SOURCES = AttributeDataReader.cpp - BlockBufferCache.cpp - BlockBufferCacheImpl.cpp - BufferCache.cpp - CachedBuffer.cpp + BlockBufferPool.cpp + BlockBufferPoolImpl.cpp + BlockBufferPoolNoLock.cpp + BufferPool.cpp DataOutput.cpp DataReader.cpp ErrorOutput.cpp @@ -26,10 +26,12 @@ HPKG_SOURCES = PackageDataReader.cpp PackageEntry.cpp PackageEntryAttribute.cpp + PackageFileHeapWriter.cpp PackageReader.cpp PackageReaderImpl.cpp PackageWriter.cpp PackageWriterImpl.cpp + PoolBuffer.cpp ReaderImplBase.cpp RepositoryReader.cpp RepositoryReaderImpl.cpp @@ -66,7 +68,6 @@ SharedLibrary libpackage.so ActivationTransaction.cpp AddRepositoryRequest.cpp Attributes.cpp - BlockBufferCacheNoLock.cpp ChecksumAccessors.cpp Context.cpp DaemonClient.cpp diff --git a/src/kits/package/hpkg/BlockBufferCache.cpp b/src/kits/package/hpkg/BlockBufferPool.cpp similarity index 54% rename from src/kits/package/hpkg/BlockBufferCache.cpp rename to src/kits/package/hpkg/BlockBufferPool.cpp index c4bde06..e1c0d3d 100644 --- a/src/kits/package/hpkg/BlockBufferCache.cpp +++ b/src/kits/package/hpkg/BlockBufferPool.cpp @@ -4,11 +4,11 @@ */ -#include <package/hpkg/BlockBufferCache.h> +#include <package/hpkg/BlockBufferPool.h> #include <new> -#include <package/hpkg/BlockBufferCacheImpl.h> +#include <package/hpkg/BlockBufferPoolImpl.h> namespace BPackageKit { @@ -16,22 +16,22 @@ namespace BPackageKit { namespace BHPKG { -BBlockBufferCache::BBlockBufferCache(size_t blockSize, uint32 maxCachedBlocks) +BBlockBufferPool::BBlockBufferPool(size_t blockSize, uint32 maxCachedBlocks) : - fImpl(new (std::nothrow) BlockBufferCacheImpl(blockSize, maxCachedBlocks, + fImpl(new (std::nothrow) BlockBufferPoolImpl(blockSize, maxCachedBlocks, this)) { } -BBlockBufferCache::~BBlockBufferCache() +BBlockBufferPool::~BBlockBufferPool() { delete fImpl; } status_t -BBlockBufferCache::Init() +BBlockBufferPool::Init() { if (fImpl == NULL) return B_NO_MEMORY; @@ -40,8 +40,8 @@ BBlockBufferCache::Init() } -CachedBuffer* -BBlockBufferCache::GetBuffer(size_t size, CachedBuffer** owner, +PoolBuffer* +BBlockBufferPool::GetBuffer(size_t size, PoolBuffer** owner, bool* _newBuffer) { if (fImpl == NULL) @@ -52,7 +52,7 @@ BBlockBufferCache::GetBuffer(size_t size, CachedBuffer** owner, void -BBlockBufferCache::PutBufferAndCache(CachedBuffer** owner) +BBlockBufferPool::PutBufferAndCache(PoolBuffer** owner) { if (fImpl != NULL) fImpl->PutBufferAndCache(owner); @@ -60,7 +60,7 @@ BBlockBufferCache::PutBufferAndCache(CachedBuffer** owner) void -BBlockBufferCache::PutBuffer(CachedBuffer** owner) +BBlockBufferPool::PutBuffer(PoolBuffer** owner) { if (fImpl != NULL) fImpl->PutBuffer(owner); diff --git a/src/kits/package/hpkg/BlockBufferCacheImpl.cpp b/src/kits/package/hpkg/BlockBufferPoolImpl.cpp similarity index 69% rename from src/kits/package/hpkg/BlockBufferCacheImpl.cpp rename to src/kits/package/hpkg/BlockBufferPoolImpl.cpp index bf77cdd..6ec3268 100644 --- a/src/kits/package/hpkg/BlockBufferCacheImpl.cpp +++ b/src/kits/package/hpkg/BlockBufferPoolImpl.cpp @@ -5,14 +5,14 @@ */ -#include <package/hpkg/BlockBufferCacheImpl.h> +#include <package/hpkg/BlockBufferPoolImpl.h> #include <algorithm> #include <new> #include <AutoLocker.h> -#include <package/hpkg/CachedBuffer.h> +#include <package/hpkg/PoolBuffer.h> namespace BPackageKit { @@ -22,11 +22,11 @@ namespace BHPKG { namespace BPrivate { -// #pragma mark - BlockBufferCacheImpl +// #pragma mark - BlockBufferPoolImpl -BlockBufferCacheImpl::BlockBufferCacheImpl(size_t blockSize, - uint32 maxCachedBlocks, BBufferCacheLockable* lockable) +BlockBufferPoolImpl::BlockBufferPoolImpl(size_t blockSize, + uint32 maxCachedBlocks, BBufferPoolLockable* lockable) : fBlockSize(blockSize), fMaxCachedBlocks(maxCachedBlocks), @@ -36,36 +36,36 @@ BlockBufferCacheImpl::BlockBufferCacheImpl(size_t blockSize, } -BlockBufferCacheImpl::~BlockBufferCacheImpl() +BlockBufferPoolImpl::~BlockBufferPoolImpl() { // delete all cached blocks - while (CachedBuffer* block = fCachedBuffers.RemoveHead()) + while (PoolBuffer* block = fCachedBuffers.RemoveHead()) delete block; - while (CachedBuffer* block = fUnusedBuffers.RemoveHead()) + while (PoolBuffer* block = fUnusedBuffers.RemoveHead()) delete block; } status_t -BlockBufferCacheImpl::Init() +BlockBufferPoolImpl::Init() { return B_OK; } -CachedBuffer* -BlockBufferCacheImpl::GetBuffer(size_t size, CachedBuffer** owner, bool* _newBuffer) +PoolBuffer* +BlockBufferPoolImpl::GetBuffer(size_t size, PoolBuffer** owner, bool* _newBuffer) { // for sizes greater than the block size, we always allocate a new buffer if (size > fBlockSize) return _AllocateBuffer(size, owner, _newBuffer); - AutoLocker<BBufferCacheLockable> locker(fLockable); + AutoLocker<BBufferPoolLockable> locker(fLockable); // if an owner is given and the buffer is still cached, return it if (owner != NULL && *owner != NULL) { - CachedBuffer* buffer = *owner; + PoolBuffer* buffer = *owner; fCachedBuffers.Remove(buffer); if (_newBuffer != NULL) @@ -74,7 +74,7 @@ BlockBufferCacheImpl::GetBuffer(size_t size, CachedBuffer** owner, bool* _newBuf } // we need a new buffer -- try unused ones first - CachedBuffer* buffer = fUnusedBuffers.RemoveHead(); + PoolBuffer* buffer = fUnusedBuffers.RemoveHead(); if (buffer != NULL) { buffer->SetOwner(owner); @@ -108,9 +108,9 @@ BlockBufferCacheImpl::GetBuffer(size_t size, CachedBuffer** owner, bool* _newBuf void -BlockBufferCacheImpl::PutBufferAndCache(CachedBuffer** owner) +BlockBufferPoolImpl::PutBufferAndCache(PoolBuffer** owner) { - CachedBuffer* buffer = *owner; + PoolBuffer* buffer = *owner; // always delete buffers with non-standard size if (buffer->Size() != fBlockSize) { @@ -119,7 +119,7 @@ BlockBufferCacheImpl::PutBufferAndCache(CachedBuffer** owner) return; } - AutoLocker<BBufferCacheLockable> locker(fLockable); + AutoLocker<BBufferPoolLockable> locker(fLockable); // queue the cached buffer buffer->SetOwner(owner); @@ -128,7 +128,7 @@ BlockBufferCacheImpl::PutBufferAndCache(CachedBuffer** owner) if (fAllocatedBlocks > fMaxCachedBlocks) { // We have exceeded the limit -- we need to free a buffer. - CachedBuffer* otherBuffer = fUnusedBuffers.RemoveHead(); + PoolBuffer* otherBuffer = fUnusedBuffers.RemoveHead(); if (otherBuffer == NULL) { otherBuffer = fCachedBuffers.RemoveHead(); *otherBuffer->Owner() = NULL; @@ -141,11 +141,11 @@ BlockBufferCacheImpl::PutBufferAndCache(CachedBuffer** owner) void -BlockBufferCacheImpl::PutBuffer(CachedBuffer** owner) +BlockBufferPoolImpl::PutBuffer(PoolBuffer** owner) { - AutoLocker<BBufferCacheLockable> locker(fLockable); + AutoLocker<BBufferPoolLockable> locker(fLockable); - CachedBuffer* buffer = *owner; + PoolBuffer* buffer = *owner; if (buffer == NULL) return; @@ -165,11 +165,11 @@ BlockBufferCacheImpl::PutBuffer(CachedBuffer** owner) } -CachedBuffer* -BlockBufferCacheImpl::_AllocateBuffer(size_t size, CachedBuffer** owner, +PoolBuffer* +BlockBufferPoolImpl::_AllocateBuffer(size_t size, PoolBuffer** owner, bool* _newBuffer) { - CachedBuffer* buffer = new(std::nothrow) CachedBuffer( + PoolBuffer* buffer = new(std::nothrow) PoolBuffer( std::max(size, fBlockSize)); if (buffer == NULL || buffer->Buffer() == NULL) { delete buffer; @@ -181,7 +181,7 @@ BlockBufferCacheImpl::_AllocateBuffer(size_t size, CachedBuffer** owner, if (_newBuffer != NULL) *_newBuffer = true; - AutoLocker<BBufferCacheLockable> locker(fLockable); + AutoLocker<BBufferPoolLockable> locker(fLockable); fAllocatedBlocks++; if (owner != NULL) diff --git a/src/kits/package/hpkg/BlockBufferPoolNoLock.cpp b/src/kits/package/hpkg/BlockBufferPoolNoLock.cpp new file mode 100644 index 0000000..c13a95a --- /dev/null +++ b/src/kits/package/hpkg/BlockBufferPoolNoLock.cpp @@ -0,0 +1,44 @@ +/* + * Copyright 2009, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Copyright 2011, Oliver Tappe <zooey@xxxxxxxxxxxxxxx> + * Distributed under the terms of the MIT License. + */ + + +#include <package/hpkg/BlockBufferPoolNoLock.h> + + +namespace BPackageKit { + +namespace BHPKG { + + +BBlockBufferPoolNoLock::BBlockBufferPoolNoLock(size_t blockSize, + uint32 maxCachedBlocks) + : + BBlockBufferPool(blockSize, maxCachedBlocks) +{ +} + + +BBlockBufferPoolNoLock::~BBlockBufferPoolNoLock() +{ +} + + +bool +BBlockBufferPoolNoLock::Lock() +{ + return true; +} + + +void +BBlockBufferPoolNoLock::Unlock() +{ +} + + +} // namespace BHPKG + +} // namespace BPackageKit diff --git a/src/kits/package/hpkg/BufferCache.cpp b/src/kits/package/hpkg/BufferPool.cpp similarity index 66% rename from src/kits/package/hpkg/BufferCache.cpp rename to src/kits/package/hpkg/BufferPool.cpp index 8ada6b1..4cfdfa4 100644 --- a/src/kits/package/hpkg/BufferCache.cpp +++ b/src/kits/package/hpkg/BufferPool.cpp @@ -4,7 +4,7 @@ */ -#include <package/hpkg/BufferCache.h> +#include <package/hpkg/BufferPool.h> namespace BPackageKit { @@ -12,12 +12,12 @@ namespace BPackageKit { namespace BHPKG { -BBufferCache::~BBufferCache() +BBufferPool::~BBufferPool() { } -BBufferCacheLockable::~BBufferCacheLockable() +BBufferPoolLockable::~BBufferPoolLockable() { } diff --git a/src/kits/package/hpkg/PackageDataReader.cpp b/src/kits/package/hpkg/PackageDataReader.cpp index 66fcca3..6cccfe8 100644 --- a/src/kits/package/hpkg/PackageDataReader.cpp +++ b/src/kits/package/hpkg/PackageDataReader.cpp @@ -12,8 +12,8 @@ #include <new> #include <package/hpkg/HPKGDefsPrivate.h> -#include <package/hpkg/BufferCache.h> -#include <package/hpkg/CachedBuffer.h> +#include <package/hpkg/BufferPool.h> +#include <package/hpkg/PoolBuffer.h> #include <package/hpkg/DataOutput.h> #include <package/hpkg/PackageData.h> #include <package/hpkg/ZlibDecompressor.h> @@ -66,10 +66,10 @@ protected: class UncompressedPackageDataReader : public PackageDataReader { public: UncompressedPackageDataReader(BDataReader* dataReader, - BBufferCache* bufferCache) + BBufferPool* bufferPool) : PackageDataReader(dataReader), - fBufferCache(bufferCache) + fBufferPool(bufferPool) { } @@ -107,11 +107,11 @@ public: return B_BAD_VALUE; // get a temporary buffer - CachedBuffer* buffer = fBufferCache->GetBuffer( + PoolBuffer* buffer = fBufferPool->GetBuffer( kUncompressedReaderBufferSize); if (buffer == NULL) return B_NO_MEMORY; - CachedBufferPutter bufferPutter(fBufferCache, &buffer); + PoolBufferPutter bufferPutter(fBufferPool, &buffer); while (size > 0) { // read into the buffer @@ -134,7 +134,7 @@ public: } private: - BBufferCache* fBufferCache; + BBufferPool* fBufferPool; uint64 fOffset; uint64 fSize; }; @@ -145,10 +145,10 @@ private: class ZlibPackageDataReader : public PackageDataReader { public: - ZlibPackageDataReader(BDataReader* dataReader, BBufferCache* bufferCache) + ZlibPackageDataReader(BDataReader* dataReader, BBufferPool* bufferPool) : PackageDataReader(dataReader), - fBufferCache(bufferCache), + fBufferPool(bufferPool), fUncompressBuffer(NULL), fOffsetTable(NULL) { @@ -158,7 +158,7 @@ public: { delete[] fOffsetTable; - fBufferCache->PutBuffer(&fUncompressBuffer); + fBufferPool->PutBuffer(&fUncompressBuffer); } status_t Init(const BPackageData& data) @@ -218,11 +218,11 @@ public: // get our uncompressed chunk buffer back, if possible bool newBuffer; - if (fBufferCache->GetBuffer(fChunkSize, &fUncompressBuffer, &newBuffer) + if (fBufferPool->GetBuffer(fChunkSize, &fUncompressBuffer, &newBuffer) == NULL) { return B_NO_MEMORY; } - CachedBufferPutter uncompressBufferPutter(fBufferCache, + PoolBufferPutter uncompressBufferPutter(fBufferPool, &fUncompressBuffer); if (newBuffer) @@ -281,10 +281,10 @@ private: compressedSize); } else { // read to a read buffer and uncompress - CachedBuffer* readBuffer = fBufferCache->GetBuffer(fChunkSize); + PoolBuffer* readBuffer = fBufferPool->GetBuffer(fChunkSize); if (readBuffer == NULL) return B_NO_MEMORY; - CachedBufferPutter readBufferPutter(fBufferCache, readBuffer); + PoolBufferPutter readBufferPutter(fBufferPool, readBuffer); error = fDataReader->ReadData(offset, readBuffer->Buffer(), compressedSize); @@ -378,8 +378,8 @@ private: } private: - BBufferCache* fBufferCache; - CachedBuffer* fUncompressBuffer; + BBufferPool* fBufferPool; + PoolBuffer* fUncompressBuffer; int64 fUncompressedChunk; uint64 fOffset; @@ -397,9 +397,9 @@ private: // #pragma mark - BPackageDataReaderFactory -BPackageDataReaderFactory::BPackageDataReaderFactory(BBufferCache* bufferCache) +BPackageDataReaderFactory::BPackageDataReaderFactory(BBufferPool* bufferPool) : - fBufferCache(bufferCache) + fBufferPool(bufferPool) { } @@ -413,11 +413,11 @@ BPackageDataReaderFactory::CreatePackageDataReader(BDataReader* dataReader, switch (data.Compression()) { case B_HPKG_COMPRESSION_NONE: reader = new(std::nothrow) UncompressedPackageDataReader( - dataReader, fBufferCache); + dataReader, fBufferPool); break; case B_HPKG_COMPRESSION_ZLIB: reader = new(std::nothrow) ZlibPackageDataReader(dataReader, - fBufferCache); + fBufferPool); break; default: return B_BAD_VALUE; diff --git a/src/kits/package/hpkg/PackageWriterImpl.cpp b/src/kits/package/hpkg/PackageWriterImpl.cpp index 35c13e4..9e994aa 100644 --- a/src/kits/package/hpkg/PackageWriterImpl.cpp +++ b/src/kits/package/hpkg/PackageWriterImpl.cpp @@ -26,8 +26,7 @@ #include <fs_attr.h> #include <Path.h> -#include <package/BlockBufferCacheNoLock.h> - +#include <package/hpkg/BlockBufferPoolNoLock.h> #include <package/hpkg/PackageAttributeValue.h> #include <package/hpkg/PackageContentHandler.h> #include <package/hpkg/PackageData.h> @@ -879,7 +878,7 @@ PackageWriterImpl::_UpdateReadPackageInfo() memcpy(valueBuffer, value.data.raw, value.data.size); } else { // data on heap -- read from there - BBlockBufferCacheNoLock bufferCache(16 * 1024, 1); + BBlockBufferPoolNoLock bufferCache(16 * 1024, 1); status_t error = bufferCache.Init(); if (error != B_OK) { fListener->PrintError("Failed to initialize buffer cache: %s\n", diff --git a/src/kits/package/hpkg/CachedBuffer.cpp b/src/kits/package/hpkg/PoolBuffer.cpp similarity index 77% rename from src/kits/package/hpkg/CachedBuffer.cpp rename to src/kits/package/hpkg/PoolBuffer.cpp index 2ab19b7..d3461ad 100644 --- a/src/kits/package/hpkg/CachedBuffer.cpp +++ b/src/kits/package/hpkg/PoolBuffer.cpp @@ -4,7 +4,7 @@ */ -#include <package/hpkg/CachedBuffer.h> +#include <package/hpkg/PoolBuffer.h> #include <stdlib.h> @@ -16,7 +16,7 @@ namespace BHPKG { namespace BPrivate { -CachedBuffer::CachedBuffer(size_t size) +PoolBuffer::PoolBuffer(size_t size) : fOwner(NULL), fBuffer(malloc(size)), @@ -26,7 +26,7 @@ CachedBuffer::CachedBuffer(size_t size) } -CachedBuffer::~CachedBuffer() +PoolBuffer::~PoolBuffer() { free(fBuffer); } diff --git a/src/kits/package/hpkg/RepositoryWriterImpl.cpp b/src/kits/package/hpkg/RepositoryWriterImpl.cpp index 975dfdf..c7c87dd 100644 --- a/src/kits/package/hpkg/RepositoryWriterImpl.cpp +++ b/src/kits/package/hpkg/RepositoryWriterImpl.cpp @@ -16,12 +16,12 @@ #include <AutoDeleter.h> #include <HashSet.h> +#include <package/hpkg/BlockBufferPoolNoLock.h> #include <package/hpkg/HPKGDefsPrivate.h> #include <package/hpkg/PackageDataReader.h> #include <package/hpkg/PackageEntry.h> #include <package/hpkg/PackageInfoAttributeValue.h> #include <package/hpkg/PackageReader.h> -#include <package/BlockBufferCacheNoLock.h> #include <package/ChecksumAccessors.h> #include <package/HashableString.h> #include <package/PackageInfoContentHandler.h> @@ -47,7 +47,7 @@ struct PackageEntryDataFetcher { BPackageData& packageData) : fErrorOutput(errorOutput), - fBufferCache(B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB, 2), + fBufferPool(B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB, 2), fPackageData(packageData) { } @@ -56,7 +56,7 @@ struct PackageEntryDataFetcher { { // create a PackageDataReader BAbstractBufferedDataReader* reader; - status_t result = BPackageDataReaderFactory(&fBufferCache) + status_t result = BPackageDataReaderFactory(&fBufferPool) .CreatePackageDataReader(dataReader, fPackageData, reader); if (result != B_OK) return result; @@ -81,7 +81,7 @@ struct PackageEntryDataFetcher { private: BErrorOutput* fErrorOutput; - BBlockBufferCacheNoLock fBufferCache; + BBlockBufferPoolNoLock fBufferPool; BPackageData& fPackageData; }; diff --git a/src/kits/package/hpkg/v1/PackageDataReaderV1.cpp b/src/kits/package/hpkg/v1/PackageDataReaderV1.cpp index 62ed614..a77e0b0 100644 --- a/src/kits/package/hpkg/v1/PackageDataReaderV1.cpp +++ b/src/kits/package/hpkg/v1/PackageDataReaderV1.cpp @@ -11,8 +11,8 @@ #include <algorithm> #include <new> -#include <package/hpkg/BufferCache.h> -#include <package/hpkg/CachedBuffer.h> +#include <package/hpkg/BufferPool.h> +#include <package/hpkg/PoolBuffer.h> #include <package/hpkg/DataOutput.h> #include <package/hpkg/v1/HPKGDefsPrivate.h> #include <package/hpkg/v1/PackageData.h> @@ -26,7 +26,7 @@ namespace BHPKG { namespace V1 { -using BHPKG::BPrivate::CachedBufferPutter; +using BHPKG::BPrivate::PoolBufferPutter; using BHPKG::BPrivate::ZlibDecompressor; @@ -69,10 +69,10 @@ protected: class UncompressedPackageDataReader : public PackageDataReader { public: UncompressedPackageDataReader(BDataReader* dataReader, - BBufferCache* bufferCache) + BBufferPool* bufferPool) : PackageDataReader(dataReader), - fBufferCache(bufferCache) + fBufferPool(bufferPool) { } @@ -110,11 +110,11 @@ public: return B_BAD_VALUE; // get a temporary buffer - CachedBuffer* buffer = fBufferCache->GetBuffer( + PoolBuffer* buffer = fBufferPool->GetBuffer( kUncompressedReaderBufferSize); if (buffer == NULL) return B_NO_MEMORY; - CachedBufferPutter bufferPutter(fBufferCache, &buffer); + PoolBufferPutter bufferPutter(fBufferPool, &buffer); while (size > 0) { // read into the buffer @@ -137,7 +137,7 @@ public: } private: - BBufferCache* fBufferCache; + BBufferPool* fBufferPool; uint64 fOffset; uint64 fSize; }; @@ -148,10 +148,10 @@ private: class ZlibPackageDataReader : public PackageDataReader { public: - ZlibPackageDataReader(BDataReader* dataReader, BBufferCache* bufferCache) + ZlibPackageDataReader(BDataReader* dataReader, BBufferPool* bufferPool) : PackageDataReader(dataReader), - fBufferCache(bufferCache), + fBufferPool(bufferPool), fUncompressBuffer(NULL), fOffsetTable(NULL) { @@ -161,7 +161,7 @@ public: { delete[] fOffsetTable; - fBufferCache->PutBuffer(&fUncompressBuffer); + fBufferPool->PutBuffer(&fUncompressBuffer); } status_t Init(const BPackageData& data) @@ -221,11 +221,11 @@ public: // get our uncompressed chunk buffer back, if possible bool newBuffer; - if (fBufferCache->GetBuffer(fChunkSize, &fUncompressBuffer, &newBuffer) + if (fBufferPool->GetBuffer(fChunkSize, &fUncompressBuffer, &newBuffer) == NULL) { return B_NO_MEMORY; } - CachedBufferPutter uncompressBufferPutter(fBufferCache, + PoolBufferPutter uncompressBufferPutter(fBufferPool, &fUncompressBuffer); if (newBuffer) @@ -284,10 +284,10 @@ private: compressedSize); } else { // read to a read buffer and uncompress - CachedBuffer* readBuffer = fBufferCache->GetBuffer(fChunkSize); + PoolBuffer* readBuffer = fBufferPool->GetBuffer(fChunkSize); if (readBuffer == NULL) return B_NO_MEMORY; - CachedBufferPutter readBufferPutter(fBufferCache, readBuffer); + PoolBufferPutter readBufferPutter(fBufferPool, readBuffer); error = fDataReader->ReadData(offset, readBuffer->Buffer(), compressedSize); @@ -381,8 +381,8 @@ private: } private: - BBufferCache* fBufferCache; - CachedBuffer* fUncompressBuffer; + BBufferPool* fBufferPool; + PoolBuffer* fUncompressBuffer; int64 fUncompressedChunk; uint64 fOffset; @@ -400,9 +400,9 @@ private: // #pragma mark - BPackageDataReaderFactory -BPackageDataReaderFactory::BPackageDataReaderFactory(BBufferCache* bufferCache) +BPackageDataReaderFactory::BPackageDataReaderFactory(BBufferPool* bufferPool) : - fBufferCache(bufferCache) + fBufferPool(bufferPool) { } @@ -416,11 +416,11 @@ BPackageDataReaderFactory::CreatePackageDataReader(BDataReader* dataReader, switch (data.Compression()) { case B_HPKG_COMPRESSION_NONE: reader = new(std::nothrow) UncompressedPackageDataReader( - dataReader, fBufferCache); + dataReader, fBufferPool); break; case B_HPKG_COMPRESSION_ZLIB: reader = new(std::nothrow) ZlibPackageDataReader(dataReader, - fBufferCache); + fBufferPool); break; default: return B_BAD_VALUE; diff --git a/src/system/boot/loader/file_systems/packagefs/Jamfile b/src/system/boot/loader/file_systems/packagefs/Jamfile index bae8160..bd42445 100644 --- a/src/system/boot/loader/file_systems/packagefs/Jamfile +++ b/src/system/boot/loader/file_systems/packagefs/Jamfile @@ -19,13 +19,13 @@ BootStaticLibrary boot_packagefs : packagefs.cpp # package kit - BlockBufferCacheNoLock.cpp # package kit/hpkg - BlockBufferCache.cpp - BlockBufferCacheImpl.cpp - BufferCache.cpp - CachedBuffer.cpp + BlockBufferPool.cpp + BlockBufferPoolImpl.cpp + BlockBufferPoolNoLock.cpp + BufferPool.cpp + PoolBuffer.cpp DataOutput.cpp DataReader.cpp ErrorOutput.cpp diff --git a/src/system/boot/loader/file_systems/packagefs/packagefs.cpp b/src/system/boot/loader/file_systems/packagefs/packagefs.cpp index 34eabd9..66a608e 100644 --- a/src/system/boot/loader/file_systems/packagefs/packagefs.cpp +++ b/src/system/boot/loader/file_systems/packagefs/packagefs.cpp @@ -9,7 +9,7 @@ #include <errno.h> #include <unistd.h> -#include <package/BlockBufferCacheNoLock.h> +#include <package/hpkg/BlockBufferPoolNoLock.h> #include <package/hpkg/DataReader.h> #include <package/hpkg/ErrorOutput.h> #include <package/hpkg/PackageDataReader.h> @@ -272,7 +272,7 @@ struct FileDataReader { private: BFDDataReader fDataReader; BPackageData fData; - BPackageDataReader* fPackageDataReader; + BAbstractBufferedDataReader* fPackageDataReader; }; @@ -345,7 +345,7 @@ struct PackageVolume : BReferenceable { private: ino_t fNextNodeID; PackageDirectory fRootDirectory; - BBlockBufferCacheNoLock fBufferCache; + BBlockBufferPoolNoLock fBufferCache; BPackageDataReaderFactory fDataReaderFactory; int fFD; }; ############################################################################ Commit: e61db51ceee217d4a63fe362334bce21023f5cb5 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Tue May 14 17:03:34 2013 UTC Some comment updates ---------------------------------------------------------------------------- diff --git a/src/kits/package/hpkg/PackageWriterImpl.cpp b/src/kits/package/hpkg/PackageWriterImpl.cpp index 9e994aa..3778cd3 100644 --- a/src/kits/package/hpkg/PackageWriterImpl.cpp +++ b/src/kits/package/hpkg/PackageWriterImpl.cpp @@ -390,6 +390,9 @@ private: }; +// #pragma mark - HeapAttributeOffsetter + + struct PackageWriterImpl::HeapAttributeOffsetter { HeapAttributeOffsetter(const RangeArray<off_t>& ranges, const Array<off_t>& deltas) diff --git a/src/kits/package/hpkg/WriterImplBase.cpp b/src/kits/package/hpkg/WriterImplBase.cpp index e3abd77..7a539a3 100644 --- a/src/kits/package/hpkg/WriterImplBase.cpp +++ b/src/kits/package/hpkg/WriterImplBase.cpp @@ -399,7 +399,7 @@ WriterImplBase::RegisterPackageInfo(PackageAttributeList& attributeList, packager->string = fPackageStringCache.Get(packageInfo.Packager().String()); attributeList.Add(packager); - // base package + // base package (optional) if (!packageInfo.BasePackage().IsEmpty()) { PackageAttribute* basePackage = new PackageAttribute( B_HPKG_ATTRIBUTE_ID_PACKAGE_BASE_PACKAGE, ############################################################################ Commit: d4171e4f2ae94d2271c398cd627bab437a94ec23 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Sat May 18 01:55:39 2013 UTC Some *DataReader improvements * BFDDataReader: Add SetFD(). * BBufferDataReader: Derive from BAbstractBufferedDataReader. ---------------------------------------------------------------------------- diff --git a/headers/os/package/hpkg/DataReader.h b/headers/os/package/hpkg/DataReader.h index c0668c0..2590415 100644 --- a/headers/os/package/hpkg/DataReader.h +++ b/headers/os/package/hpkg/DataReader.h @@ -41,6 +41,8 @@ class BFDDataReader : public BDataReader { public: BFDDataReader(int fd); + void SetFD(int fd); + virtual status_t ReadData(off_t offset, void* buffer, size_t size); @@ -64,12 +66,14 @@ private: }; -class BBufferDataReader : public BDataReader { +class BBufferDataReader : public BAbstractBufferedDataReader { public: BBufferDataReader(const void* data, size_t size); virtual status_t ReadData(off_t offset, void* buffer, size_t size); + virtual status_t ReadDataToOutput(off_t offset, size_t size, + BDataOutput* output); private: const void* fData; diff --git a/src/kits/package/hpkg/DataReader.cpp b/src/kits/package/hpkg/DataReader.cpp index cc770e2..b47f988 100644 --- a/src/kits/package/hpkg/DataReader.cpp +++ b/src/kits/package/hpkg/DataReader.cpp @@ -68,6 +68,23 @@ BBufferDataReader::ReadData(off_t offset, void* buffer, size_t size) } +status_t +BBufferDataReader::ReadDataToOutput(off_t offset, size_t size, + BDataOutput* output) +{ + if (size == 0) + return B_OK; + + if (offset < 0) + return B_BAD_VALUE; + + if (size > fSize || offset > (off_t)fSize - (off_t)size) + return B_ERROR; + + return output->WriteData((const uint8*)fData + offset, size); +} + + } // namespace BHPKG } // namespace BPackageKit diff --git a/src/kits/package/hpkg/FDDataReader.cpp b/src/kits/package/hpkg/FDDataReader.cpp index c0ce13e..5a20fc4 100644 --- a/src/kits/package/hpkg/FDDataReader.cpp +++ b/src/kits/package/hpkg/FDDataReader.cpp @@ -22,6 +22,13 @@ BFDDataReader::BFDDataReader(int fd) } +void +BFDDataReader::SetFD(int fd) +{ + fFD = fd; +} + + status_t BFDDataReader::ReadData(off_t offset, void* buffer, size_t size) { ############################################################################ Commit: d1f1dd4262029d3e4e699c3a4e7e0f7a94d0b359 Author: Ingo Weinhold <ingo_weinhold@xxxxxx> Date: Sat May 18 02:11:01 2013 UTC hpkg format: compress the whole heap Instead of handling compression for individual file/attribute data we do now compress the whole heap where they are stored. This significantly improves compression ratios. We still divide the uncompressed data into 64 KiB chunks and use a chunk offset array for the compressed chunks to allow for quick random access without too much overhead. The tradeoff is a limited possible compression ratio -- i.e. we won't be as good as tar.gz (though surprisingly with my test archives we did better than zip). The other package file sections (package attributes and TOC) are no longer compressed individually. Their uncompressed data are simply pushed onto the heap where the usual compression strategy applies. To simplify things the repository format has been changed in the same manner although it doesn't otherwise use the heap, since it only stores meta data. Due to the data compression having been exposed in public and private API, this change touches a lot of package kit using code, including packagefs and the boot loader packagefs support. The latter two haven't been tested yet. Moreover packagefs needs a new kind of cache so we avoid re-reading the same heap chunk for two different data items it contains. ---------------------------------------------------------------------------- diff --git a/headers/build/private/package/hpkg/DataWriters.h b/headers/build/private/package/hpkg/DataWriters.h new file mode 100644 index 0000000..1f9f896 --- /dev/null +++ b/headers/build/private/package/hpkg/DataWriters.h @@ -0,0 +1 @@ +#include <../private/package/hpkg/DataWriters.h> diff --git a/headers/build/private/package/hpkg/PackageFileHeapAccessorBase.h b/headers/build/private/package/hpkg/PackageFileHeapAccessorBase.h new file mode 100644 index 0000000..f9c224e --- /dev/null +++ b/headers/build/private/package/hpkg/PackageFileHeapAccessorBase.h @@ -0,0 +1 @@ +#include <../private/package/hpkg/PackageFileHeapAccessorBase.h> diff --git a/headers/build/private/package/hpkg/PackageFileHeapReader.h b/headers/build/private/package/hpkg/PackageFileHeapReader.h new file mode 100644 index 0000000..e051dd2 --- /dev/null +++ b/headers/build/private/package/hpkg/PackageFileHeapReader.h @@ -0,0 +1 @@ +#include <../private/package/hpkg/PackageFileHeapReader.h> diff --git a/headers/build/private/package/hpkg/PackageFileHeapWriter.h b/headers/build/private/package/hpkg/PackageFileHeapWriter.h new file mode 100644 index 0000000..88fd3c8 --- /dev/null +++ b/headers/build/private/package/hpkg/PackageFileHeapWriter.h @@ -0,0 +1 @@ +#include <../private/package/hpkg/PackageFileHeapWriter.h> diff --git a/headers/os/package/hpkg/HPKGDefs.h b/headers/os/package/hpkg/HPKGDefs.h index d4f9015..7cd931b 100644 --- a/headers/os/package/hpkg/HPKGDefs.h +++ b/headers/os/package/hpkg/HPKGDefs.h @@ -20,7 +20,7 @@ enum { B_HPKG_VERSION = 2, // B_HPKG_REPO_MAGIC = 'hpkr', - B_HPKG_REPO_VERSION = 1 + B_HPKG_REPO_VERSION = 2 }; @@ -98,37 +98,34 @@ enum BHPKGAttributeID { B_HPKG_ATTRIBUTE_ID_FILE_ATTRIBUTE = 11, B_HPKG_ATTRIBUTE_ID_FILE_ATTRIBUTE_TYPE = 12, B_HPKG_ATTRIBUTE_ID_DATA = 13, - B_HPKG_ATTRIBUTE_ID_DATA_SIZE = 14, - B_HPKG_ATTRIBUTE_ID_DATA_COMPRESSION = 15, - B_HPKG_ATTRIBUTE_ID_DATA_CHUNK_SIZE = 16, - B_HPKG_ATTRIBUTE_ID_SYMLINK_PATH = 17, - B_HPKG_ATTRIBUTE_ID_PACKAGE_NAME = 18, - B_HPKG_ATTRIBUTE_ID_PACKAGE_SUMMARY = 19, - B_HPKG_ATTRIBUTE_ID_PACKAGE_DESCRIPTION = 20, - B_HPKG_ATTRIBUTE_ID_PACKAGE_VENDOR = 21, - B_HPKG_ATTRIBUTE_ID_PACKAGE_PACKAGER = 22, - B_HPKG_ATTRIBUTE_ID_PACKAGE_FLAGS = 23, - B_HPKG_ATTRIBUTE_ID_PACKAGE_ARCHITECTURE = 24, - B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MAJOR = 25, - B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MINOR = 26, - B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MICRO = 27, - B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_REVISION = 28, - B_HPKG_ATTRIBUTE_ID_PACKAGE_COPYRIGHT = 29, - B_HPKG_ATTRIBUTE_ID_PACKAGE_LICENSE = 30, - B_HPKG_ATTRIBUTE_ID_PACKAGE_PROVIDES = 31, - B_HPKG_ATTRIBUTE_ID_PACKAGE_REQUIRES = 32, - B_HPKG_ATTRIBUTE_ID_PACKAGE_SUPPLEMENTS = 33, - B_HPKG_ATTRIBUTE_ID_PACKAGE_CONFLICTS = 34, - B_HPKG_ATTRIBUTE_ID_PACKAGE_FRESHENS = 35, - B_HPKG_ATTRIBUTE_ID_PACKAGE_REPLACES = 36, - B_HPKG_ATTRIBUTE_ID_PACKAGE_RESOLVABLE_OPERATOR = 37, - B_HPKG_ATTRIBUTE_ID_PACKAGE_CHECKSUM = 38, - B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_PRE_RELEASE = 39, - B_HPKG_ATTRIBUTE_ID_PACKAGE_PROVIDES_COMPATIBLE = 40, - B_HPKG_ATTRIBUTE_ID_PACKAGE_URL = 41, - B_HPKG_ATTRIBUTE_ID_PACKAGE_SOURCE_URL = 42, - B_HPKG_ATTRIBUTE_ID_PACKAGE_INSTALL_PATH = 43, - B_HPKG_ATTRIBUTE_ID_PACKAGE_BASE_PACKAGE = 44, + B_HPKG_ATTRIBUTE_ID_SYMLINK_PATH = 14, + B_HPKG_ATTRIBUTE_ID_PACKAGE_NAME = 15, + B_HPKG_ATTRIBUTE_ID_PACKAGE_SUMMARY = 16, + B_HPKG_ATTRIBUTE_ID_PACKAGE_DESCRIPTION = 17, + B_HPKG_ATTRIBUTE_ID_PACKAGE_VENDOR = 18, + B_HPKG_ATTRIBUTE_ID_PACKAGE_PACKAGER = 19, + B_HPKG_ATTRIBUTE_ID_PACKAGE_FLAGS = 20, + B_HPKG_ATTRIBUTE_ID_PACKAGE_ARCHITECTURE = 21, + B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MAJOR = 22, + B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MINOR = 23, + B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_MICRO = 24, + B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_REVISION = 25, + B_HPKG_ATTRIBUTE_ID_PACKAGE_COPYRIGHT = 26, + B_HPKG_ATTRIBUTE_ID_PACKAGE_LICENSE = 27, + B_HPKG_ATTRIBUTE_ID_PACKAGE_PROVIDES = 28, + B_HPKG_ATTRIBUTE_ID_PACKAGE_REQUIRES = 29, + B_HPKG_ATTRIBUTE_ID_PACKAGE_SUPPLEMENTS = 30, + B_HPKG_ATTRIBUTE_ID_PACKAGE_CONFLICTS = 31, + B_HPKG_ATTRIBUTE_ID_PACKAGE_FRESHENS = 32, + B_HPKG_ATTRIBUTE_ID_PACKAGE_REPLACES = 33, + B_HPKG_ATTRIBUTE_ID_PACKAGE_RESOLVABLE_OPERATOR = 34, + B_HPKG_ATTRIBUTE_ID_PACKAGE_CHECKSUM = 35, + B_HPKG_ATTRIBUTE_ID_PACKAGE_VERSION_PRE_RELEASE = 36, + B_HPKG_ATTRIBUTE_ID_PACKAGE_PROVIDES_COMPATIBLE = 37, + B_HPKG_ATTRIBUTE_ID_PACKAGE_URL = 38, + B_HPKG_ATTRIBUTE_ID_PACKAGE_SOURCE_URL = 39, + B_HPKG_ATTRIBUTE_ID_PACKAGE_INSTALL_PATH = 40, + B_HPKG_ATTRIBUTE_ID_PACKAGE_BASE_PACKAGE = 41, // B_HPKG_ATTRIBUTE_ID_ENUM_COUNT, }; @@ -154,9 +151,7 @@ enum { B_HPKG_DEFAULT_FILE_TYPE = B_HPKG_FILE_TYPE_FILE, B_HPKG_DEFAULT_FILE_PERMISSIONS = 0644, B_HPKG_DEFAULT_DIRECTORY_PERMISSIONS = 0755, - B_HPKG_DEFAULT_SYMLINK_PERMISSIONS = 0777, - B_HPKG_DEFAULT_DATA_COMPRESSION = B_HPKG_COMPRESSION_NONE, - B_HPKG_DEFAULT_DATA_CHUNK_SIZE_ZLIB = 64 * 1024 + B_HPKG_DEFAULT_SYMLINK_PERMISSIONS = 0777 }; diff --git a/headers/os/package/hpkg/PackageData.h b/headers/os/package/hpkg/PackageData.h index d0ef1c0..fa0fa48 100644 --- a/headers/os/package/hpkg/PackageData.h +++ b/headers/os/package/hpkg/PackageData.h @@ -18,14 +18,10 @@ class BPackageData { public: BPackageData(); - uint64 CompressedSize() const - { return fCompressedSize; } - uint64 UncompressedSize() const - { return fUncompressedSize; } + uint64 Size() const + { return fSize; } uint64 Offset() const { return fEncodedInline ? 0 : fOffset; } - uint32 Compression() const { return fCompression; } - uint32 ChunkSize() const { return fChunkSize; } bool IsEncodedInline() const { return fEncodedInline; } @@ -34,23 +30,13 @@ public: void SetData(uint64 size, uint64 offset); void SetData(uint8 size, const void* data); - void SetCompression(uint32 compression) - { fCompression = compression; } - void SetUncompressedSize(uint64 size) - { fUncompressedSize = size; } - void SetChunkSize(uint32 size) - { fChunkSize = size; } - private: - uint64 fCompressedSize; - uint64 fUncompressedSize; + uint64 fSize : 63; + bool fEncodedInline : 1; union { uint64 fOffset; uint8 fInlineData[B_HPKG_MAX_INLINE_DATA_SIZE]; }; - uint32 fChunkSize; - uint32 fCompression; - bool fEncodedInline; }; diff --git a/headers/os/package/hpkg/PackageDataReader.h b/headers/os/package/hpkg/PackageDataReader.h index 1152fba..0dcebf9 100644 --- a/headers/os/package/hpkg/PackageDataReader.h +++ b/headers/os/package/hpkg/PackageDataReader.h @@ -20,15 +20,12 @@ class BPackageData; class BPackageDataReaderFactory { public: - BPackageDataReaderFactory( - BBufferPool* bufferPool); + BPackageDataReaderFactory(); - status_t CreatePackageDataReader(BDataReader* dataReader, + status_t CreatePackageDataReader( + BAbstractBufferedDataReader* dataReader, const BPackageData& data, BAbstractBufferedDataReader*& _reader); - -private: - BBufferPool* fBufferPool; }; diff --git a/headers/os/package/hpkg/PackageReader.h b/headers/os/package/hpkg/PackageReader.h index e559c35..3828a4b 100644 --- a/headers/os/package/hpkg/PackageReader.h +++ b/headers/os/package/hpkg/PackageReader.h @@ -19,6 +19,8 @@ namespace BPrivate { } using BPrivate::PackageReaderImpl; + +class BAbstractBufferedDataReader; class BErrorOutput; class BLowLevelPackageContentHandler; class BPackageContentHandler; @@ -26,8 +28,7 @@ class BPackageContentHandler; class BPackageReader { public: - BPackageReader( - BErrorOutput* errorOutput); + BPackageReader(BErrorOutput* errorOutput); ~BPackageReader(); status_t Init(const char* fileName); @@ -38,6 +39,10 @@ public: contentHandler); int PackageFileFD(); + + BAbstractBufferedDataReader* HeapReader() const; + // Only valid as long as the reader lives. + private: PackageReaderImpl* fImpl; }; diff --git a/headers/os/package/hpkg/RepositoryReader.h b/headers/os/package/hpkg/RepositoryReader.h index f42c077..d7e3539 100644 --- a/headers/os/package/hpkg/RepositoryReader.h +++ b/headers/os/package/hpkg/RepositoryReader.h @@ -19,6 +19,7 @@ namespace BPrivate { } using BPrivate::RepositoryReaderImpl; + class BErrorOutput; class BRepositoryContentHandler; diff --git a/headers/private/package/hpkg/DataWriters.h b/headers/private/package/hpkg/DataWriters.h new file mode 100644 index 0000000..26f67cf --- /dev/null +++ b/headers/private/package/hpkg/DataWriters.h @@ -0,0 +1,101 @@ +/* + * Copyright 2011, Oliver Tappe <zooey@xxxxxxxxxxxxxxx> + * Copyright 2013, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. + */ +#ifndef _PACKAGE__HPKG__PRIVATE__DATA_WRITERS_H_ +#define _PACKAGE__HPKG__PRIVATE__DATA_WRITERS_H_ + + +#include <package/hpkg/DataOutput.h> +#include <package/hpkg/ZlibCompressor.h> + + +namespace BPackageKit { + +namespace BHPKG { + + +class BErrorOutput; + + +namespace BPrivate { + + +class AbstractDataWriter { +public: + AbstractDataWriter(); + virtual ~AbstractDataWriter(); + + uint64 BytesWritten() const + { return fBytesWritten; } + + virtual status_t WriteDataNoThrow(const void* buffer, + size_t size) = 0; + + void WriteDataThrows(const void* buffer, + size_t size); + +protected: + uint64 fBytesWritten; +}; + + +class FDDataWriter : public AbstractDataWriter { +public: + FDDataWriter(int fd, off_t offset, + BErrorOutput* errorOutput); + + virtual status_t WriteDataNoThrow(const void* buffer, + size_t size); + + off_t Offset() const + { return fOffset; } + +private: + int fFD; + off_t fOffset; + BErrorOutput* fErrorOutput; +}; + + +class ZlibDataWriter : public AbstractDataWriter, private BDataOutput { +public: + ZlibDataWriter(AbstractDataWriter* dataWriter); + + void Init(); + void Finish(); + + virtual status_t WriteDataNoThrow(const void* buffer, + size_t size); + +private: + // BDataOutput + virtual status_t WriteData(const void* buffer, size_t size); + +private: + AbstractDataWriter* fDataWriter; + ZlibCompressor fCompressor; +}; + + +// inline implementations + + +inline void +AbstractDataWriter::WriteDataThrows(const void* buffer, size_t size) +{ + status_t error = WriteDataNoThrow(buffer, size); + if (error != B_OK) + throw status_t(error); +} + + +} // namespace BPrivate + +} // namespace BHPKG + +} // namespace BPackageKit + + +#endif // _PACKAGE__HPKG__PRIVATE__DATA_WRITERS_H_ diff --git a/headers/private/package/hpkg/HPKGDefsPrivate.h b/headers/private/package/hpkg/HPKGDefsPrivate.h index 7b29f00..dd2b820 100644 --- a/headers/private/package/hpkg/HPKGDefsPrivate.h +++ b/headers/private/package/hpkg/HPKGDefsPrivate.h @@ -18,7 +18,7 @@ namespace BHPKG { namespace BPrivate { -// header +// package file header struct hpkg_header { uint32 magic; // "hpkg" uint16 header_size; @@ -26,40 +26,41 @@ struct hpkg_header { uint64 total_size; // heap -// uint64 heap_compression; + uint32 heap_compression; + uint32 heap_chunk_size; + uint64 heap_size_compressed; + uint64 heap_size_uncompressed; // package attributes section - uint32 attributes_compression; - uint32 attributes_length_compressed; - uint32 attributes_length_uncompressed; + uint32 attributes_length; uint32 attributes_strings_length; uint32 attributes_strings_count; // TOC section - uint32 toc_compression; - uint64 toc_length_compressed; - uint64 toc_length_uncompressed; + uint64 toc_length; uint64 toc_strings_length; uint64 toc_strings_count; }; -// header +// repository file header struct hpkg_repo_header { uint32 magic; // "hpkr" uint16 header_size; uint16 version; uint64 total_size; + // heap + uint32 heap_compression; + uint32 heap_chunk_size; + uint64 heap_size_compressed; + uint64 heap_size_uncompressed; + // repository info section - uint32 info_compression; - uint32 info_length_compressed; - uint32 info_length_uncompressed; + uint32 info_length; // package attributes section - uint32 packages_compression; - uint64 packages_length_compressed; - uint64 packages_length_uncompressed; + uint64 packages_length; uint64 packages_strings_length; uint64 packages_strings_count; }; diff --git a/headers/private/package/hpkg/PackageFileHeapAccessorBase.h b/headers/private/package/hpkg/PackageFileHeapAccessorBase.h new file mode 100644 index 0000000..1cf9bd2 --- /dev/null +++ b/headers/private/package/hpkg/PackageFileHeapAccessorBase.h @@ -0,0 +1,143 @@ +/* + * Copyright 2013, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. + */ +#ifndef _PACKAGE__HPKG__PRIVATE__PACKAGE_FILE_HEAP_ACCESSOR_BASE_H_ +#define _PACKAGE__HPKG__PRIVATE__PACKAGE_FILE_HEAP_ACCESSOR_BASE_H_ + + +#include <SupportDefs.h> + +#include <package/hpkg/DataReader.h> + + +namespace BPackageKit { + +namespace BHPKG { + + +class BErrorOutput; + + +namespace BPrivate { + + +class PackageFileHeapAccessorBase : public BAbstractBufferedDataReader { +public: + class OffsetArray; + +public: + PackageFileHeapAccessorBase( + BErrorOutput* errorOutput, int fd, + off_t heapOffset); + virtual ~PackageFileHeapAccessorBase(); + + off_t HeapOffset() const + { return fHeapOffset; } + off_t CompressedHeapSize() const + { return fCompressedHeapSize; } + uint64 UncompressedHeapSize() const + { return fUncompressedHeapSize; } + size_t ChunkSize() const + { return kChunkSize; } + + // normally used after cloning a PackageFileHeapReader only + void SetErrorOutput(BErrorOutput* errorOutput) + { fErrorOutput = errorOutput; } + void SetFD(int fd) + { fFD = fd; } + + // BAbstractBufferedDataReader + virtual status_t ReadDataToOutput(off_t offset, size_t size, + BDataOutput* output); + +public: + static const size_t kChunkSize = 64 * 1024; + +protected: + virtual status_t ReadAndDecompressChunk(size_t chunkIndex, + void* compressedDataBuffer, + void* uncompressedDataBuffer) = 0; + status_t ReadAndDecompressChunkData(uint64 offset, + size_t compressedSize, + size_t uncompressedSize, + void* compressedDataBuffer, + void* uncompressedDataBuffer); + status_t ReadFileData(uint64 offset, void* buffer, + size_t size); + +protected: + BErrorOutput* fErrorOutput; + int fFD; + off_t fHeapOffset; + uint64 fCompressedHeapSize; + uint64 fUncompressedHeapSize; +}; + + +/*! Stores the chunk offsets in a compact way, while still providing quick + access. + - The object doesn't store the number of chunks/offsets it contains. During + initialization the chunk count is provided. Later, when getting an offset, + the caller is responsible for ensuring a valid index. + - The first (index 0) chunk offset is omitted, since it is always 0. + - The chunk offsets that fit in a 32 bit number use only one 32 bit element + in the offsets array. + - The chunk offsets that don't fit in a 32 bit number use two elements in + the offsets array. + Memory use is one pointer, if the chunk count is <= 1 (uncompressed heap size + <= 64 KiB). Afterwards it's one pointer plus 32 bit per chunk as long as the + last offset still fits 32 bit (compressed heap size < 4GiB). For any further + chunks it is 64 bit per chunk. So, for the common case we use sizeof(void*) + plus 1 KiB per 16 MiB of uncompressed heap, or about 64 KiB per 1 GiB. Which + seems reasonable for packagefs to keep in memory. + */ +class PackageFileHeapAccessorBase::OffsetArray { +public: + OffsetArray(); + ~OffsetArray(); + + bool InitChunksOffsets(size_t totalChunkCount, + size_t baseIndex, const uint16* chunkSizes, + size_t chunkCount); + + bool Init(size_t totalChunkCount, + const OffsetArray& other); + // "copy" init + + uint64 operator[](size_t index) const; + +private: + uint32* fOffsets; + // - NULL, if chunkCount <= 1 + // - element 0 contains the number of 32 bit + // offsets that follow, or is 0, when all + // offsets are 32 bit only + // - the following offsets use two elements + // each (lower followed by upper 32 bit) + // to represent the 64 bit value +}; + + +inline uint64 +PackageFileHeapAccessorBase::OffsetArray::operator[](size_t index) const +{ + if (index == 0) + return 0; + + if (fOffsets[0] == 0 || index < fOffsets[0]) + return fOffsets[index]; + + index += index - fOffsets[0]; + return fOffsets[index] | ((uint64)fOffsets[index + 1] << 32); +} + + +} // namespace BPrivate + +} // namespace BHPKG + +} // namespace BPackageKit + + +#endif // _PACKAGE__HPKG__PRIVATE__PACKAGE_FILE_HEAP_ACCESSOR_BASE_H_ diff --git a/headers/private/package/hpkg/PackageFileHeapReader.h b/headers/private/package/hpkg/PackageFileHeapReader.h new file mode 100644 index 0000000..de1c36e --- /dev/null +++ b/headers/private/package/hpkg/PackageFileHeapReader.h @@ -0,0 +1,57 @@ +/* + * Copyright 2013, Ingo Weinhold, ingo_weinhold@xxxxxx. + * Distributed under the terms of the MIT License. [ *** diff truncated: 6144 lines dropped *** ]