Line data Source code
1 : /****************************************************************************** 2 : * 3 : * Name: gdal_abstractbandblockcache.h 4 : * Project: GDAL Core 5 : * Purpose: Declaration of GDALAbstractBandBlockCache base class 6 : * Author: Frank Warmerdam, warmerdam@pobox.com 7 : * 8 : ****************************************************************************** 9 : * Copyright (c) 1998, Frank Warmerdam 10 : * Copyright (c) 2007-2014, Even Rouault <even dot rouault at spatialys.com> 11 : * 12 : * SPDX-License-Identifier: MIT 13 : ****************************************************************************/ 14 : 15 : #ifndef GDALABSTRACTBANDBLOCKCACHE_H_INCLUDED 16 : #define GDALABSTRACTBANDBLOCKCACHE_H_INCLUDED 17 : 18 : #include "cpl_port.h" 19 : #include "cpl_error.h" 20 : 21 : typedef struct _CPLCond CPLCond; 22 : typedef struct _CPLLock CPLLock; 23 : typedef struct _CPLMutex CPLMutex; 24 : 25 : class GDALRasterBand; 26 : class GDALRasterBlock; 27 : 28 : /* ******************************************************************** */ 29 : /* GDALAbstractBandBlockCache */ 30 : /* ******************************************************************** */ 31 : 32 : //! @cond Doxygen_Suppress 33 : 34 : //! This manages how a raster band store its cached block. 35 : // only used by GDALRasterBand implementation. 36 : 37 : class GDALAbstractBandBlockCache /* non final */ 38 : { 39 : // List of blocks that can be freed or recycled, and its lock 40 : CPLLock *hSpinLock = nullptr; 41 : GDALRasterBlock *psListBlocksToFree = nullptr; 42 : 43 : // Band keep alive counter, and its lock & condition 44 : CPLCond *hCond = nullptr; 45 : CPLMutex *hCondMutex = nullptr; 46 : volatile int nKeepAliveCounter = 0; 47 : 48 : volatile int m_nDirtyBlocks = 0; 49 : 50 : CPL_DISALLOW_COPY_ASSIGN(GDALAbstractBandBlockCache) 51 : 52 : protected: 53 : explicit GDALAbstractBandBlockCache(GDALRasterBand *poBand); 54 : 55 : GDALRasterBand *poBand; 56 : 57 : int m_nInitialDirtyBlocksInFlushCache = 0; 58 : int m_nLastTick = -1; 59 : size_t m_nWriteDirtyBlocksDisabled = 0; 60 : 61 : void FreeDanglingBlocks(); 62 : void UnreferenceBlockBase(); 63 : 64 : void StartDirtyBlockFlushingLog(); 65 : void UpdateDirtyBlockFlushingLog(); 66 : void EndDirtyBlockFlushingLog(); 67 : 68 : public: 69 : virtual ~GDALAbstractBandBlockCache(); 70 : 71 : GDALRasterBlock *CreateBlock(int nXBlockOff, int nYBlockOff); 72 : void AddBlockToFreeList(GDALRasterBlock *poBlock); 73 : void IncDirtyBlocks(int nInc); 74 : void WaitCompletionPendingTasks(); 75 : 76 1 : void EnableDirtyBlockWriting() 77 : { 78 1 : --m_nWriteDirtyBlocksDisabled; 79 1 : } 80 : 81 3446 : void DisableDirtyBlockWriting() 82 : { 83 3446 : ++m_nWriteDirtyBlocksDisabled; 84 3446 : } 85 : 86 0 : bool HasDirtyBlocks() const 87 : { 88 0 : return m_nDirtyBlocks > 0; 89 : } 90 : 91 : virtual bool Init() = 0; 92 : virtual bool IsInitOK() = 0; 93 : virtual CPLErr FlushCache() = 0; 94 : virtual CPLErr AdoptBlock(GDALRasterBlock *poBlock) = 0; 95 : virtual GDALRasterBlock *TryGetLockedBlockRef(int nXBlockOff, 96 : int nYBlockYOff) = 0; 97 : virtual CPLErr UnreferenceBlock(GDALRasterBlock *poBlock) = 0; 98 : virtual CPLErr FlushBlock(int nXBlockOff, int nYBlockOff, 99 : int bWriteDirtyBlock) = 0; 100 : }; 101 : 102 : GDALAbstractBandBlockCache * 103 : GDALArrayBandBlockCacheCreate(GDALRasterBand *poBand); 104 : GDALAbstractBandBlockCache * 105 : GDALHashSetBandBlockCacheCreate(GDALRasterBand *poBand); 106 : 107 : //! @endcond 108 : 109 : #endif