VSICurlStreamingHandle::VSICurlStreamingHandle(VSICurlStreamingFSHandler* poFS, const char* pszURL) { this->poFS = poFS; this->pszURL = CPLStrdup(pszURL); #ifdef notdef nRecomputedChecksumOfFirst1024Bytes = 0; #endif curOffset = 0; poFS->AcquireMutex(); CachedFileProp* cachedFileProp = poFS->GetCachedFileProp(pszURL); eExists = cachedFileProp->eExists; fileSize = cachedFileProp->fileSize; bHastComputedFileSize = cachedFileProp->bHastComputedFileSize; bIsDirectory = cachedFileProp->bIsDirectory; poFS->ReleaseMutex(); bCanTrustCandidateFileSize = TRUE; bHasCandidateFileSize = FALSE; nCandidateFileSize = 0; nCachedSize = 0; pCachedData = NULL; bEOF = FALSE; hCurlHandle = NULL; hThread = NULL; hRingBufferMutex = CPLCreateMutex(); ReleaseMutex(); hCondProducer = CPLCreateCond(); hCondConsumer = CPLCreateCond(); bDownloadInProgress = FALSE; bDownloadStopped = FALSE; bAskDownloadEnd = FALSE; nRingBufferFileOffset = 0; pabyHeaderData = NULL; nHeaderSize = 0; nBodySize = 0; nHTTPCode = 0; }
GDALAbstractBandBlockCache::GDALAbstractBandBlockCache(GDALRasterBand* poBandIn) : hSpinLock(CPLCreateLock(LOCK_SPIN)), psListBlocksToFree(NULL), hCond(CPLCreateCond()), hCondMutex(CPLCreateMutex()), nKeepAliveCounter(0) { poBand = poBandIn; if( hCondMutex ) CPLReleaseMutex(hCondMutex); }
/** Setup the pool. * * @param nThreads Number of threads to launch * @param pfnInitFunc Initialization function to run in each thread. May be NULL * @param pasInitData Array of initialization data. Its length must be nThreads, * or it should be NULL. * @return true if initialization was successful. */ bool CPLWorkerThreadPool::Setup(int nThreads, CPLThreadFunc pfnInitFunc, void** pasInitData) { CPLAssert( nThreads > 0 ); hCond = CPLCreateCond(); if( hCond == nullptr ) return false; bool bRet = true; aWT.resize(nThreads); for(int i=0;i<nThreads;i++) { aWT[i].pfnInitFunc = pfnInitFunc; aWT[i].pInitData = pasInitData ? pasInitData[i] : nullptr; aWT[i].poTP = this; aWT[i].hMutex = CPLCreateMutexEx(CPL_MUTEX_REGULAR); if( aWT[i].hMutex == nullptr ) { nThreads = i; aWT.resize(nThreads); bRet = false; break; } CPLReleaseMutex(aWT[i].hMutex); aWT[i].hCond = CPLCreateCond(); if( aWT[i].hCond == nullptr ) { CPLDestroyMutex(aWT[i].hMutex); nThreads = i; aWT.resize(nThreads); bRet = false; break; } aWT[i].bMarkedAsWaiting = FALSE; // aWT[i].psNextJob = nullptr; aWT[i].hThread = CPLCreateJoinableThread(WorkerThreadFunction, &(aWT[i])); if( aWT[i].hThread == nullptr ) { nThreads = i; aWT.resize(nThreads); bRet = false; break; } } // Wait all threads to be started while( true ) { CPLAcquireMutex(hMutex, 1000.0); int nWaitingWorkerThreadsLocal = nWaitingWorkerThreads; if( nWaitingWorkerThreadsLocal < nThreads ) CPLCondWait(hCond, hMutex); CPLReleaseMutex(hMutex); if( nWaitingWorkerThreadsLocal == nThreads ) break; } if( eState == CPLWTS_ERROR ) bRet = false; return bRet; }