165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Nokia Corporation and/or its subsidiary(-ies)
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
272fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WorkQueue.h"
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <QLocalSocket>
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <QObject>
3265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <QThread>
332fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include <QProcess>
3481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <WebCore/NotImplemented.h>
3565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <wtf/Threading.h>
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass WorkQueue::WorkItemQt : public QObject {
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Q_OBJECT
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic:
4065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WorkItemQt(WorkQueue* workQueue, WorkItem* workItem)
4165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        : m_queue(workQueue)
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        , m_source(0)
4365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        , m_signal(0)
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        , m_workItem(workItem)
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
4765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
4865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WorkItemQt(WorkQueue* workQueue, QObject* source, const char* signal, WorkItem* workItem)
4965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        : m_queue(workQueue)
5065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        , m_source(source)
5165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        , m_signal(signal)
5265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        , m_workItem(workItem)
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
5465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        connect(m_source, m_signal, SLOT(execute()), Qt::QueuedConnection);
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ~WorkItemQt()
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        delete m_workItem;
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
6165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    Q_SLOT void execute()
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (m_queue->m_isValid)
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            m_workItem->execute();
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
6765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    virtual void timerEvent(QTimerEvent*)
6965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
7065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        execute();
7165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        delete this;
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
7365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
7465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WorkQueue* m_queue;
7565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    QObject* m_source;
7665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    const char* m_signal;
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WorkItem* m_workItem;
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
802fc2651226baac27029e38c9d6ef883fa32084dbSteve BlockQSocketNotifier* WorkQueue::registerSocketEventHandler(int socketDescriptor, QSocketNotifier::Type type, PassOwnPtr<WorkItem> workItem)
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_workThread);
8365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
842fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    QSocketNotifier* notifier = new QSocketNotifier(socketDescriptor, type, 0);
852fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    notifier->setEnabled(false);
862fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    notifier->moveToThread(m_workThread);
872fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WorkQueue::WorkItemQt* itemQt = new WorkQueue::WorkItemQt(this, notifier, SIGNAL(activated(int)), workItem.leakPtr());
882fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    itemQt->moveToThread(m_workThread);
892fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    notifier->setEnabled(true);
902fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    return notifier;
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WorkQueue::platformInitialize(const char*)
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_workThread = new QThread();
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_workThread->start();
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WorkQueue::platformInvalidate()
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_workThread->exit();
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_workThread->wait();
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    delete m_workThread;
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    deleteAllValues(m_signalListeners);
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WorkQueue::scheduleWork(PassOwnPtr<WorkItem> item)
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WorkQueue::WorkItemQt* itemQt = new WorkQueue::WorkItemQt(this, item.leakPtr());
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    itemQt->startTimer(0);
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    itemQt->moveToThread(m_workThread);
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11481bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdochvoid WorkQueue::scheduleWorkAfterDelay(PassOwnPtr<WorkItem> item, double delayInSecond)
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11681bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    WorkQueue::WorkItemQt* itemQt = new WorkQueue::WorkItemQt(this, item.leakPtr());
11781bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    itemQt->startTimer(static_cast<int>(delayInSecond * 1000));
11881bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch    itemQt->moveToThread(m_workThread);
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1212fc2651226baac27029e38c9d6ef883fa32084dbSteve Blockvoid WorkQueue::scheduleWorkOnTermination(WebKit::PlatformProcessIdentifier process, PassOwnPtr<WorkItem> workItem)
1222fc2651226baac27029e38c9d6ef883fa32084dbSteve Block{
1232fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    WorkQueue::WorkItemQt* itemQt = new WorkQueue::WorkItemQt(this, process, SIGNAL(finished(int, QProcess::ExitStatus)), workItem.leakPtr());
1242fc2651226baac27029e38c9d6ef883fa32084dbSteve Block    itemQt->moveToThread(m_workThread);
1252fc2651226baac27029e38c9d6ef883fa32084dbSteve Block}
1262fc2651226baac27029e38c9d6ef883fa32084dbSteve Block
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WorkQueueQt.moc"
128