18e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project/* 28e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project * Copyright (C) 2007 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 Computer, 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#include "config.h" 308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "Threading.h" 318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 32d0825bca7fe65beaee391d30da42e937db621564Steve Block#if !ENABLE(SINGLE_THREADED) 33d0825bca7fe65beaee391d30da42e937db621564Steve Block 34635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "CurrentTime.h" 358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "HashMap.h" 368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include "MainThread.h" 37635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project#include "RandomNumberSeed.h" 388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QCoreApplication> 408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QMutex> 418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QThread> 428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project#include <QWaitCondition> 438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectnamespace WTF { 458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectclass ThreadPrivate : public QThread { 478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectpublic: 488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ThreadPrivate(ThreadFunction entryPoint, void* data); 498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void run(); 508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* getReturnValue() { return m_returnValue; } 518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectprivate: 528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* m_data; 538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ThreadFunction m_entryPoint; 548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project void* m_returnValue; 558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project}; 568e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThreadPrivate::ThreadPrivate(ThreadFunction entryPoint, void* data) 588e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_data(data) 598e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_entryPoint(entryPoint) 608e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project , m_returnValue(0) 618e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ThreadPrivate::run() 658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_returnValue = m_entryPoint(m_data); 678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 688e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 69d0825bca7fe65beaee391d30da42e937db621564Steve Blockclass ThreadMonitor : public QObject { 70d0825bca7fe65beaee391d30da42e937db621564Steve Block Q_OBJECT 71d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic: 72d0825bca7fe65beaee391d30da42e937db621564Steve Block static ThreadMonitor * instance() 73d0825bca7fe65beaee391d30da42e937db621564Steve Block { 74d0825bca7fe65beaee391d30da42e937db621564Steve Block static ThreadMonitor *instance = new ThreadMonitor(); 75d0825bca7fe65beaee391d30da42e937db621564Steve Block return instance; 76d0825bca7fe65beaee391d30da42e937db621564Steve Block } 77d0825bca7fe65beaee391d30da42e937db621564Steve Block 78d0825bca7fe65beaee391d30da42e937db621564Steve Blockpublic Q_SLOTS: 79d0825bca7fe65beaee391d30da42e937db621564Steve Block void threadFinished() 80d0825bca7fe65beaee391d30da42e937db621564Steve Block { 81d0825bca7fe65beaee391d30da42e937db621564Steve Block sender()->deleteLater(); 82d0825bca7fe65beaee391d30da42e937db621564Steve Block } 83d0825bca7fe65beaee391d30da42e937db621564Steve Block}; 848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 85635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic Mutex* atomicallyInitializedStaticMutex; 868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic Mutex& threadMapMutex() 888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static Mutex mutex; 908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return mutex; 918e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 928e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic HashMap<ThreadIdentifier, QThread*>& threadMap() 948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static HashMap<ThreadIdentifier, QThread*> map; 968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return map; 978e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 99635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectstatic ThreadIdentifier identifierByQthreadHandle(QThread*& thread) 100635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 101635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project MutexLocker locker(threadMapMutex()); 102635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 103635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project HashMap<ThreadIdentifier, QThread*>::iterator i = threadMap().begin(); 104635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project for (; i != threadMap().end(); ++i) { 105635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (i->second == thread) 106635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return i->first; 107635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project } 108635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 109635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return 0; 110635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 111635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1128e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic ThreadIdentifier establishIdentifierForThread(QThread*& thread) 1138e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 114635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(!identifierByQthreadHandle(thread)); 115635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 1168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MutexLocker locker(threadMapMutex()); 1178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project static ThreadIdentifier identifierCount = 1; 1198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project threadMap().add(identifierCount, thread); 1218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return identifierCount++; 1238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic void clearThreadForIdentifier(ThreadIdentifier id) 1268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MutexLocker locker(threadMapMutex()); 1288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(threadMap().contains(id)); 1308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project threadMap().remove(id); 1328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectstatic QThread* threadForIdentifier(ThreadIdentifier id) 1358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project MutexLocker locker(threadMapMutex()); 1378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return threadMap().get(id); 1398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid initializeThreading() 1428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 143635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (!atomicallyInitializedStaticMutex) { 1448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project atomicallyInitializedStaticMutex = new Mutex; 1458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project threadMapMutex(); 146635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project initializeRandomNumberGenerator(); 1478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 1488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 150635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid lockAtomicallyInitializedStaticMutex() 151635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 152635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project ASSERT(atomicallyInitializedStaticMutex); 153635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project atomicallyInitializedStaticMutex->lock(); 154635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 155635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 156635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectvoid unlockAtomicallyInitializedStaticMutex() 157635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project{ 158635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project atomicallyInitializedStaticMutex->unlock(); 159635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project} 160635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 161635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source ProjectThreadIdentifier createThreadInternal(ThreadFunction entryPoint, void* data, const char*) 1628e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1638e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ThreadPrivate* thread = new ThreadPrivate(entryPoint, data); 1648e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (!thread) { 1658e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project LOG_ERROR("Failed to create thread at entry point %p with data %p", entryPoint, data); 1668e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return 0; 1678e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project } 168d0825bca7fe65beaee391d30da42e937db621564Steve Block 169d0825bca7fe65beaee391d30da42e937db621564Steve Block QObject::connect(thread, SIGNAL(finished()), ThreadMonitor::instance(), SLOT(threadFinished())); 170d0825bca7fe65beaee391d30da42e937db621564Steve Block 1718e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project thread->start(); 1728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project QThread* threadRef = static_cast<QThread*>(thread); 1748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return establishIdentifierForThread(threadRef); 1768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 178d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid initializeCurrentThreadInternal(const char*) 1798f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian{ 1808f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian} 1818f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian 1828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectint waitForThreadCompletion(ThreadIdentifier threadID, void** result) 1838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 1848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project ASSERT(threadID); 1858e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1868e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project QThread* thread = threadForIdentifier(threadID); 1878e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1888e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project bool res = thread->wait(); 1898e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1908e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project clearThreadForIdentifier(threadID); 191635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (result) 192635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project *result = static_cast<ThreadPrivate*>(thread)->getReturnValue(); 1938e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 1948e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return !res; 1958e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 1968e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 197d0825bca7fe65beaee391d30da42e937db621564Steve Blockvoid detachThread(ThreadIdentifier threadID) 1988e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 199d0825bca7fe65beaee391d30da42e937db621564Steve Block ASSERT(threadID); 200d0825bca7fe65beaee391d30da42e937db621564Steve Block clearThreadForIdentifier(threadID); 2018e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2028e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2038e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThreadIdentifier currentThread() 2048e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2058e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project QThread* currentThread = QThread::currentThread(); 2068e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project if (ThreadIdentifier id = identifierByQthreadHandle(currentThread)) 2078e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return id; 2088e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return establishIdentifierForThread(currentThread); 2098e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2108e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 211db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Blockvoid yield() 212db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block{ 213db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block QThread::yieldCurrentThread(); 214db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block} 215db14019a23d96bc8a444b6576a5da8bd1cfbc8b0Steve Block 2168e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMutex::Mutex() 2178e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_mutex(new QMutex()) 2188e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2198e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2208e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2218e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectMutex::~Mutex() 2228e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2238e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_mutex; 2248e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2258e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2268e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Mutex::lock() 2278e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2288e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_mutex->lock(); 2298e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2308e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2318e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectbool Mutex::tryLock() 2328e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2338e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project return m_mutex->tryLock(); 2348e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2358e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2368e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid Mutex::unlock() 2378e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2388e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_mutex->unlock(); 2398e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2408e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2418e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThreadCondition::ThreadCondition() 2428e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project : m_condition(new QWaitCondition()) 2438e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2448e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2458e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2468e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source ProjectThreadCondition::~ThreadCondition() 2478e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2488e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project delete m_condition; 2498e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2508e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2518e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ThreadCondition::wait(Mutex& mutex) 2528e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2538e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_condition->wait(mutex.impl()); 2548e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2558e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 256635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Projectbool ThreadCondition::timedWait(Mutex& mutex, double absoluteTime) 2578e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 258635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project double currentTime = WTF::currentTime(); 259635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 260635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project // Time is in the past - return immediately. 261635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project if (absoluteTime < currentTime) 262635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return false; 263635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project 2648f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian // Time is too far in the future (and would overflow unsigned long) - wait forever. 2658f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian if (absoluteTime - currentTime > static_cast<double>(INT_MAX) / 1000.0) { 2668f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian wait(mutex); 2678f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian return true; 2688f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian } 2698e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2708f72e70a9fd78eec56623b3a62e68f16b7b27e28Feng Qian double intervalMilliseconds = (absoluteTime - currentTime) * 1000.0; 271635860845790a19bf50bbc51ba8fb66a96dde068The Android Open Source Project return m_condition->wait(mutex.impl(), static_cast<unsigned long>(intervalMilliseconds)); 2728e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2738e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2748e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ThreadCondition::signal() 2758e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2768e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_condition->wakeOne(); 2778e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2788e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2798e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Projectvoid ThreadCondition::broadcast() 2808e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project{ 2818e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project m_condition->wakeAll(); 2828e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} 2838e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project 2848e35f3cfc7fba1d1c829dc557ebad6409cbe16a2The Android Open Source Project} // namespace WebCore 285d0825bca7fe65beaee391d30da42e937db621564Steve Block 286d0825bca7fe65beaee391d30da42e937db621564Steve Block#include "ThreadingQt.moc" 287d0825bca7fe65beaee391d30da42e937db621564Steve Block 288d0825bca7fe65beaee391d30da42e937db621564Steve Block#endif 289