18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007, 2008 Apple Inc. All rights reserved. 38e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com) 48e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 58e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Redistribution and use in source and binary forms, with or without 68e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * modification, are permitted provided that the following conditions 78e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * are met: 88e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 98e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 1. Redistributions of source code must retain the above copyright 108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer. 118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 2. Redistributions in binary form must reproduce the above copyright 128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * notice, this list of conditions and the following disclaimer in the 138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * documentation and/or other materials provided with the distribution. 148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 3. Neither the name of Apple Inc. ("Apple") nor the names of 158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * its contributors may be used to endorse or promote products derived 168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * from this software without specific prior written permission. 178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * 188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project */ 298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "config.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Threading.h" 328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#if !USE(PTHREADS) 348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 35635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "CurrentTime.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HashMap.h" 378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MainThread.h" 38635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RandomNumberSeed.h" 39545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch#include <wtf/StdLibExtras.h> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <glib.h> 42635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include <limits.h> 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WTF { 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 46545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochtypedef HashMap<ThreadIdentifier, GThread*> ThreadMap; 47545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch 48635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic Mutex* atomicallyInitializedStaticMutex; 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic Mutex& threadMapMutex() 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 52545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch DEFINE_STATIC_LOCAL(Mutex, mutex, ()); 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mutex; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid initializeThreading() 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!g_thread_supported()) 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project g_thread_init(NULL); 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(g_thread_supported()); 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!atomicallyInitializedStaticMutex) { 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project atomicallyInitializedStaticMutex = new Mutex; 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project threadMapMutex(); 65635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project initializeRandomNumberGenerator(); 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 69635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid lockAtomicallyInitializedStaticMutex() 708e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 71635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(atomicallyInitializedStaticMutex); 72635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project atomicallyInitializedStaticMutex->lock(); 738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 75635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid unlockAtomicallyInitializedStaticMutex() 768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 77635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project atomicallyInitializedStaticMutex->unlock(); 78635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 80545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdochstatic ThreadMap& threadMap() 81635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 82545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch DEFINE_STATIC_LOCAL(ThreadMap, map, ()); 83635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return map; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ThreadIdentifier identifierByGthreadHandle(GThread*& thread) 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MutexLocker locker(threadMapMutex()); 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 90545e470e52f0ac6a3a072bf559c796b42c6066b6Ben Murdoch ThreadMap::iterator i = threadMap().begin(); 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project for (; i != threadMap().end(); ++i) { 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (i->second == thread) 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return i->first; 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic ThreadIdentifier establishIdentifierForThread(GThread*& thread) 100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(!identifierByGthreadHandle(thread)); 102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project MutexLocker locker(threadMapMutex()); 104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project static ThreadIdentifier identifierCount = 1; 106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project threadMap().add(identifierCount, thread); 108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return identifierCount++; 110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic GThread* threadForIdentifier(ThreadIdentifier id) 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MutexLocker locker(threadMapMutex()); 1158e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return threadMap().get(id); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void clearThreadForIdentifier(ThreadIdentifier id) 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MutexLocker locker(threadMapMutex()); 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(threadMap().contains(id)); 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project threadMap().remove(id); 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 128635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, const char*) 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GThread* thread; 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!(thread = g_thread_create(entryPoint, data, TRUE, 0))) { 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ERROR("Failed to create thread at entry point %p with data %p", entryPoint, data); 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ThreadIdentifier threadID = establishIdentifierForThread(thread); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return threadID; 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 140d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid initializeCurrentThreadInternal(const char*) 1418f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 1428f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 1438f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint waitForThreadCompletion(ThreadIdentifier threadID, void** result) 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(threadID); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GThread* thread = threadForIdentifier(threadID); 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project void* joinResult = g_thread_join(thread); 151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (result) 152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *result = joinResult; 1538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clearThreadForIdentifier(threadID); 1558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid detachThread(ThreadIdentifier) 1598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThreadIdentifier currentThread() 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GThread* currentThread = g_thread_self(); 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ThreadIdentifier id = identifierByGthreadHandle(currentThread)) 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return id; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return establishIdentifierForThread(currentThread); 1688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 170db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid yield() 171db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 172db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block g_thread_yield(); 173db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 174db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMutex::Mutex() 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_mutex(g_mutex_new()) 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMutex::~Mutex() 1818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Mutex::lock() 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project g_mutex_lock(m_mutex.get()); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Mutex::tryLock() 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return g_mutex_trylock(m_mutex.get()); 1928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Mutex::unlock() 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project g_mutex_unlock(m_mutex.get()); 1978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1998e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThreadCondition::ThreadCondition() 2008e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_condition(g_cond_new()) 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThreadCondition::~ThreadCondition() 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ThreadCondition::wait(Mutex& mutex) 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project g_cond_wait(m_condition.get(), mutex.impl().get()); 2118e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 213635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool ThreadCondition::timedWait(Mutex& mutex, double absoluteTime) 2148e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 215635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Time is in the past - return right away. 216635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (absoluteTime < currentTime()) 217635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 218635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 219635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Time is too far in the future for g_cond_timed_wait - wait forever. 220635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (absoluteTime > INT_MAX) { 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project wait(mutex); 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return true; 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 224635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 225635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int timeSeconds = static_cast<int>(absoluteTime); 226635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project int timeMicroseconds = static_cast<int>((absoluteTime - timeSeconds) * 1000000.0); 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project GTimeVal targetTime; 229635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project targetTime.tv_sec = timeSeconds; 230635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project targetTime.tv_usec = timeMicroseconds; 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return g_cond_timed_wait(m_condition.get(), mutex.impl().get(), &targetTime); 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ThreadCondition::signal() 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project g_cond_signal(m_condition.get()); 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ThreadCondition::broadcast() 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project g_cond_broadcast(m_condition.get()); 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#endif // !USE(PTHREADS) 249