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