You can not select more than 25 topics
Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.
185 lines
4.1 KiB
185 lines
4.1 KiB
/******************************************************************************
|
|
*
|
|
* Name: gdal_rasterblock.h
|
|
* Project: GDAL Core
|
|
* Purpose: Declaration of GDALRasterBlock class
|
|
* Author: Frank Warmerdam, warmerdam@pobox.com
|
|
*
|
|
******************************************************************************
|
|
* Copyright (c) 1998, Frank Warmerdam
|
|
* Copyright (c) 2007-2014, Even Rouault <even dot rouault at spatialys.com>
|
|
*
|
|
* SPDX-License-Identifier: MIT
|
|
****************************************************************************/
|
|
|
|
#ifndef GDALRASTERBLOCK_H_INCLUDED
|
|
#define GDALRASTERBLOCK_H_INCLUDED
|
|
|
|
#include "cpl_port.h"
|
|
#include "cpl_atomic_ops.h"
|
|
#include "gdal.h"
|
|
|
|
/* ******************************************************************** */
|
|
/* GDALRasterBlock */
|
|
/* ******************************************************************** */
|
|
|
|
class GDALRasterBand;
|
|
|
|
/** A single raster block in the block cache.
|
|
*
|
|
* And the global block manager that manages a least-recently-used list of
|
|
* blocks from various datasets/bands */
|
|
class CPL_DLL GDALRasterBlock final
|
|
{
|
|
friend class GDALAbstractBandBlockCache;
|
|
|
|
GDALDataType eType = GDT_Unknown;
|
|
|
|
bool bDirty = false;
|
|
volatile int nLockCount = 0;
|
|
|
|
int nXOff = 0;
|
|
int nYOff = 0;
|
|
|
|
int nXSize = 0;
|
|
int nYSize = 0;
|
|
|
|
void *pData = nullptr;
|
|
|
|
GDALRasterBand *poBand = nullptr;
|
|
|
|
GDALRasterBlock *poNext = nullptr;
|
|
GDALRasterBlock *poPrevious = nullptr;
|
|
|
|
bool bMustDetach = false;
|
|
|
|
CPL_INTERNAL void Detach_unlocked(void);
|
|
CPL_INTERNAL void Touch_unlocked(void);
|
|
|
|
CPL_INTERNAL void RecycleFor(int nXOffIn, int nYOffIn);
|
|
|
|
public:
|
|
GDALRasterBlock(GDALRasterBand *, int, int);
|
|
GDALRasterBlock(int nXOffIn, int nYOffIn); /* only for lookup purpose */
|
|
~GDALRasterBlock();
|
|
|
|
CPLErr Internalize(void);
|
|
void Touch(void);
|
|
void MarkDirty(void);
|
|
void MarkClean(void);
|
|
|
|
/** Increment the lock count */
|
|
int AddLock(void)
|
|
{
|
|
return CPLAtomicInc(&nLockCount);
|
|
}
|
|
|
|
/** Decrement the lock count */
|
|
int DropLock(void)
|
|
{
|
|
return CPLAtomicDec(&nLockCount);
|
|
}
|
|
|
|
void Detach();
|
|
|
|
CPLErr Write();
|
|
|
|
/** Return the data type
|
|
* @return data type
|
|
*/
|
|
GDALDataType GetDataType() const
|
|
{
|
|
return eType;
|
|
}
|
|
|
|
/** Return the x offset of the top-left corner of the block
|
|
* @return x offset
|
|
*/
|
|
int GetXOff() const
|
|
{
|
|
return nXOff;
|
|
}
|
|
|
|
/** Return the y offset of the top-left corner of the block
|
|
* @return y offset
|
|
*/
|
|
int GetYOff() const
|
|
{
|
|
return nYOff;
|
|
}
|
|
|
|
/** Return the width of the block
|
|
* @return width
|
|
*/
|
|
int GetXSize() const
|
|
{
|
|
return nXSize;
|
|
}
|
|
|
|
/** Return the height of the block
|
|
* @return height
|
|
*/
|
|
int GetYSize() const
|
|
{
|
|
return nYSize;
|
|
}
|
|
|
|
/** Return the dirty flag
|
|
* @return dirty flag
|
|
*/
|
|
int GetDirty() const
|
|
{
|
|
return bDirty;
|
|
}
|
|
|
|
/** Return the data buffer
|
|
* @return data buffer
|
|
*/
|
|
void *GetDataRef(void)
|
|
{
|
|
return pData;
|
|
}
|
|
|
|
/** Return the block size in bytes
|
|
* @return block size.
|
|
*/
|
|
GPtrDiff_t GetBlockSize() const
|
|
{
|
|
return static_cast<GPtrDiff_t>(nXSize) * nYSize *
|
|
GDALGetDataTypeSizeBytes(eType);
|
|
}
|
|
|
|
int TakeLock();
|
|
int DropLockForRemovalFromStorage();
|
|
|
|
/// @brief Accessor to source GDALRasterBand object.
|
|
/// @return source raster band of the raster block.
|
|
GDALRasterBand *GetBand()
|
|
{
|
|
return poBand;
|
|
}
|
|
|
|
static void FlushDirtyBlocks();
|
|
static int FlushCacheBlock(int bDirtyBlocksOnly = FALSE);
|
|
static void Verify();
|
|
|
|
static void EnterDisableDirtyBlockFlush();
|
|
static void LeaveDisableDirtyBlockFlush();
|
|
|
|
#ifdef notdef
|
|
static void CheckNonOrphanedBlocks(GDALRasterBand *poBand);
|
|
void DumpBlock();
|
|
static void DumpAll();
|
|
#endif
|
|
|
|
/* Should only be called by GDALDestroyDriverManager() */
|
|
//! @cond Doxygen_Suppress
|
|
CPL_INTERNAL static void DestroyRBMutex();
|
|
//! @endcond
|
|
|
|
private:
|
|
CPL_DISALLOW_COPY_ASSIGN(GDALRasterBlock)
|
|
};
|
|
|
|
#endif
|