OWBI1_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 "OWBI1_config.h"
00036 #include "OWBI1_AtomicOps.hpp"
00037 
00038 #if defined(OWBI1_USE_PTHREAD_SPIN_LOCK_ATOMIC_OPS)
00039 
00040 namespace OWBI1
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 OWBI1
00079 
00080 #elif defined(OWBI1_USE_OWBI1_DEFAULT_ATOMIC_OPS)
00081 #include "OW_Mutex.hpp"
00082 #include "OW_MutexLock.hpp"
00083 
00084 #include "OW_Mutex.hpp"
00085 #include "OW_MutexLock.hpp"
00086 #include "OW_ThreadOnce.hpp"
00087 
00088 namespace OWBI1
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 OpenWBEM::Mutex* guard = 0;
00095 static OpenWBEM::OnceFlag g_once = OW_ONCE_INIT;
00096 static void initGuard()
00097 {
00098    guard = new OpenWBEM::Mutex();
00099 }
00100 void AtomicInc(Atomic_t &v)
00101 {
00102    OpenWBEM::callOnce(g_once, initGuard);
00103    OpenWBEM::MutexLock lock(*guard);
00104    ++v.val;
00105 }
00106 bool AtomicDecAndTest(Atomic_t &v)
00107 {
00108    OpenWBEM::callOnce(g_once, initGuard);
00109    OpenWBEM::MutexLock lock(*guard);
00110    return --v.val == 0;
00111 }
00112 int AtomicGet(Atomic_t const &v)
00113 {
00114    OpenWBEM::callOnce(g_once, initGuard);
00115    OpenWBEM::MutexLock lock(*guard);
00116    return v.val;
00117 }
00118 void AtomicDec(Atomic_t &v)
00119 {
00120    OpenWBEM::callOnce(g_once, initGuard);
00121    OpenWBEM::MutexLock lock(*guard);
00122    --v.val;
00123 }
00124 
00125 } // end namespace OWBI1
00126 
00127 #endif
00128 
00129 

Generated on Thu Feb 9 08:48:25 2006 for openwbem by  doxygen 1.4.6