Changeset 13805

Show
Ignore:
Timestamp:
02/17/08 00:50:14 (3 months ago)
Author:
warmerdam
Message:

restrict dataset sharing to a one thread by tracking owning pid (#2229)

Files:

Legend:

Unmodified
Added
Removed
Modified
Copied
Moved
  • trunk/gdal/gcore/gdaldataset.cpp

    r11981 r13805  
    3636static volatile int nGDALDatasetCount = 0; 
    3737static GDALDataset ** volatile papoGDALDatasetList = NULL; 
     38static GIntBig * volatile panGDALDatasetPID = NULL; 
    3839static void *hDLMutex = NULL; 
    3940 
     
    8283            CPLRealloc( papoGDALDatasetList, sizeof(void *)*nGDALDatasetCount); 
    8384        papoGDALDatasetList[nGDALDatasetCount-1] = this; 
     85        panGDALDatasetPID = (GIntBig * volatile)  
     86            CPLRealloc( panGDALDatasetPID, sizeof(GIntBig)*nGDALDatasetCount); 
     87        panGDALDatasetPID[nGDALDatasetCount-1] = CPLGetPID(); 
    8488    } 
    8589 
     
    128132                papoGDALDatasetList[i] =  
    129133                    papoGDALDatasetList[nGDALDatasetCount-1]; 
     134                panGDALDatasetPID[i] =  
     135                    panGDALDatasetPID[nGDALDatasetCount-1]; 
    130136                nGDALDatasetCount--; 
    131137                if( nGDALDatasetCount == 0 ) 
     
    133139                    CPLFree( papoGDALDatasetList ); 
    134140                    papoGDALDatasetList = NULL; 
     141                    CPLFree( panGDALDatasetPID ); 
     142                    panGDALDatasetPID = NULL; 
    135143                } 
    136144                break; 
     
    18461854        CPLMutexHolderD( &hDLMutex ); 
    18471855        int         i; 
     1856        GIntBig nThisPID = CPLGetPID(); 
    18481857     
    18491858        for( i = 0; i < nGDALDatasetCount; i++ ) 
     
    18511860            if( strcmp(pszFilename, 
    18521861                       papoGDALDatasetList[i]->GetDescription()) == 0  
     1862                && nThisPID == panGDALDatasetPID[i] 
    18531863                && (eAccess == GA_ReadOnly  
    18541864                    || papoGDALDatasetList[i]->GetAccess() == eAccess ) ) 
     
    19571967 
    19581968        poDS->Reference(); 
    1959         VSIFPrintf( fp, "  %d %c %-6s %dx%dx%d %s\n",  
     1969        VSIFPrintf( fp, "  %d %c %-6s %7d %dx%dx%d %s\n",  
    19601970                    poDS->Dereference(),  
    19611971                    poDS->GetShared() ? 'S' : 'N', 
    19621972                    pszDriverName,  
     1973                    (int) panGDALDatasetPID[i], 
    19631974                    poDS->GetRasterXSize(), 
    19641975                    poDS->GetRasterYSize(),