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