[haiku-commits] BRANCH weinhold-github.new-hpkg-format [d1f1dd4] src/kits/package/hpkg headers/private/package/hpkg headers/os/package/hpkg src/add-ons/kernel/file_systems/packagefs/package src/bin/package

  • From: weinhold-github.new-hpkg-format <community@xxxxxxxxxxxx>
  • To: haiku-commits@xxxxxxxxxxxxx
  • Date: Sat, 18 May 2013 04:45:32 +0200 (CEST)

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 *** ]



Other related posts:

  • » [haiku-commits] BRANCH weinhold-github.new-hpkg-format [d1f1dd4] src/kits/package/hpkg headers/private/package/hpkg headers/os/package/hpkg src/add-ons/kernel/file_systems/packagefs/package src/bin/package - weinhold-github . new-hpkg-format