00001 /* 00002 * IMPORTANT: READ BEFORE DOWNLOADING, COPYING, INSTALLING OR USING. By 00003 * downloading, copying, installing or using the software you agree to 00004 * this license. If you do not agree to this license, do not download, 00005 * install, copy or use the software. 00006 * 00007 * Intel Open Source License 00008 * 00009 * Copyright (c) 2006 Intel Corporation. All rights reserved. 00010 * 00011 * Redistribution and use in source and binary forms, with or without 00012 * modification, are permitted provided that the following conditions are 00013 * met: 00014 * 00015 * Redistributions of source code must retain the above copyright 00016 * notice, this list of conditions and the following disclaimer. 00017 * 00018 * Redistributions in binary form must reproduce the above copyright 00019 * notice, this list of conditions and the following disclaimer in the 00020 * documentation and/or other materials provided with the distribution. 00021 * 00022 * Neither the name of the Intel Corporation nor the names of its 00023 * contributors may be used to endorse or promote products derived from 00024 * this software without specific prior written permission. 00025 * 00026 * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS 00027 * ``AS IS'' AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT 00028 * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR 00029 * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE INTEL OR 00030 * ITS CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, 00031 * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT 00032 * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, 00033 * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY 00034 * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT 00035 * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE 00036 * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. 00037 */ 00038 00039 #include "config.h" 00040 00041 #ifdef OASYS_ATOMIC_MUTEX 00042 00043 #include "Atomic-mutex.h" 00044 #include "Mutex.h" 00045 00046 namespace oasys { 00047 00052 Mutex g_atomic_mutex("/XXX/ATOMIC_MUTEX_UNUSED_LOGGER", 00053 Mutex::TYPE_FAST, 00054 true /* keep_quiet */); 00055 00059 Mutex* atomic_mutex() { return &g_atomic_mutex; } 00060 00061 //---------------------------------------------------------------------- 00062 void 00063 atomic_add(volatile atomic_t *v, u_int32_t i) 00064 { 00065 ScopeLock l(atomic_mutex(), "atomic_add"); 00066 v->value += i; 00067 } 00068 00069 //---------------------------------------------------------------------- 00070 void 00071 atomic_sub(volatile atomic_t* v, u_int32_t i) 00072 { 00073 ScopeLock l(atomic_mutex(), "atomic_sub"); 00074 v->value -= i; 00075 } 00076 00077 //---------------------------------------------------------------------- 00078 void 00079 atomic_incr(volatile atomic_t* v) 00080 { 00081 ScopeLock l(atomic_mutex(), "atomic_incr"); 00082 v->value++; 00083 } 00084 00085 //---------------------------------------------------------------------- 00086 void 00087 atomic_decr(volatile atomic_t* v) 00088 { 00089 ScopeLock l(atomic_mutex(), "atomic_decr"); 00090 v->value--; 00091 } 00092 00093 //---------------------------------------------------------------------- 00094 bool 00095 atomic_decr_test(volatile atomic_t* v) 00096 { 00097 ScopeLock l(atomic_mutex(), "atomic_decr_test"); 00098 v->value--; 00099 return (v->value == 0); 00100 } 00101 00102 //---------------------------------------------------------------------- 00103 u_int32_t 00104 atomic_cmpxchg32(volatile atomic_t* v, u_int32_t o, u_int32_t n) 00105 { 00106 ScopeLock l(atomic_mutex(), "atomic_cmpxchg32"); 00107 u_int32_t ret = v->value; 00108 00109 if (v->value == o) { 00110 v->value = n; 00111 } 00112 00113 return ret; 00114 } 00115 00116 //---------------------------------------------------------------------- 00117 u_int32_t 00118 atomic_incr_ret(volatile atomic_t* v) 00119 { 00120 ScopeLock l(atomic_mutex(), "atomic_incr_ret"); 00121 v->value++; 00122 return v->value; 00123 } 00124 00125 //---------------------------------------------------------------------- 00126 u_int32_t 00127 atomic_add_ret(volatile atomic_t* v, u_int32_t i) 00128 { 00129 ScopeLock l(atomic_mutex(), "atomic_add_ret"); 00130 v->value += i; 00131 return v->value; 00132 } 00133 00134 } // namespace oasys 00135 00136 #endif /* OASYS_ATOMIC_MUTEX */