[gdal-dev] About the interaction between VRT and VSIMEM

Even Rouault even.rouault at spatialys.com
Wed Sep 23 14:33:57 PDT 2020


> In your scenario, the C++ object corresponding to rgb has a VSILFILE* opened
> on it. And the C ++ object corresponding to vrt keeps the C++ object
> corresponding to rgb alive, hence this works.

I assume your question was triggered by
https://github.com/mapbox/rasterio/issues/2000
which is I believe completely unrelated to /vsimem/

My above statement about lifetime of objects must be altered a bit.
GDALAutoCreateWarpedVRT() must be used carefully regarding lifetime of the source 
dataset

Long story short, you can do:

hSrcDS = GDALOpen(...) # non shared mode . refcount = 1
hVRTDS = GDALAutoCreateWarpedVRT(hSrcDS, ...) # refcount(hSrcDS) = 2
GDALClose(hVRTDS) # drop the extra ref to hSrcDS ==> #refcount(hSrcDS) = 1 (but do not 
close it)
GDALClose(hSrcDS) # you must close src after hVRTDS. if you close it before hVRTDS, then 
hVRTDS might try to close it again

or 

hSrcDS = GDALOpenShared(...) # shared mode (full ref counting enabled). refcount(hSrcDS) = 
1
hVRTDS = GDALAutoCreateWarpedVRT(hSrcDS, ...)  # refcount(hSrcDS) = 2
# you can switch the order of the 2 close calls
GDALClose(hVRTDS) # refCount(hSrcDS) = 1
GDALClose(hSrcDS) # refCount(hSrcDS) = 0 -> really destroyed here

The reason is that in non shared mode GDALClose() ignores ref counting and always deletes 
the dataset. Historical behaviour

Even

-- 
Spatialys - Geospatial professional services
http://www.spatialys.com
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.osgeo.org/pipermail/gdal-dev/attachments/20200923/3b20d799/attachment-0001.html>


More information about the gdal-dev mailing list