165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch/*
22daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch * Copyright (C) 2011 Igalia S.L.
365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Copyright (C) 2010 Apple Inc. All rights reserved.
465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Portions Copyright (c) 2010 Motorola Mobility, Inc.  All rights reserved.
565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * Redistribution and use in source and binary forms, with or without
765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * modification, are permitted provided that the following conditions
865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * are met:
965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 1. Redistributions of source code must retain the above copyright
1065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer.
1165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * 2. Redistributions in binary form must reproduce the above copyright
1265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    notice, this list of conditions and the following disclaimer in the
1365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *    documentation and/or other materials provided with the distribution.
1465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch *
1565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS''
1665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO,
1765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR
1865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS
1965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR
2065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF
2165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS
2265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN
2365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE)
2465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF
2565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch * THE POSSIBILITY OF SUCH DAMAGE.
2665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch */
2765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
282fc2651226baac27029e38c9d6ef883fa32084dbSteve Block#include "config.h"
2965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WorkQueue.h"
3065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include "WKBase.h"
3281bc750723a18f21cd17d1b173cd2a4dda9cea6eBen Murdoch#include <WebCore/NotImplemented.h>
332daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <gio/gio.h>
3465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch#include <glib.h>
352daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch#include <wtf/gobject/GRefPtr.h>
3665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
3765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// WorkQueue::EventSource
3865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochclass WorkQueue::EventSource {
3965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic:
402daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    EventSource(PassOwnPtr<WorkItem> workItem, WorkQueue* workQueue, GCancellable* cancellable)
412daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        : m_workItem(workItem)
4265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        , m_workQueue(workQueue)
432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        , m_cancellable(cancellable)
4465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
4565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
4665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
472daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    void cancel()
482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
492daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!m_cancellable)
502daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            return;
512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        g_cancellable_cancel(m_cancellable);
522daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
5365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
542daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static void executeEventSource(EventSource* eventSource)
5565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
5665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(eventSource);
5765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        WorkQueue* queue = eventSource->m_workQueue;
5865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        {
5965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            MutexLocker locker(queue->m_isValidMutex);
6065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            if (!queue->m_isValid)
612daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                return;
6265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
6365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
6465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        eventSource->m_workItem->execute();
6565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
6665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
672daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static gboolean performWorkOnce(EventSource* eventSource)
6865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
692daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        executeEventSource(eventSource);
702daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return FALSE;
712daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
7265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
732daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static gboolean performWork(GSocket* socket, GIOCondition condition, EventSource* eventSource)
742daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
752daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        if (!(condition & G_IO_IN) && !(condition & G_IO_HUP) && !(condition & G_IO_ERR)) {
762daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            // EventSource has been cancelled, return FALSE to destroy the source.
7765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            return FALSE;
7865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        }
7965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
802daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        executeEventSource(eventSource);
8165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        return TRUE;
8265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
832daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
842daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    static gboolean performWorkOnTermination(GPid, gint, EventSource* eventSource)
852daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    {
862daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        executeEventSource(eventSource);
872daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch        return FALSE;
882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    }
892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
9065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    static void deleteEventSource(EventSource* eventSource)
9165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
9265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        ASSERT(eventSource);
9365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        delete eventSource;
9465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
9565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
9665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochpublic:
9765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    PassOwnPtr<WorkItem> m_workItem;
9865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    WorkQueue* m_workQueue;
992daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GCancellable* m_cancellable;
10065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch};
10165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
10265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch// WorkQueue
10365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WorkQueue::platformInitialize(const char* name)
10465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
10565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_eventContext = g_main_context_new();
10665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_eventContext);
10765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_eventLoop = g_main_loop_new(m_eventContext, FALSE);
10865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_eventLoop);
10965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    m_workQueueThread = createThread(reinterpret_cast<WTF::ThreadFunction>(&WorkQueue::startWorkQueueThread), this, name);
11065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
11165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WorkQueue::platformInvalidate()
11365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
11465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MutexLocker locker(m_eventLoopLock);
11565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
11665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_eventLoop) {
11765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (g_main_loop_is_running(m_eventLoop))
11865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            g_main_loop_quit(m_eventLoop);
11965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        g_main_loop_unref(m_eventLoop);
12165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_eventLoop = 0;
12265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
12365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
12465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (m_eventContext) {
12565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        g_main_context_unref(m_eventContext);
12665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_eventContext = 0;
12765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
12865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
12965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid* WorkQueue::startWorkQueueThread(WorkQueue* workQueue)
13165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    workQueue->workQueueThreadBody();
13365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    return 0;
13465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
13565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
13665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WorkQueue::workQueueThreadBody()
13765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
13865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    g_main_loop_run(m_eventLoop);
13965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
14065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
14165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WorkQueue::registerEventSourceHandler(int fileDescriptor, int condition, PassOwnPtr<WorkItem> item)
14265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
1432daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GRefPtr<GSocket> socket = adoptGRef(g_socket_new_from_fd(fileDescriptor, 0));
1442daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(socket);
1452daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GRefPtr<GCancellable> cancellable = adoptGRef(g_cancellable_new());
1462daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GRefPtr<GSource> dispatchSource = adoptGRef(g_socket_create_source(socket.get(), static_cast<GIOCondition>(condition), cancellable.get()));
14765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(dispatchSource);
1482daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    EventSource* eventSource = new EventSource(item, this, cancellable.get());
14965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(eventSource);
15065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1512daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    g_source_set_callback(dispatchSource.get(), reinterpret_cast<GSourceFunc>(&WorkQueue::EventSource::performWork),
15265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        eventSource, reinterpret_cast<GDestroyNotify>(&WorkQueue::EventSource::deleteEventSource));
15365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
15465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    // Set up the event sources under the mutex since this is shared across multiple threads.
15565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    {
15665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        MutexLocker locker(m_eventSourcesLock);
15765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        Vector<EventSource*> sources;
15865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        EventSourceIterator it = m_eventSources.find(fileDescriptor);
15965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        if (it != m_eventSources.end())
16065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch            sources = it->second;
16165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        sources.append(eventSource);
16365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_eventSources.set(fileDescriptor, sources);
16465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
16565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1662daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    g_source_attach(dispatchSource.get(), m_eventContext);
16765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
16865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
16965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WorkQueue::unregisterEventSourceHandler(int fileDescriptor)
17065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
17165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(fileDescriptor);
17265f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    MutexLocker locker(m_eventSourcesLock);
17465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    EventSourceIterator it = m_eventSources.find(fileDescriptor);
17665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(it != m_eventSources.end());
17765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(m_eventSources.contains(fileDescriptor));
17865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
17965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    if (it != m_eventSources.end()) {
18065f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        Vector<EventSource*> sources = it->second;
18165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        for (unsigned i = 0; i < sources.size(); i++)
1822daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch            sources[i]->cancel();
18365f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
18465f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch        m_eventSources.remove(it);
18565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    }
18665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
18765f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
1882daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WorkQueue::scheduleWorkOnSource(GSource* dispatchSource, PassOwnPtr<WorkItem> item, GSourceFunc sourceCallback)
1892daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
1902daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    EventSource* eventSource = new EventSource(item, this, 0);
1912daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1922daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    g_source_set_callback(dispatchSource, sourceCallback, eventSource,
1932daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch                          reinterpret_cast<GDestroyNotify>(&WorkQueue::EventSource::deleteEventSource));
1942daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
1952daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    g_source_attach(dispatchSource, m_eventContext);
1962daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
1972daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
19865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdochvoid WorkQueue::scheduleWork(PassOwnPtr<WorkItem> item)
19965f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2002daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GRefPtr<GSource> dispatchSource = adoptGRef(g_idle_source_new());
20165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch    ASSERT(dispatchSource);
2022daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    g_source_set_priority(dispatchSource.get(), G_PRIORITY_DEFAULT);
2032daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2042daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    scheduleWorkOnSource(dispatchSource.get(), item, reinterpret_cast<GSourceFunc>(&WorkQueue::EventSource::performWorkOnce));
20565f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
20665f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch
2072daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WorkQueue::scheduleWorkAfterDelay(PassOwnPtr<WorkItem> item, double delay)
20865f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch{
2092daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GRefPtr<GSource> dispatchSource = adoptGRef(g_timeout_source_new(static_cast<guint>(delay * 1000)));
2102daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(dispatchSource);
2112daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2122daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    scheduleWorkOnSource(dispatchSource.get(), item, reinterpret_cast<GSourceFunc>(&WorkQueue::EventSource::performWorkOnce));
2132daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch}
2142daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2152daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdochvoid WorkQueue::scheduleWorkOnTermination(WebKit::PlatformProcessIdentifier process, PassOwnPtr<WorkItem> item)
2162daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch{
2172daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    GRefPtr<GSource> dispatchSource = adoptGRef(g_child_watch_source_new(process));
2182daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    ASSERT(dispatchSource);
2192daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch
2202daae5fd11344eaa88a0d92b0f6d65f8d2255c00Ben Murdoch    scheduleWorkOnSource(dispatchSource.get(), item, reinterpret_cast<GSourceFunc>(&WorkQueue::EventSource::performWorkOnTermination));
22165f03d4f644ce73618e5f4f50dd694b26f55ae12Ben Murdoch}
222