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