[GLIB] Remove delete on destroy GMainLoopSources
[WebKit-https.git] / Source / WTF / wtf / glib / GMainLoopSource.h
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 #if USE(GLIB)
30
31 #include <functional>
32 #include <glib.h>
33 #include <wtf/Noncopyable.h>
34 #include <wtf/glib/GRefPtr.h>
35
36 typedef struct _GSocket GSocket;
37
38 namespace WTF {
39
40 class GMainLoopSource {
41     WTF_MAKE_NONCOPYABLE(GMainLoopSource);
42     WTF_MAKE_FAST_ALLOCATED;
43 public:
44     WTF_EXPORT_PRIVATE GMainLoopSource() = default;
45     WTF_EXPORT_PRIVATE virtual ~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 virtual void schedule(const char* name, std::function<void()>&&, int priority = G_PRIORITY_DEFAULT, std::function<void()>&& destroyFunction = nullptr, GMainContext* = nullptr);
54     WTF_EXPORT_PRIVATE virtual void schedule(const char* name, std::function<bool()>&&, int priority = G_PRIORITY_DEFAULT, std::function<void()>&& destroyFunction = nullptr, GMainContext* = nullptr);
55     WTF_EXPORT_PRIVATE virtual void scheduleAfterDelay(const char* name, std::function<void()>&&, std::chrono::milliseconds, int priority = G_PRIORITY_DEFAULT, std::function<void()>&& destroyFunction = nullptr, GMainContext* = nullptr);
56     WTF_EXPORT_PRIVATE virtual void scheduleAfterDelay(const char* name, std::function<bool()>&&, std::chrono::milliseconds, int priority = G_PRIORITY_DEFAULT, std::function<void()>&& destroyFunction = nullptr, GMainContext* = nullptr);
57     WTF_EXPORT_PRIVATE virtual void scheduleAfterDelay(const char* name, std::function<void()>&&, std::chrono::seconds, int priority = G_PRIORITY_DEFAULT, std::function<void()>&& destroyFunction = nullptr, GMainContext* = nullptr);
58     WTF_EXPORT_PRIVATE virtual void scheduleAfterDelay(const char* name, std::function<bool()>&&, std::chrono::seconds, int priority = G_PRIORITY_DEFAULT, std::function<void()>&& destroyFunction = nullptr, GMainContext* = nullptr);
59     WTF_EXPORT_PRIVATE virtual void scheduleAfterDelay(const char* name, std::function<void()>&&, std::chrono::microseconds, int priority = G_PRIORITY_DEFAULT, std::function<void()>&& destroyFunction = nullptr, GMainContext* = nullptr);
60     WTF_EXPORT_PRIVATE virtual void scheduleAfterDelay(const char* name, std::function<bool()>&&, std::chrono::microseconds, int priority = G_PRIORITY_DEFAULT, std::function<void()>&& destroyFunction = nullptr, GMainContext* = nullptr);
61     WTF_EXPORT_PRIVATE virtual void cancel();
62
63     WTF_EXPORT_PRIVATE void schedule(const char* name, std::function<bool(GIOCondition)>&&, GSocket*, GIOCondition, std::function<void()>&& destroyFunction = nullptr, GMainContext* = nullptr);
64
65 protected:
66     enum Status { Ready, Scheduled, Dispatching };
67
68     struct Context {
69         Context() = default;
70         Context& operator=(Context&& c)
71         {
72             source = WTF::move(c.source);
73             cancellable = WTF::move(c.cancellable);
74             socketCancellable = WTF::move(c.socketCancellable);
75             voidCallback = WTF::move(c.voidCallback);
76             boolCallback = WTF::move(c.boolCallback);
77             socketCallback = WTF::move(c.socketCallback);
78             destroyCallback = WTF::move(c.destroyCallback);
79             return *this;
80         }
81
82         void destroySource();
83
84         GRefPtr<GSource> source;
85         GRefPtr<GCancellable> cancellable;
86         GRefPtr<GCancellable> socketCancellable;
87         std::function<void ()> voidCallback;
88         std::function<bool ()> boolCallback;
89         std::function<bool (GIOCondition)> socketCallback;
90         std::function<void ()> destroyCallback;
91     };
92
93     virtual void voidCallback();
94     virtual bool boolCallback();
95
96     virtual bool prepareVoidCallback(Context&);
97     virtual void finishVoidCallback();
98     virtual bool prepareBoolCallback(Context&);
99     virtual void finishBoolCallback(bool retval, Context&);
100
101 private:
102     void scheduleIdleSource(const char* name, GSourceFunc, int priority, GMainContext*);
103     void scheduleTimeoutSource(const char* name, GSourceFunc, int priority, GMainContext*);
104     bool socketCallback(GIOCondition);
105
106     static gboolean voidSourceCallback(GMainLoopSource*);
107     static gboolean boolSourceCallback(GMainLoopSource*);
108     static gboolean socketSourceCallback(GSocket*, GIOCondition, GMainLoopSource*);
109
110 protected:
111     Context m_context;
112     Status m_status { Ready };
113 };
114
115 } // namespace WTF
116
117 using WTF::GMainLoopSource;
118
119 #endif // USE(GLIB)
120
121 #endif // GMainLoopSource_h