OLD | NEW |
1 /* | 1 /* |
2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. | 2 * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. |
3 * Copyright (C) 2009 Google Inc. All rights reserved. | 3 * Copyright (C) 2009 Google Inc. All rights reserved. |
4 * Copyright (C) 2009 Torch Mobile, Inc. All rights reserved. | 4 * Copyright (C) 2009 Torch Mobile, Inc. All rights reserved. |
5 * | 5 * |
6 * Redistribution and use in source and binary forms, with or without | 6 * Redistribution and use in source and binary forms, with or without |
7 * modification, are permitted provided that the following conditions | 7 * modification, are permitted provided that the following conditions |
8 * are met: | 8 * are met: |
9 * | 9 * |
10 * 1. Redistributions of source code must retain the above copyright | 10 * 1. Redistributions of source code must retain the above copyright |
11 * notice, this list of conditions and the following disclaimer. | 11 * notice, this list of conditions and the following disclaimer. |
12 * 2. Redistributions in binary form must reproduce the above copyright | 12 * 2. Redistributions in binary form must reproduce the above copyright |
13 * notice, this list of conditions and the following disclaimer in the | 13 * notice, this list of conditions and the following disclaimer in the |
14 * documentation and/or other materials provided with the distribution. | 14 * documentation and/or other materials provided with the distribution. |
15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of | 15 * 3. Neither the name of Apple Computer, Inc. ("Apple") nor the names of |
16 * its contributors may be used to endorse or promote products derived | 16 * its contributors may be used to endorse or promote products derived |
17 * from this software without specific prior written permission. | 17 * from this software without specific prior written permission. |
18 * | 18 * |
19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | 19 * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY |
20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 20 * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED |
21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 21 * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE |
22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | 22 * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY |
23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 23 * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES |
24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 24 * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; |
25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 25 * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND |
26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 26 * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 27 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF |
(...skipping 209 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
237 | 237 |
238 threadID = static_cast<ThreadIdentifier>(threadIdentifier); | 238 threadID = static_cast<ThreadIdentifier>(threadIdentifier); |
239 storeThreadHandleByIdentifier(threadIdentifier, threadHandle); | 239 storeThreadHandleByIdentifier(threadIdentifier, threadHandle); |
240 | 240 |
241 return threadID; | 241 return threadID; |
242 } | 242 } |
243 | 243 |
244 int waitForThreadCompletion(ThreadIdentifier threadID) | 244 int waitForThreadCompletion(ThreadIdentifier threadID) |
245 { | 245 { |
246 ASSERT(threadID); | 246 ASSERT(threadID); |
247 | 247 |
248 HANDLE threadHandle = threadHandleForIdentifier(threadID); | 248 HANDLE threadHandle = threadHandleForIdentifier(threadID); |
249 if (!threadHandle) | 249 if (!threadHandle) |
250 LOG_ERROR("ThreadIdentifier %u did not correspond to an active thread wh
en trying to quit", threadID); | 250 LOG_ERROR("ThreadIdentifier %u did not correspond to an active thread wh
en trying to quit", threadID); |
251 | 251 |
252 DWORD joinResult = WaitForSingleObject(threadHandle, INFINITE); | 252 DWORD joinResult = WaitForSingleObject(threadHandle, INFINITE); |
253 if (joinResult == WAIT_FAILED) | 253 if (joinResult == WAIT_FAILED) |
254 LOG_ERROR("ThreadIdentifier %u was found to be deadlocked trying to quit
", threadID); | 254 LOG_ERROR("ThreadIdentifier %u was found to be deadlocked trying to quit
", threadID); |
255 | 255 |
256 CloseHandle(threadHandle); | 256 CloseHandle(threadHandle); |
257 clearThreadHandleForIdentifier(threadID); | 257 clearThreadHandleForIdentifier(threadID); |
258 | 258 |
259 return joinResult; | 259 return joinResult; |
260 } | 260 } |
261 | 261 |
(...skipping 26 matching lines...) Expand all Loading... |
288 Mutex::~Mutex() | 288 Mutex::~Mutex() |
289 { | 289 { |
290 DeleteCriticalSection(&m_mutex.m_internalMutex); | 290 DeleteCriticalSection(&m_mutex.m_internalMutex); |
291 } | 291 } |
292 | 292 |
293 void Mutex::lock() | 293 void Mutex::lock() |
294 { | 294 { |
295 EnterCriticalSection(&m_mutex.m_internalMutex); | 295 EnterCriticalSection(&m_mutex.m_internalMutex); |
296 ++m_mutex.m_recursionCount; | 296 ++m_mutex.m_recursionCount; |
297 } | 297 } |
298 | 298 |
299 bool Mutex::tryLock() | 299 bool Mutex::tryLock() |
300 { | 300 { |
301 // This method is modeled after the behavior of pthread_mutex_trylock, | 301 // This method is modeled after the behavior of pthread_mutex_trylock, |
302 // which will return an error if the lock is already owned by the | 302 // which will return an error if the lock is already owned by the |
303 // current thread. Since the primitive Win32 'TryEnterCriticalSection' | 303 // current thread. Since the primitive Win32 'TryEnterCriticalSection' |
304 // treats this as a successful case, it changes the behavior of several | 304 // treats this as a successful case, it changes the behavior of several |
305 // tests in WebKit that check to see if the current thread already | 305 // tests in WebKit that check to see if the current thread already |
306 // owned this mutex (see e.g., IconDatabase::getOrCreateIconRecord) | 306 // owned this mutex (see e.g., IconDatabase::getOrCreateIconRecord) |
307 DWORD result = TryEnterCriticalSection(&m_mutex.m_internalMutex); | 307 DWORD result = TryEnterCriticalSection(&m_mutex.m_internalMutex); |
308 | 308 |
309 if (result != 0) { // We got the lock | 309 if (result != 0) { // We got the lock |
310 // If this thread already had the lock, we must unlock and | 310 // If this thread already had the lock, we must unlock and |
311 // return false so that we mimic the behavior of POSIX's | 311 // return false so that we mimic the behavior of POSIX's |
312 // pthread_mutex_trylock: | 312 // pthread_mutex_trylock: |
313 if (m_mutex.m_recursionCount > 0) { | 313 if (m_mutex.m_recursionCount > 0) { |
314 LeaveCriticalSection(&m_mutex.m_internalMutex); | 314 LeaveCriticalSection(&m_mutex.m_internalMutex); |
315 return false; | 315 return false; |
316 } | 316 } |
317 | 317 |
318 ++m_mutex.m_recursionCount; | 318 ++m_mutex.m_recursionCount; |
(...skipping 179 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
498 // Time is too far in the future (and would overflow unsigned long) - wait f
orever. | 498 // Time is too far in the future (and would overflow unsigned long) - wait f
orever. |
499 if (absoluteTime - currentTime > static_cast<double>(INT_MAX) / 1000.0) | 499 if (absoluteTime - currentTime > static_cast<double>(INT_MAX) / 1000.0) |
500 return INFINITE; | 500 return INFINITE; |
501 | 501 |
502 return static_cast<DWORD>((absoluteTime - currentTime) * 1000.0); | 502 return static_cast<DWORD>((absoluteTime - currentTime) * 1000.0); |
503 } | 503 } |
504 | 504 |
505 } // namespace WTF | 505 } // namespace WTF |
506 | 506 |
507 #endif // OS(WINDOWS) | 507 #endif // OS(WINDOWS) |
OLD | NEW |