/** Destroys a pool of worker threads. * * Any still pending job will be completed before the destructor returns. */ CPLWorkerThreadPool::~CPLWorkerThreadPool() { if( hCond ) { WaitCompletion(); CPLAcquireMutex(hMutex, 1000.0); eState = CPLWTS_STOP; CPLReleaseMutex(hMutex); for(size_t i=0;i<aWT.size();i++) { CPLAcquireMutex(aWT[i].hMutex, 1000.0); CPLCondSignal(aWT[i].hCond); CPLReleaseMutex(aWT[i].hMutex); CPLJoinThread(aWT[i].hThread); CPLDestroyCond(aWT[i].hCond); CPLDestroyMutex(aWT[i].hMutex); } CPLListDestroy(psWaitingWorkerThreadsList); CPLDestroyCond(hCond); } CPLDestroyMutex(hMutex); }
VSICurlStreamingHandle::~VSICurlStreamingHandle() { StopDownload(); CPLFree(pszURL); if (hCurlHandle != NULL) curl_easy_cleanup(hCurlHandle); CPLFree(pCachedData); CPLFree(pabyHeaderData); CPLDestroyMutex( hRingBufferMutex ); CPLDestroyCond( hCondProducer ); CPLDestroyCond( hCondConsumer ); }
GDALAbstractBandBlockCache::~GDALAbstractBandBlockCache() { CPLAssert(nKeepAliveCounter == 0); FreeDanglingBlocks(); if( hSpinLock ) CPLDestroyLock(hSpinLock); if( hCondMutex ) CPLDestroyMutex(hCondMutex); if( hCond ) CPLDestroyCond(hCond); }