1/* 2 * Copyright (C) 2014 Igalia S.L. 3 * 4 * Redistribution and use in source and binary forms, with or without 5 * modification, are permitted provided that the following conditions 6 * are met: 7 * 1. Redistributions of source code must retain the above copyright 8 * notice, this list of conditions and the following disclaimer. 9 * 2. Redistributions in binary form must reproduce the above copyright 10 * notice, this list of conditions and the following disclaimer in the 11 * documentation and/or other materials provided with the distribution. 12 * 13 * THIS SOFTWARE IS PROVIDED BY APPLE INC. AND ITS CONTRIBUTORS ``AS IS'' 14 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, 15 * THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR 16 * PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL APPLE INC. OR ITS CONTRIBUTORS 17 * BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR 18 * CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF 19 * SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS 20 * INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN 21 * CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) 22 * ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF 23 * THE POSSIBILITY OF SUCH DAMAGE. 24 */ 25 26#ifndef GMainLoopSource_h 27#define GMainLoopSource_h 28 29#include <functional> 30#include <glib.h> 31#include <wtf/Noncopyable.h> 32#include <wtf/gobject/GRefPtr.h> 33 34typedef struct _GSocket GSocket; 35 36namespace WTF { 37 38class GMainLoopSource { 39 WTF_MAKE_NONCOPYABLE(GMainLoopSource); 40 WTF_MAKE_FAST_ALLOCATED; 41public: 42 static GMainLoopSource& createAndDeleteOnDestroy(); 43 44 WTF_EXPORT_PRIVATE GMainLoopSource(); 45 WTF_EXPORT_PRIVATE ~GMainLoopSource(); 46 47 static const bool Stop = false; 48 static const bool Continue = true; 49 50 WTF_EXPORT_PRIVATE bool isScheduled() const; 51 WTF_EXPORT_PRIVATE bool isActive() const; 52 53 WTF_EXPORT_PRIVATE void schedule(const char* name, std::function<void()>, int priority = G_PRIORITY_DEFAULT, std::function<void()> destroyFunction = nullptr, GMainContext* = nullptr); 54 WTF_EXPORT_PRIVATE void schedule(const char* name, std::function<bool()>, int priority = G_PRIORITY_DEFAULT, std::function<void()> destroyFunction = nullptr, GMainContext* = nullptr); 55 WTF_EXPORT_PRIVATE void schedule(const char* name, std::function<bool(GIOCondition)>, GSocket*, GIOCondition, std::function<void()> destroyFunction = nullptr, GMainContext* = nullptr); 56 WTF_EXPORT_PRIVATE void scheduleAfterDelay(const char* name, std::function<void()>, std::chrono::milliseconds, int priority = G_PRIORITY_DEFAULT, std::function<void()> destroyFunction = nullptr, GMainContext* = nullptr); 57 WTF_EXPORT_PRIVATE void scheduleAfterDelay(const char* name, std::function<bool()>, std::chrono::milliseconds, int priority = G_PRIORITY_DEFAULT, std::function<void()> destroyFunction = nullptr, GMainContext* = nullptr); 58 WTF_EXPORT_PRIVATE void scheduleAfterDelay(const char* name, std::function<void()>, std::chrono::seconds, int priority = G_PRIORITY_DEFAULT, std::function<void()> destroyFunction = nullptr, GMainContext* = nullptr); 59 WTF_EXPORT_PRIVATE void scheduleAfterDelay(const char* name, std::function<bool()>, std::chrono::seconds, int priority = G_PRIORITY_DEFAULT, std::function<void()> destroyFunction = nullptr, GMainContext* = nullptr); 60 WTF_EXPORT_PRIVATE void cancel(); 61 62private: 63 enum DeleteOnDestroyType { DeleteOnDestroy, DoNotDeleteOnDestroy }; 64 GMainLoopSource(DeleteOnDestroyType); 65 66 enum Status { Ready, Scheduled, Dispatched }; 67 68 void reset(); 69 void scheduleIdleSource(const char* name, GSourceFunc, int priority, GMainContext*); 70 void scheduleTimeoutSource(const char* name, GSourceFunc, int priority, GMainContext*); 71 void voidCallback(); 72 bool boolCallback(); 73 bool socketCallback(GIOCondition); 74 void destroy(); 75 76 static gboolean voidSourceCallback(GMainLoopSource*); 77 static gboolean boolSourceCallback(GMainLoopSource*); 78 static gboolean socketSourceCallback(GSocket*, GIOCondition, GMainLoopSource*); 79 80 DeleteOnDestroyType m_deleteOnDestroy; 81 Status m_status; 82 GRefPtr<GSource> m_source; 83 GRefPtr<GCancellable> m_cancellable; 84 std::function<void ()> m_voidCallback; 85 std::function<bool ()> m_boolCallback; 86 std::function<bool (GIOCondition)> m_socketCallback; 87 std::function<void ()> m_destroyCallback; 88}; 89 90} // namespace WTF 91 92using WTF::GMainLoopSource; 93 94#endif // GMainLoopSource_h 95