From e75560e6cbd988dc5a4389b35e99268ed8ac03fe Mon Sep 17 00:00:00 2001 From: ejakowatz Date: Thu, 25 Jul 2002 04:56:14 +0000 Subject: [PATCH] Initial checkin. git-svn-id: file:///srv/svn/repos/haiku/trunk/current@433 a95241bf-73f2-0310-859d-f6bbb57e9c96 --- headers/os/support/BlockCache.h | 56 +++++++++++++ src/kits/support/BlockCache.cpp | 142 ++++++++++++++++++++++++++++++++ 2 files changed, 198 insertions(+) create mode 100644 headers/os/support/BlockCache.h create mode 100644 src/kits/support/BlockCache.cpp diff --git a/headers/os/support/BlockCache.h b/headers/os/support/BlockCache.h new file mode 100644 index 0000000000..5ea28ef0cf --- /dev/null +++ b/headers/os/support/BlockCache.h @@ -0,0 +1,56 @@ +//****************************************************************************** +// +// File: BlockCache.h +// +// Description: Manages a cache of same size blocks of memory +// +// Copyright (c) 2002 Massimiliano Origgi +// +// License: +// +//****************************************************************************** + +#ifndef _BLOCK_CACHE_H +#define _BLOCK_CACHE_H + +#include +#include + +// Allocation type +enum +{ + B_OBJECT_CACHE = 0, + B_MALLOC_CACHE = 1 +}; + + +class BBlockCache +{ +public: + + BBlockCache(size_t CacheSize, size_t BlockSize, uint32 Type); +virtual ~BBlockCache(void); + + void *Get(size_t BlockSize); + void Save(void *Data, size_t BlockSize); + +private: + +virtual void _ReservedBlockCache1(); +virtual void _ReservedBlockCache2(); + + BBlockCache(const BBlockCache &); + BBlockCache &operator=(const BBlockCache &); + + size_t fCacheSize; + size_t fBlockSize; + void *fCache; + size_t fMark; + BLocker fLock; + void *(*fAlloc)(size_t Size); + void (*fFree)(void *Data); + + uint32 _reserved[2]; +}; + +#endif diff --git a/src/kits/support/BlockCache.cpp b/src/kits/support/BlockCache.cpp new file mode 100644 index 0000000000..1e2fe5de2c --- /dev/null +++ b/src/kits/support/BlockCache.cpp @@ -0,0 +1,142 @@ +// +// File: BlockCache.cpp +// +// Description: Handles a cache of memory blocks of the same size +// +// Copyright (c) 2002 Massimiliano Origgi +// +// License: See MIT license +// + +#include + +#include + +#include + + +// Private functions + +void *object_alloc(size_t Size) +{ + return (void *)(new char[Size]); +} + +void object_free(void *Data) +{ + delete[] Data; +} + +void *malloc_alloc(size_t Size) +{ + return malloc(Size); +} + +void malloc_free(void *Data) +{ + free(Data); +} + +// Private structure for cache +struct _Block +{ + _Block(void); + ~_Block(void); + void *Data; + bool InUse; +}; + +_Block::_Block(void) : + Data(NULL), + InUse(false) +{ +} + +_Block::~_Block(void) +{ +} + + +BBlockCache::BBlockCache(size_t CacheSize, size_t BlockSize, uint32 Type) : + fCacheSize(CacheSize), + fBlockSize(BlockSize), + fMark(0) +{ + // Setup function pointers based on Type + if(Type==B_OBJECT_CACHE) { + fAlloc=&object_alloc; + fFree=&object_free; + } else { + fAlloc=&malloc_alloc; + fFree=&malloc_free; + } + + // Allocate cache + fCache=(void *)new _Block[CacheSize]; + for(size_t i=0; iInUse==false) { + block->InUse=true; + ++fMark; + if(fMark==fCacheSize) fMark=0; + return block->Data; + } + } + + if(fMark==0) return fAlloc(BlockSize); + + for(size_t i=0; iInUse==false) { + block->InUse=true; + ++fMark; + if(fMark==fCacheSize) fMark=0; + return block->Data; + } + } + + return fAlloc(BlockSize); +} + +void +BBlockCache::Save(void *Data, size_t BlockSize) +{ + BAutolock lock(fLock); + + if(BlockSize!=fBlockSize) { + fFree(Data); + return; + } + + _Block *block; + for(size_t i=0; iData==Data) { + block->InUse=false; + fMark=i; + return; + } + } + fFree(Data); +}