Coverage Report

Created: 2025-11-16 06:25

next uncovered line (L), next uncovered region (R), next uncovered branch (B)
/src/gdal/gcore/gdal_abstractbandblockcache.h
Line
Count
Source
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
    void EnableDirtyBlockWriting()
77
0
    {
78
0
        --m_nWriteDirtyBlocksDisabled;
79
0
    }
80
81
    void DisableDirtyBlockWriting()
82
0
    {
83
0
        ++m_nWriteDirtyBlocksDisabled;
84
0
    }
85
86
    bool HasDirtyBlocks() const
87
0
    {
88
0
        return m_nDirtyBlocks > 0;
89
0
    }
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