OLD | NEW |
1 /* | 1 // Copyright 2017 The Chromium Authors. All rights reserved. |
2 * Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved. | 2 // Use of this source code is governed by a BSD-style license that can be |
3 * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com) | 3 // found in the LICENSE file. |
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 | 4 |
31 #ifndef ThreadingPrimitives_h | 5 #include "platform/wtf/ThreadingPrimitives.h" |
32 #define ThreadingPrimitives_h | |
33 | 6 |
34 #include "wtf/Allocator.h" | 7 // The contents of this header was moved to platform/wtf as part of |
35 #include "wtf/Assertions.h" | 8 // WTF migration project. See the following post for details: |
36 #include "wtf/Locker.h" | 9 // https://groups.google.com/a/chromium.org/d/msg/blink-dev/tLdAZCTlcAA/bYXVT8gY
CAAJ |
37 #include "wtf/Noncopyable.h" | |
38 #include "wtf/WTFExport.h" | |
39 | |
40 #if OS(WIN) | |
41 #include <windows.h> | |
42 #endif | |
43 | |
44 #if OS(POSIX) | |
45 #include <pthread.h> | |
46 #endif | |
47 | |
48 namespace WTF { | |
49 | |
50 #if OS(POSIX) | |
51 struct PlatformMutex { | |
52 pthread_mutex_t m_internalMutex; | |
53 #if DCHECK_IS_ON() | |
54 size_t m_recursionCount; | |
55 #endif | |
56 }; | |
57 typedef pthread_cond_t PlatformCondition; | |
58 #elif OS(WIN) | |
59 struct PlatformMutex { | |
60 CRITICAL_SECTION m_internalMutex; | |
61 size_t m_recursionCount; | |
62 }; | |
63 struct PlatformCondition { | |
64 size_t m_waitersGone; | |
65 size_t m_waitersBlocked; | |
66 size_t m_waitersToUnblock; | |
67 HANDLE m_blockLock; | |
68 HANDLE m_blockQueue; | |
69 HANDLE m_unblockLock; | |
70 | |
71 bool timedWait(PlatformMutex&, DWORD durationMilliseconds); | |
72 void signal(bool unblockAll); | |
73 }; | |
74 #else | |
75 typedef void* PlatformMutex; | |
76 typedef void* PlatformCondition; | |
77 #endif | |
78 | |
79 class WTF_EXPORT MutexBase { | |
80 WTF_MAKE_NONCOPYABLE(MutexBase); | |
81 USING_FAST_MALLOC(MutexBase); | |
82 | |
83 public: | |
84 ~MutexBase(); | |
85 | |
86 void lock(); | |
87 void unlock(); | |
88 #if DCHECK_IS_ON() | |
89 bool locked() { return m_mutex.m_recursionCount > 0; } | |
90 #endif | |
91 | |
92 public: | |
93 PlatformMutex& impl() { return m_mutex; } | |
94 | |
95 protected: | |
96 MutexBase(bool recursive); | |
97 | |
98 PlatformMutex m_mutex; | |
99 }; | |
100 | |
101 class WTF_EXPORT Mutex : public MutexBase { | |
102 public: | |
103 Mutex() : MutexBase(false) {} | |
104 bool tryLock(); | |
105 }; | |
106 | |
107 class WTF_EXPORT RecursiveMutex : public MutexBase { | |
108 public: | |
109 RecursiveMutex() : MutexBase(true) {} | |
110 bool tryLock(); | |
111 }; | |
112 | |
113 typedef Locker<MutexBase> MutexLocker; | |
114 | |
115 class MutexTryLocker final { | |
116 STACK_ALLOCATED(); | |
117 WTF_MAKE_NONCOPYABLE(MutexTryLocker); | |
118 | |
119 public: | |
120 MutexTryLocker(Mutex& mutex) : m_mutex(mutex), m_locked(mutex.tryLock()) {} | |
121 ~MutexTryLocker() { | |
122 if (m_locked) | |
123 m_mutex.unlock(); | |
124 } | |
125 | |
126 bool locked() const { return m_locked; } | |
127 | |
128 private: | |
129 Mutex& m_mutex; | |
130 bool m_locked; | |
131 }; | |
132 | |
133 class WTF_EXPORT ThreadCondition final { | |
134 USING_FAST_MALLOC(ThreadCondition); // Only HeapTest.cpp requires. | |
135 WTF_MAKE_NONCOPYABLE(ThreadCondition); | |
136 | |
137 public: | |
138 ThreadCondition(); | |
139 ~ThreadCondition(); | |
140 | |
141 void wait(MutexBase&); | |
142 // Returns true if the condition was signaled before absoluteTime, false if | |
143 // the absoluteTime was reached or is in the past. | |
144 // The absoluteTime is in seconds, starting on January 1, 1970. The time is | |
145 // assumed to use the same time zone as WTF::currentTime(). | |
146 bool timedWait(MutexBase&, double absoluteTime); | |
147 void signal(); | |
148 void broadcast(); | |
149 | |
150 private: | |
151 PlatformCondition m_condition; | |
152 }; | |
153 | |
154 #if OS(WIN) | |
155 // The absoluteTime is in seconds, starting on January 1, 1970. The time is | |
156 // assumed to use the same time zone as WTF::currentTime(). | |
157 // Returns an interval in milliseconds suitable for passing to one of the Win32 | |
158 // wait functions (e.g., ::WaitForSingleObject). | |
159 DWORD absoluteTimeToWaitTimeoutInterval(double absoluteTime); | |
160 #endif | |
161 | |
162 } // namespace WTF | |
163 | |
164 using WTF::MutexBase; | |
165 using WTF::Mutex; | |
166 using WTF::RecursiveMutex; | |
167 using WTF::MutexLocker; | |
168 using WTF::MutexTryLocker; | |
169 using WTF::ThreadCondition; | |
170 | |
171 #if OS(WIN) | |
172 using WTF::absoluteTimeToWaitTimeoutInterval; | |
173 #endif | |
174 | |
175 #endif // ThreadingPrimitives_h | |
OLD | NEW |