controlpanelui/src/cpcategorymodel/src/cptaskexecutor.cpp
author Dremov Kirill (Nokia-D-MSW/Tampere) <kirill.dremov@nokia.com>
Tue, 31 Aug 2010 15:15:28 +0300
branchRCL_3
changeset 13 90fe62538f66
permissions -rw-r--r--
Revision: 201029 Kit: 201035

/*
* Copyright (c) 2009 Nokia Corporation and/or its subsidiary(-ies).
* All rights reserved.
* This component and the accompanying materials are made available
* under the terms of "Eclipse Public License v1.0""
* which accompanies this distribution, and is available
* at the URL "http://www.eclipse.org/legal/epl-v10.html".
*
* Initial Contributors:
* Nokia Corporation - initial contribution.
*
* Contributors:
*
* Description:  
*
*/
#include "cptaskexecutor.h"
#include <QMutexLocker>
#include <QDebug>
#include <QtAlgorithms>
#include <QPointer>

static QPointer<CpTaskExecutor> g_instance;

CpTaskExecutor *CpTaskExecutor::globalInstance()
{
    if (!g_instance) {
        g_instance = new CpTaskExecutor();
    }
    return g_instance.data();
}
    
void CpTaskExecutor::destroyGlobalInstance()
{
    delete g_instance.data();
}

CpTaskExecutor::CpTaskExecutor(QObject *parent /*=0*/) 
: QThread(parent), mStopped(false)
{
}

CpTaskExecutor::~CpTaskExecutor()
{
    stop();
}

bool CpTaskExecutor::runTask(CpTask *task,bool append /*= false*/)
{
    if (mStopped) {
        if (isRunning()) {
            qDebug() << "thread in stopping process...can not run task.\r\n";
            return false;
        }
        mStopped = false;
    }

    if (task) {
        {
            QMutexLocker locker(&mMutex);
            if (append) {
                mTasks.append(task);
            }
            else {
                mTasks.insert(0,task);
            }
        }

        if (!isRunning()) {
            qDebug() << "isRunning() == false, call start()\r\n";
            start();
        }
    }

    return true;
}

void CpTaskExecutor::stop()
{
    if (!mStopped && isRunning() ) {
       mStopped = true;
       removeTasks();
       wait(); //wait for finished
    }
}

void CpTaskExecutor::removeTasks()
{
    QMutexLocker locker(&mMutex);
    
    QList<CpTask*>::const_iterator begin(mTasks.begin());
    QList<CpTask*>::const_iterator end(mTasks.end());
    for (; begin != end; ++begin) {
        if ((*begin)->autoDelete()) {
            delete (*begin);
        }
    }

    mTasks.clear();
}

void CpTaskExecutor::run()
{
    while (!mStopped) {
        CpTask *task = 0;
        {
            QMutexLocker locker(&mMutex);
            if (mTasks.isEmpty()) {
                break;
            }
            task = mTasks.takeFirst();
        }
        try {
            task->execute(&mStopped);
            task->complete(&mStopped);
        }catch(...) {
            qDebug() << "excetion occur when running task\r\n";           
        }

        if (task->autoDelete()) {
            delete task;
        }
    }
}

bool CpTaskExecutor::toFront(CpTask *task)
{
    QMutexLocker locker(&mMutex);
    QList<CpTask*>::iterator foundIterator = ::qFind(mTasks.begin(),mTasks.end(),task);
    if (foundIterator == mTasks.end()) {
        return false;
    }
    
    mTasks.erase(foundIterator);
    mTasks.insert(0,task);

    return true;
}

//End of File