e7a00ef66244d7c933dc3840f7921a556e5d8072
[WebKit-https.git] / Source / WTF / wtf / efl / RunLoopEfl.cpp
1 /*
2  * Copyright (C) 2012 ProFUSION embedded systems. All rights reserved.
3  * Copyright (C) 2012 Samsung Electronics
4  *
5  * Redistribution and use in source and binary forms, with or without
6  * modification, are permitted provided that the following conditions
7  * are met:
8  * 1. Redistributions of source code must retain the above copyright
9  *    notice, this list of conditions and the following disclaimer.
10  * 2. Redistributions in binary form must reproduce the above copyright
11  *    notice, this list of conditions and the following disclaimer in the
12  *    documentation and/or other materials provided with the distribution.
13  *
14  * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS
15  * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT
16  * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR
17  * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT
18  * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL,
19  * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT
20  * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE,
21  * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY
22  * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
23  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE
24  * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
25  */
26
27 #include "config.h"
28 #include "RunLoop.h"
29
30 #include <Ecore.h>
31 #include <wtf/OwnPtr.h>
32 #include <wtf/PassOwnPtr.h>
33
34 static const int ecorePipeMessageSize = 1;
35 static const char wakupEcorePipeMessage[] = "W";
36
37 namespace WTF {
38
39 RunLoop::RunLoop()
40     : m_wakeUpEventRequested(false)
41 {
42     m_pipe = EflUniquePtr<Ecore_Pipe>(ecore_pipe_add(wakeUpEvent, this));
43 }
44
45 RunLoop::~RunLoop()
46 {
47 }
48
49 void RunLoop::run()
50 {
51     ecore_main_loop_begin();
52 }
53
54 void RunLoop::stop()
55 {
56     ecore_main_loop_quit();
57 }
58
59 void RunLoop::wakeUpEvent(void* data, void*, unsigned)
60 {
61     RunLoop* loop = static_cast<RunLoop*>(data);
62
63     {
64         MutexLocker locker(loop->m_wakeUpEventRequestedLock);
65         loop->m_wakeUpEventRequested = false;
66     }
67
68     loop->performWork();
69 }
70
71 void RunLoop::wakeUp()
72 {
73     {
74         MutexLocker locker(m_wakeUpEventRequestedLock);
75         if (m_wakeUpEventRequested)
76             return;
77         m_wakeUpEventRequested = true;
78     }
79
80     {
81         MutexLocker locker(m_pipeLock);
82         ecore_pipe_write(m_pipe.get(), wakupEcorePipeMessage, ecorePipeMessageSize);
83     }
84 }
85
86 RunLoop::TimerBase::TimerBase(RunLoop& runLoop)
87     : m_runLoop(runLoop)
88     , m_timer(0)
89     , m_isRepeating(false)
90 {
91 }
92
93 RunLoop::TimerBase::~TimerBase()
94 {
95     stop();
96 }
97
98 bool RunLoop::TimerBase::timerFired(void* data)
99 {
100     RunLoop::TimerBase* timer = static_cast<RunLoop::TimerBase*>(data);
101
102     if (!timer->m_isRepeating)
103         timer->m_timer = 0;
104
105     timer->fired();
106
107     return timer->m_isRepeating ? ECORE_CALLBACK_RENEW : ECORE_CALLBACK_CANCEL;
108 }
109
110 void RunLoop::TimerBase::start(double nextFireInterval, bool repeat)
111 {
112     if (isActive())
113         stop();
114
115     m_isRepeating = repeat;
116     ASSERT(!m_timer);
117     m_timer = ecore_timer_add(nextFireInterval, reinterpret_cast<Ecore_Task_Cb>(timerFired), this);
118 }
119
120 void RunLoop::TimerBase::stop()
121 {
122     if (m_timer) {
123         ecore_timer_del(m_timer);
124         m_timer = 0;
125     }
126 }
127
128 bool RunLoop::TimerBase::isActive() const
129 {
130     return (m_timer) ? true : false;
131 }
132
133 } // namespace WTF