1 // BlockCache.h 2 // 3 // Copyright (c) 2003, Ingo Weinhold (bonefish@cs.tu-berlin.de) 4 // 5 // This program is free software; you can redistribute it and/or modify 6 // it under the terms of the GNU General Public License as published by 7 // the Free Software Foundation; either version 2 of the License, or 8 // (at your option) any later version. 9 // 10 // This program is distributed in the hope that it will be useful, 11 // but WITHOUT ANY WARRANTY; without even the implied warranty of 12 // MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the 13 // GNU General Public License for more details. 14 // 15 // You should have received a copy of the GNU General Public License 16 // along with this program; if not, write to the Free Software 17 // Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA 18 // 19 // You can alternatively use *this file* under the terms of the the MIT 20 // license included in this package. 21 22 #ifndef BLOCK_CACHE_H 23 #define BLOCK_CACHE_H 24 25 #include <SupportDefs.h> 26 27 #include "List.h" 28 #include "Locker.h" 29 30 class Block; 31 class Node; 32 33 class BlockCache { 34 public: 35 BlockCache(); 36 ~BlockCache(); 37 38 status_t Init(int device, uint64 blockCount, uint32 blockSize); 39 GetDevice()40 int GetDevice() const { return fDevice; } GetBlockSize()41 uint32 GetBlockSize() const { return fBlockSize; } GetBlockCount()42 off_t GetBlockCount() const { return fBlockCount; } 43 44 status_t GetBlock(Block *block); 45 status_t GetBlock(uint64 number, Block **block); 46 void PutBlock(Block *block); 47 48 private: 49 Block *_FindBlock(uint64 number); 50 status_t _ReadBlock(uint64 number, Block **block); 51 52 53 friend class Block; 54 void *_GetBlock(off_t number) const; 55 void _ReleaseBlock(off_t number, void *data) const; 56 57 private: 58 int fDevice; 59 uint32 fBlockSize; 60 uint64 fBlockCount; 61 Locker fLock; 62 List<Block*> fBlocks; 63 void* fCacheHandle; 64 // statistics 65 int64 fReads; 66 mutable int64 fBlockGets; 67 mutable int64 fBlockReleases; 68 }; 69 70 #endif // BLOCK_CACHE_H 71