Merge "Fix build break by removing TIZEN_RECORDING_SURFACE_SET" into tizen_2.1
[framework/web/webkit-efl.git] / Source / WTF / wtf / ThreadingPrimitives.h
1 /*
2  * Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved.
3  * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com)
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  *
9  * 1.  Redistributions of source code must retain the above copyright
10  *     notice, this list of conditions and the following disclaimer. 
11  * 2.  Redistributions in binary form must reproduce the above copyright
12  *     notice, this list of conditions and the following disclaimer in the
13  *     documentation and/or other materials provided with the distribution. 
14  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of
15  *     its contributors may be used to endorse or promote products derived
16  *     from this software without specific prior written permission. 
17  *
18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY
19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED
20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE
21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY
22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES
23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES;
24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND
25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT
26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF
27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
28  *
29  */
30
31 #ifndef ThreadingPrimitives_h
32 #define ThreadingPrimitives_h
33
34 #include <wtf/Platform.h>
35
36 #include <wtf/Assertions.h>
37 #include <wtf/FastAllocBase.h>
38 #include <wtf/Locker.h>
39 #include <wtf/Noncopyable.h>
40
41 #if OS(WINDOWS)
42 #include <windows.h>
43 #endif
44
45 #if USE(PTHREADS)
46 #include <pthread.h>
47 #endif
48
49 namespace WTF {
50
51 #if USE(PTHREADS)
52 typedef pthread_mutex_t PlatformMutex;
53 #if HAVE(PTHREAD_RWLOCK)
54 typedef pthread_rwlock_t PlatformReadWriteLock;
55 #else
56 typedef void* PlatformReadWriteLock;
57 #endif
58 typedef pthread_cond_t PlatformCondition;
59 #elif OS(WINDOWS)
60 struct PlatformMutex {
61     CRITICAL_SECTION m_internalMutex;
62     size_t m_recursionCount;
63 };
64 typedef void* PlatformReadWriteLock; // FIXME: Implement.
65 struct PlatformCondition {
66     size_t m_waitersGone;
67     size_t m_waitersBlocked;
68     size_t m_waitersToUnblock; 
69     HANDLE m_blockLock;
70     HANDLE m_blockQueue;
71     HANDLE m_unblockLock;
72
73     bool timedWait(PlatformMutex&, DWORD durationMilliseconds);
74     void signal(bool unblockAll);
75 };
76 #else
77 typedef void* PlatformMutex;
78 typedef void* PlatformReadWriteLock;
79 typedef void* PlatformCondition;
80 #endif
81     
82 class Mutex {
83     WTF_MAKE_NONCOPYABLE(Mutex); WTF_MAKE_FAST_ALLOCATED;
84 public:
85     WTF_EXPORT_PRIVATE Mutex();
86     WTF_EXPORT_PRIVATE ~Mutex();
87
88     WTF_EXPORT_PRIVATE void lock();
89     WTF_EXPORT_PRIVATE bool tryLock();
90     WTF_EXPORT_PRIVATE void unlock();
91
92 public:
93     PlatformMutex& impl() { return m_mutex; }
94 private:
95     PlatformMutex m_mutex;
96 };
97
98 typedef Locker<Mutex> MutexLocker;
99
100 class MutexTryLocker {
101     WTF_MAKE_NONCOPYABLE(MutexTryLocker);
102 public:
103     MutexTryLocker(Mutex& mutex) : m_mutex(mutex), m_locked(mutex.tryLock()) { }
104     ~MutexTryLocker()
105     {
106         if (m_locked)
107             m_mutex.unlock();
108     }
109
110     bool locked() const { return m_locked; }
111
112 private:
113     Mutex& m_mutex;
114     bool m_locked;
115 };
116
117 class ReadWriteLock {
118     WTF_MAKE_NONCOPYABLE(ReadWriteLock);
119 public:
120     ReadWriteLock();
121     ~ReadWriteLock();
122
123     void readLock();
124     bool tryReadLock();
125
126     void writeLock();
127     bool tryWriteLock();
128     
129     void unlock();
130
131 private:
132     PlatformReadWriteLock m_readWriteLock;
133 };
134
135 class ThreadCondition {
136     WTF_MAKE_NONCOPYABLE(ThreadCondition);
137 public:
138     WTF_EXPORT_PRIVATE ThreadCondition();
139     WTF_EXPORT_PRIVATE ~ThreadCondition();
140     
141     WTF_EXPORT_PRIVATE void wait(Mutex& mutex);
142     // Returns true if the condition was signaled before absoluteTime, false if the absoluteTime was reached or is in the past.
143     // The absoluteTime is in seconds, starting on January 1, 1970. The time is assumed to use the same time zone as WTF::currentTime().
144     WTF_EXPORT_PRIVATE bool timedWait(Mutex&, double absoluteTime);
145     WTF_EXPORT_PRIVATE void signal();
146     WTF_EXPORT_PRIVATE void broadcast();
147     
148 private:
149     PlatformCondition m_condition;
150 };
151
152 #if OS(WINDOWS)
153 // The absoluteTime is in seconds, starting on January 1, 1970. The time is assumed to use the same time zone as WTF::currentTime().
154 // Returns an interval in milliseconds suitable for passing to one of the Win32 wait functions (e.g., ::WaitForSingleObject).
155 DWORD absoluteTimeToWaitTimeoutInterval(double absoluteTime);
156 #endif
157
158 } // namespace WTF
159
160 using WTF::Mutex;
161 using WTF::MutexLocker;
162 using WTF::MutexTryLocker;
163 using WTF::ThreadCondition;
164
165 #if OS(WINDOWS)
166 using WTF::absoluteTimeToWaitTimeoutInterval;
167 #endif
168
169 #endif // ThreadingPrimitives_h