OW_AtomicOps.cpp

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

Generated on Thu Feb 9 08:47:52 2006 for openwbem by  doxygen 1.4.6