]>
git.saurik.com Git - apple/javascriptcore.git/blob - wtf/ThreadSafeShared.h
688747e3a381635b8a7fc8c52e1d8a067a9fe26a
   2  * Copyright (C) 2007, 2008, 2010 Apple Inc. All rights reserved. 
   3  * Copyright (C) 2007 Justin Haygood (jhaygood@reaktix.com) 
   5  * Redistribution and use in source and binary forms, with or without 
   6  * modification, are permitted provided that the following conditions 
   9  * 1.  Redistributions of source code must retain the above copyright 
  10  *     notice, this list of conditions and the following disclaimer.  
  11  * 2.  Redistributions in binary form must reproduce the above copyright 
  12  *     notice, this list of conditions and the following disclaimer in the 
  13  *     documentation and/or other materials provided with the distribution.  
  14  * 3.  Neither the name of Apple Computer, Inc. ("Apple") nor the names of 
  15  *     its contributors may be used to endorse or promote products derived 
  16  *     from this software without specific prior written permission.  
  18  * THIS SOFTWARE IS PROVIDED BY APPLE AND ITS CONTRIBUTORS "AS IS" AND ANY 
  19  * EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE IMPLIED 
  20  * WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE ARE 
  21  * DISCLAIMED. IN NO EVENT SHALL APPLE OR ITS CONTRIBUTORS BE LIABLE FOR ANY 
  22  * DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES 
  23  * (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; 
  24  * LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND 
  25  * ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 
  26  * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF 
  27  * THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 
  30  * Note: The implementations of InterlockedIncrement and InterlockedDecrement are based 
  31  * on atomic_increment and atomic_exchange_and_add from the Boost C++ Library. The license 
  32  * is virtually identical to the Apple license above but is included here for completeness. 
  34  * Boost Software License - Version 1.0 - August 17th, 2003 
  36  * Permission is hereby granted, free of charge, to any person or organization 
  37  * obtaining a copy of the software and accompanying documentation covered by 
  38  * this license (the "Software") to use, reproduce, display, distribute, 
  39  * execute, and transmit the Software, and to prepare derivative works of the 
  40  * Software, and to permit third-parties to whom the Software is furnished to 
  41  * do so, all subject to the following: 
  43  * The copyright notices in the Software and this entire statement, including 
  44  * the above license grant, this restriction and the following disclaimer, 
  45  * must be included in all copies of the Software, in whole or in part, and 
  46  * all derivative works of the Software, unless such copies or derivative 
  47  * works are solely in the form of machine-executable object code generated by 
  48  * a source language processor. 
  50  * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR 
  51  * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY, 
  52  * FITNESS FOR A PARTICULAR PURPOSE, TITLE AND NON-INFRINGEMENT. IN NO EVENT 
  53  * SHALL THE COPYRIGHT HOLDERS OR ANYONE DISTRIBUTING THE SOFTWARE BE LIABLE 
  54  * FOR ANY DAMAGES OR OTHER LIABILITY, WHETHER IN CONTRACT, TORT OR OTHERWISE, 
  55  * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER 
  56  * DEALINGS IN THE SOFTWARE. 
  59 #ifndef ThreadSafeShared_h 
  60 #define ThreadSafeShared_h 
  64 #include <wtf/Atomics.h> 
  65 #include <wtf/Noncopyable.h> 
  66 #include <wtf/ThreadingPrimitives.h> 
  70 class ThreadSafeSharedBase 
: public Noncopyable 
{ 
  72     ThreadSafeSharedBase(int initialRefCount 
= 1) 
  73         : m_refCount(initialRefCount
) 
  79 #if USE(LOCKFREE_THREADSAFESHARED) 
  80         atomicIncrement(&m_refCount
); 
  82         MutexLocker 
locker(m_mutex
); 
  89         return refCount() == 1; 
  94 #if !USE(LOCKFREE_THREADSAFESHARED) 
  95         MutexLocker 
locker(m_mutex
); 
  97         return static_cast<int const volatile &>(m_refCount
); 
 101     // Returns whether the pointer should be freed or not. 
 104 #if USE(LOCKFREE_THREADSAFESHARED) 
 105         if (atomicDecrement(&m_refCount
) <= 0) 
 110             MutexLocker 
locker(m_mutex
); 
 112             refCount 
= m_refCount
; 
 122     friend class CrossThreadRefCounted
; 
 125 #if !USE(LOCKFREE_THREADSAFESHARED) 
 126     mutable Mutex m_mutex
; 
 130 template<class T
> class ThreadSafeShared 
: public ThreadSafeSharedBase 
{ 
 132     ThreadSafeShared(int initialRefCount 
= 1) 
 133         : ThreadSafeSharedBase(initialRefCount
) 
 140             delete static_cast<T
*>(this); 
 146 using WTF::ThreadSafeShared
; 
 148 #endif // ThreadSafeShared_h