AtomicOps.cpp

Go to the documentation of this file.
00001 /*******************************************************************************
00002 * Copyright (C) 2004 Vintela, Inc. All rights reserved.
00003 * Copyright (C) 2005 Novell, Inc. All rights reserved.
00004 *
00005 * Redistribution and use in source and binary forms, with or without
00006 * modification, are permitted provided that the following conditions are met:
00007 *
00008 *  - Redistributions of source code must retain the above copyright notice,
00009 *    this list of conditions and the following disclaimer.
00010 *
00011 *  - Redistributions in binary form must reproduce the above copyright notice,
00012 *    this list of conditions and the following disclaimer in the documentation
00013 *    and/or other materials provided with the distribution.
00014 *
00015 *  - Neither the name of Vintela, Inc., Novell, Inc., nor the names of its
00016 *    contributors may be used to endorse or promote products derived from this
00017 *    software without specific prior written permission.
00018 *
00019 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS ``AS IS''
00020 * AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
00021 * IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
00022 * ARE DISCLAIMED. IN NO EVENT SHALL Vintela, Inc., Novell, Inc., OR THE 
00023 * CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, 
00024 * EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT LIMITED TO, 
00025 * PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, DATA, OR PROFITS; 
00026 * OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, 
00027 * WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR 
00028 * OTHERWISE) ARISING IN ANY WAY OUT OF THE USE OF THIS SOFTWARE, EVEN IF 
00029 * ADVISED OF THE POSSIBILITY OF SUCH DAMAGE.
00030 *******************************************************************************/
00031 
00032 
00037 #include "blocxx/BLOCXX_config.h"
00038 #include "blocxx/AtomicOps.hpp"
00039 
00040 #if defined(BLOCXX_USE_PTHREAD_SPIN_LOCK_ATOMIC_OPS)
00041 
00042 namespace BLOCXX_NAMESPACE
00043 {
00044 
00045 Atomic_t::Atomic_t()
00046    : val(0)
00047 {
00048    pthread_spin_init(&spinlock, 0);
00049 }
00050 Atomic_t::Atomic_t(int i)
00051    : val(i)
00052 {
00053    pthread_spin_init(&spinlock, 0);
00054 }
00055 void AtomicInc(Atomic_t &v)
00056 {
00057    pthread_spin_lock(&v.spinlock);
00058    ++v.val;
00059    pthread_spin_unlock(&v.spinlock);
00060 }
00061 bool AtomicDecAndTest(Atomic_t &v)
00062 {
00063    pthread_spin_lock(&v.spinlock);
00064    --v.val;
00065    bool b = ((v.val == 0) ? true : false) ;
00066    pthread_spin_unlock(&v.spinlock);
00067    return b;
00068 }
00069 int AtomicGet(Atomic_t const &v)
00070 {
00071    return v.val;
00072 }
00073 void AtomicDec(Atomic_t &v)
00074 {
00075    pthread_spin_lock(&v.spinlock);
00076    --v.val;
00077    pthread_spin_unlock(&v.spinlock);
00078 }
00079 
00080 } // end namespace BLOCXX_NAMESPACE
00081 
00082 #elif defined(BLOCXX_USE_BLOCXX_DEFAULT_ATOMIC_OPS)
00083 #include "blocxx/Mutex.hpp"
00084 #include "blocxx/MutexLock.hpp"
00085 #include "blocxx/ThreadOnce.hpp"
00086 
00087 namespace BLOCXX_NAMESPACE
00088 {
00089 
00090 // this needs to be a pointer because of static initialization order conflicts.  
00091 // It shouldn't ever be deleted b/c it may be referenced by a destructor of a 
00092 // static variable that is being deleted.
00093 static Mutex* guard = 0;
00094 static OnceFlag g_once = BLOCXX_ONCE_INIT; 
00095 static void initGuard()
00096 {
00097    guard = new Mutex();
00098 }
00099 void AtomicInc(Atomic_t &v)
00100 {
00101    callOnce(g_once, initGuard); 
00102    MutexLock lock(*guard);
00103    ++v.val;
00104 }
00105 bool AtomicDecAndTest(Atomic_t &v)
00106 {
00107    callOnce(g_once, initGuard); 
00108    MutexLock lock(*guard);
00109    return --v.val == 0;
00110 }
00111 int AtomicGet(Atomic_t const &v)
00112 {
00113    callOnce(g_once, initGuard); 
00114    MutexLock lock(*guard);
00115    return v.val;
00116 }
00117 void AtomicDec(Atomic_t &v)
00118 {
00119    callOnce(g_once, initGuard); 
00120    MutexLock lock(*guard);
00121    --v.val;
00122 }
00123 
00124 } // end namespace BLOCXX_NAMESPACE
00125 
00126 #endif
00127 
00128 

Generated on Fri Jun 16 15:39:08 2006 for blocxx by  doxygen 1.4.6