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