void GDALDestroyGeoLocTransformer( void *pTransformAlg ) { if( pTransformAlg == NULL ) return; GDALGeoLocTransformInfo *psTransform = (GDALGeoLocTransformInfo *) pTransformAlg; CPLFree( psTransform->pafBackMapX ); CPLFree( psTransform->pafBackMapY ); CSLDestroy( psTransform->papszGeolocationInfo ); CPLFree( psTransform->padfGeoLocX ); CPLFree( psTransform->padfGeoLocY ); if( psTransform->hDS_X != NULL && GDALDereferenceDataset( psTransform->hDS_X ) == 0 ) GDALClose( psTransform->hDS_X ); if( psTransform->hDS_Y != NULL && GDALDereferenceDataset( psTransform->hDS_Y ) == 0 ) GDALClose( psTransform->hDS_Y ); CPLFree( pTransformAlg ); }
VRTWarpedDataset::~VRTWarpedDataset() { FlushCache(); /* -------------------------------------------------------------------- */ /* Cleanup overviews. */ /* -------------------------------------------------------------------- */ int iOverview; for( iOverview = 0; iOverview < nOverviewCount; iOverview++ ) { GDALDatasetH hDS = (GDALDatasetH) papoOverviews[iOverview]; if( GDALDereferenceDataset( hDS ) < 1 ) { GDALReferenceDataset( hDS ); GDALClose( hDS ); } } CPLFree( papoOverviews ); /* -------------------------------------------------------------------- */ /* Cleanup warper if one is in effect. */ /* -------------------------------------------------------------------- */ if( poWarper != NULL ) { const GDALWarpOptions *psWO = poWarper->GetOptions(); /* -------------------------------------------------------------------- */ /* We take care to only call GDALClose() on psWO->hSrcDS if the */ /* reference count drops to zero. This is makes it so that we */ /* can operate reference counting semantics more-or-less */ /* properly even if the dataset isn't open in shared mode, */ /* though we require that the caller also honour the reference */ /* counting semantics even though it isn't a shared dataset. */ /* -------------------------------------------------------------------- */ if( psWO->hSrcDS != NULL ) { if( GDALDereferenceDataset( psWO->hSrcDS ) < 1 ) { GDALReferenceDataset( psWO->hSrcDS ); GDALClose( psWO->hSrcDS ); } } /* -------------------------------------------------------------------- */ /* We are responsible for cleaning up the transformer outselves. */ /* -------------------------------------------------------------------- */ if( psWO->pTransformerArg != NULL ) GDALDestroyTransformer( psWO->pTransformerArg ); delete poWarper; } }
static gint gv_manager_raster_destroy_cb( GObject * raster_in, gpointer cb_data ) { GvManager *manager = GV_MANAGER(cb_data); GvRaster *raster = GV_RASTER(raster_in); GvDataset *ds = NULL; int i, active_rasters = 0; /* * Find in our list. The dataset must already be "under management". */ for( i = 0; i < manager->datasets->len; i++ ) { ds = (GvDataset *) g_ptr_array_index(manager->datasets, i); if( raster->dataset == ds->dataset ) break; } if( i == manager->datasets->len ) { g_warning( "gv_manager_raster_destroy_cb(): can't find dataset." ); return FALSE; } /* * Find our GvRaster. */ for( i = 0; i < GDALGetRasterCount(ds->dataset); i++ ) { if( ds->rasters[i] == raster ) { /* MB: still not sure if we need to unref here... */ // if (G_OBJECT(raster)->ref_count > 1) // g_object_unref(ds->rasters[i]); ds->rasters[i] = NULL; } else if( ds->rasters[i] != NULL ) active_rasters++; } /* * We apparently no longer need this GDALDataset. Dereference it, and * remove from the list. */ if (active_rasters == 0) { if (GDALDereferenceDataset(ds->dataset) < 1) { GDALClose(ds->dataset); } g_free(ds->rasters); g_free(ds); g_ptr_array_remove_fast(manager->datasets, ds); } return FALSE; }
void msGDALCleanup( void ) { if( bGDALInitialized ) { int iRepeat = 5; msAcquireLock( TLOCK_GDAL ); #if GDAL_RELEASE_DATE > 20101207 { /* ** Cleanup any unreferenced but open datasets as will tend ** to exist due to deferred close requests. We are careful ** to only close one file at a time before refecting the ** list as closing some datasets may cause others to be ** closed (subdatasets in a VRT for instance). */ GDALDatasetH *pahDSList = NULL; int nDSCount = 0; int bDidSomething; do { int i; GDALGetOpenDatasets( &pahDSList, &nDSCount ); bDidSomething = FALSE; for( i = 0; i < nDSCount && !bDidSomething; i++ ) { if( GDALReferenceDataset( pahDSList[i] ) == 1 ) { GDALClose( pahDSList[i] ); bDidSomething = TRUE; } else GDALDereferenceDataset( pahDSList[i] ); } } while( bDidSomething ); } #endif while( iRepeat-- ) CPLPopErrorHandler(); #if GDAL_RELEASE_DATE > 20021001 GDALDestroyDriverManager(); #endif msReleaseLock( TLOCK_GDAL ); bGDALInitialized = 0; } }