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