[gdal-dev] Where is GDALRasterBlock documentation?

Even Rouault even.rouault at mines-paris.org
Mon Aug 3 14:12:09 EDT 2009


Le Monday 03 August 2009 18:07:33 Jorge Arévalo, vous avez écrit :
> Hello,
>
> Why GDALRasterBlock definition doesn't appear in the GDAL class list
> at http://www.gdal.org/annotated.html ?

Technical reason : It would just require to add a missing line
//! Raster block
before
class CPL_DLL GDALRasterBlock
in gcore/gdal_priv.h

More realistic reason : very few methods of GDALRasterBlock are properly 
documented + the fact it is a very internal thing that only interest GDAL 
developers themselves, not GDAL API users and very few GDAL driver 
developers.

>
> I'm trying to implement a cache-block system for GDAL WKT Raster
> driver, but I'm not sure if I should use this class. Maybe is
> deprecated?

It's not deprecated : it is actively used by GDALRasterBand.

But I'm not sure what/why you want to do about block caching for WKT raster 
driver. Is this a harddisk block caching or a RAM block caching ? If it's RAM 
block caching, you don't need to do anything as it is the purpose of the 
GDALRasterBlock/GDALRasterBand and doesn't require to write code to benefit 
from it.

Here's a synthesis of how it works :
The GDALRasterBand object has an array of pointers to blocks (papoBlocks). 
Initially, all the pointers are set to NULL.  When a GDALRasterIO() / 
GDALDatasetRasterIO() is issued, the default implementation in 
GDALRasterBand::IRasterIO() in gcore/rasterio.cpp will divide the requested 
source window into a list of blocks matching the block size of the band. It 
will call the GetLockedBlockRef() method of GDALRasterBand to see if there's 
already a matching block stored in papoBlocks. If yes, fine : the caller will 
fetch the pixel buffer from the cached block. If not, it will call the 
IReadBlock() method on the band (your implementation in WKTRaster driver for 
example) and will store the resulting buffer in a new GDALRasterBlock object 
(the cached pixel buffer is allocated by GDALRasterBlock::Internalize()). 
This object will be chained to other previously cached GDALRasterBlock (the 
cache is global to all the opened datasets, and that's one of the tricky 
point of the implementation : safe use in multithreading context). When there 
are too many cached blocks in RAM, GDALRasterBlock::Internalize(), through 
GDALFlushCacheBlock(), can evict the least recently used blocks from the list 
and nullify their corresponding entries into the papoBlocks array of their 
rasterbands. When a dataset is closed and its raster band destroyed or 
flushed, all the non-NULL blocks in papoBlocks will be flushed. I described 
here a read scenario, but it only works for a write scenario. Each block has 
a dirty flag to know if it must be written with IWriteBlock() before being 
deleted.

>
> Thanks in advance
>
> Best regards,
> Jorge
> _______________________________________________
> gdal-dev mailing list
> gdal-dev at lists.osgeo.org
> http://lists.osgeo.org/mailman/listinfo/gdal-dev




More information about the gdal-dev mailing list