| /* | 
 |  * Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved. | 
 |  * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com) | 
 |  * | 
 |  * Redistribution and use in source and binary forms, with or without | 
 |  * modification, are permitted provided that the following conditions | 
 |  * are met: | 
 |  * | 
 |  * 1.  Redistributions of source code must retain the above copyright | 
 |  *     notice, this list of conditions and the following disclaimer. | 
 |  * 2.  Redistributions in binary form must reproduce the above copyright | 
 |  *     notice, this list of conditions and the following disclaimer in the | 
 |  *     documentation and/or other materials provided with the distribution. | 
 |  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of | 
 |  *     its contributors may be used to endorse or promote products derived | 
 |  *     from this software without specific prior written permission. | 
 |  * | 
 |  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY | 
 |  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED | 
 |  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE | 
 |  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY | 
 |  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES | 
 |  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; | 
 |  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND | 
 |  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT | 
 |  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF | 
 |  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. | 
 |  * | 
 |  */ | 
 |  | 
 | #ifndef SKY_ENGINE_WTF_THREADINGPRIMITIVES_H_ | 
 | #define SKY_ENGINE_WTF_THREADINGPRIMITIVES_H_ | 
 |  | 
 | #include "sky/engine/wtf/Assertions.h" | 
 | #include "sky/engine/wtf/FastAllocBase.h" | 
 | #include "sky/engine/wtf/Locker.h" | 
 | #include "sky/engine/wtf/Noncopyable.h" | 
 | #include "sky/engine/wtf/WTFExport.h" | 
 |  | 
 | #if USE(PTHREADS) | 
 | #include <pthread.h> | 
 | #endif | 
 |  | 
 | namespace WTF { | 
 |  | 
 | #if USE(PTHREADS) | 
 | struct PlatformMutex { | 
 |     pthread_mutex_t m_internalMutex; | 
 | #if ENABLE(ASSERT) | 
 |     size_t m_recursionCount; | 
 | #endif | 
 | }; | 
 | typedef pthread_cond_t PlatformCondition; | 
 | #else | 
 | typedef void* PlatformMutex; | 
 | typedef void* PlatformCondition; | 
 | #endif | 
 |  | 
 | class WTF_EXPORT MutexBase { | 
 |     WTF_MAKE_NONCOPYABLE(MutexBase); WTF_MAKE_FAST_ALLOCATED; | 
 | public: | 
 |     ~MutexBase(); | 
 |  | 
 |     void lock(); | 
 |     void unlock(); | 
 | #if ENABLE(ASSERT) | 
 |     bool locked() { return m_mutex.m_recursionCount > 0; } | 
 | #endif | 
 |  | 
 | public: | 
 |     PlatformMutex& impl() { return m_mutex; } | 
 |  | 
 | protected: | 
 |     MutexBase(bool recursive); | 
 |  | 
 |     PlatformMutex m_mutex; | 
 | }; | 
 |  | 
 | class WTF_EXPORT Mutex : public MutexBase { | 
 | public: | 
 |     Mutex() : MutexBase(false) { } | 
 |     bool tryLock(); | 
 | }; | 
 |  | 
 | class WTF_EXPORT RecursiveMutex : public MutexBase { | 
 | public: | 
 |     RecursiveMutex() : MutexBase(true) { } | 
 |     bool tryLock(); | 
 | }; | 
 |  | 
 | typedef Locker<MutexBase> MutexLocker; | 
 |  | 
 | class MutexTryLocker { | 
 |     WTF_MAKE_NONCOPYABLE(MutexTryLocker); | 
 | public: | 
 |     MutexTryLocker(Mutex& mutex) : m_mutex(mutex), m_locked(mutex.tryLock()) { } | 
 |     ~MutexTryLocker() | 
 |     { | 
 |         if (m_locked) | 
 |             m_mutex.unlock(); | 
 |     } | 
 |  | 
 |     bool locked() const { return m_locked; } | 
 |  | 
 | private: | 
 |     Mutex& m_mutex; | 
 |     bool m_locked; | 
 | }; | 
 |  | 
 | class WTF_EXPORT ThreadCondition { | 
 |     WTF_MAKE_NONCOPYABLE(ThreadCondition); | 
 | public: | 
 |     ThreadCondition(); | 
 |     ~ThreadCondition(); | 
 |  | 
 |     void wait(MutexBase&); | 
 |     // Returns true if the condition was signaled before absoluteTime, false if the absoluteTime was reached or is in the past. | 
 |     // The absoluteTime is in seconds, starting on January 1, 1970. The time is assumed to use the same time zone as WTF::currentTime(). | 
 |     bool timedWait(MutexBase&, double absoluteTime); | 
 |     void signal(); | 
 |     void broadcast(); | 
 |  | 
 | private: | 
 |     PlatformCondition m_condition; | 
 | }; | 
 |  | 
 | } // namespace WTF | 
 |  | 
 | using WTF::MutexBase; | 
 | using WTF::Mutex; | 
 | using WTF::RecursiveMutex; | 
 | using WTF::MutexLocker; | 
 | using WTF::MutexTryLocker; | 
 | using WTF::ThreadCondition; | 
 |  | 
 | #endif  // SKY_ENGINE_WTF_THREADINGPRIMITIVES_H_ |