/* * Copyright (C) 2015-2018 Jolla Ltd. * Copyright (C) 2015-2018 Slava Monich * * You may use this file under the terms of the BSD license as follows: * * Redistribution and use in source and binary forms, with or without * modification, are permitted provided that the following conditions * are met: * * * Redistributions of source code must retain the above copyright * notice, this list of conditions and the following disclaimer. * * Redistributions in binary form must reproduce the above copyright * notice, this list of conditions and the following disclaimer in * the documentation and/or other materials provided with the * distribution. * * Neither the name of Jolla Ltd nor the names of its contributors * may be used to endorse or promote products derived from this * software without specific prior written permission. * * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. */ #include "BooksTaskQueue.h" #include "HarbourDebug.h" class BooksTaskQueue::Private { public: static weak_ptr gDefaultQueue; static weak_ptr gScaleQueue; static weak_ptr gHashQueue; static BooksTaskQueue* newDefaultQueue() { return new BooksTaskQueue(1); } static BooksTaskQueue* newScaleQueue() { return new BooksTaskQueue(2); } static BooksTaskQueue* newHashQueue() { return new BooksTaskQueue(1); } static void waitForDone(shared_ptr aQueue, int aMsecs) { if (!aQueue.isNull()) { aQueue->iPool->waitForDone(aMsecs); } } static void waitForDone(int aMsecs) { waitForDone(gDefaultQueue, aMsecs); waitForDone(gScaleQueue, aMsecs); waitForDone(gHashQueue, aMsecs); } static shared_ptr get(weak_ptr* aQueue, BooksTaskQueue* (*aNewFunc)()) { shared_ptr queue; if (aQueue->isNull()) { *aQueue = (queue = aNewFunc()); } else { queue = *aQueue; } return queue; } }; weak_ptr BooksTaskQueue::Private::gDefaultQueue; weak_ptr BooksTaskQueue::Private::gScaleQueue; weak_ptr BooksTaskQueue::Private::gHashQueue; shared_ptr BooksTaskQueue::defaultQueue() { return Private::get(&Private::gDefaultQueue, Private::newDefaultQueue); } shared_ptr BooksTaskQueue::scaleQueue() { return Private::get(&Private::gScaleQueue, Private::newScaleQueue); } shared_ptr BooksTaskQueue::hashQueue() { return Private::get(&Private::gHashQueue, Private::newHashQueue); } void BooksTaskQueue::waitForDone(int aMsecs) { Private::waitForDone(aMsecs); } BooksTaskQueue::BooksTaskQueue(int aMaxThreadCount) : iPool(new QThreadPool) { HDEBUG("created"); iPool->setMaxThreadCount(aMaxThreadCount); } BooksTaskQueue::~BooksTaskQueue() { HDEBUG("deleting"); iPool->waitForDone(); delete iPool; HDEBUG("deleted"); }