Line data Source code
1 : /********************************************************************** 2 : * 3 : * Project: GDAL 4 : * Purpose: Global thread pool 5 : * Author: Even Rouault, <even dot rouault at spatialys dot com> 6 : * 7 : ********************************************************************** 8 : * Copyright (c) 2020, Even Rouault, <even dot rouault at spatialys dot com> 9 : * 10 : * Permission is hereby granted, free of charge, to any person obtaining a 11 : * copy of this software and associated documentation files (the "Software"), 12 : * to deal in the Software without restriction, including without limitation 13 : * the rights to use, copy, modify, merge, publish, distribute, sublicense, 14 : * and/or sell copies of the Software, and to permit persons to whom the 15 : * Software is furnished to do so, subject to the following conditions: 16 : * 17 : * The above copyright notice and this permission notice shall be included 18 : * in all copies or substantial portions of the Software. 19 : * 20 : * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 21 : * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 22 : * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL 23 : * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER 24 : * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING 25 : * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 26 : * DEALINGS IN THE SOFTWARE. 27 : ****************************************************************************/ 28 : 29 : #include "gdal_thread_pool.h" 30 : 31 : #include <mutex> 32 : 33 : // For unclear reasons, attempts at making this a std::unique_ptr<>, even 34 : // through a GetCompressThreadPool() method like GetMutexThreadPool(), lead 35 : // to "ctest -R autotest_alg" (and other autotest components as well) 36 : // to hang forever once the tests have terminated. 37 : static CPLWorkerThreadPool *gpoCompressThreadPool = nullptr; 38 : 39 935 : static std::mutex &GetMutexThreadPool() 40 : { 41 : static std::mutex gMutexThreadPool; 42 935 : return gMutexThreadPool; 43 : } 44 : 45 83 : CPLWorkerThreadPool *GDALGetGlobalThreadPool(int nThreads) 46 : { 47 83 : std::lock_guard oGuard(GetMutexThreadPool()); 48 83 : if (gpoCompressThreadPool == nullptr) 49 : { 50 4 : gpoCompressThreadPool = new CPLWorkerThreadPool(); 51 4 : if (!gpoCompressThreadPool->Setup(nThreads, nullptr, nullptr, false)) 52 : { 53 0 : delete gpoCompressThreadPool; 54 0 : gpoCompressThreadPool = nullptr; 55 : } 56 : } 57 79 : else if (nThreads > gpoCompressThreadPool->GetThreadCount()) 58 : { 59 : // Increase size of thread pool 60 1 : gpoCompressThreadPool->Setup(nThreads, nullptr, nullptr, false); 61 : } 62 166 : return gpoCompressThreadPool; 63 : } 64 : 65 852 : void GDALDestroyGlobalThreadPool() 66 : { 67 852 : std::lock_guard oGuard(GetMutexThreadPool()); 68 852 : delete gpoCompressThreadPool; 69 852 : gpoCompressThreadPool = nullptr; 70 852 : }