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