3 * Copyright (C) 2005-2006 Mathias Froehlich
5 * This program is free software; you can redistribute it and/or
6 * modify it under the terms of the GNU General Public License as
7 * published by the Free Software Foundation; either version 2 of the
8 * License, or (at your option) any later version.
10 * This program is distributed in the hope that it will be useful, but
11 * WITHOUT ANY WARRANTY; without even the implied warranty of
12 * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
13 * General Public License for more details.
15 * You should have received a copy of the GNU General Public License
16 * along with this program; if not, write to the Free Software
17 * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA.
24 #if defined(__GNUC__) && (4 <= __GNUC__) && (1 <= __GNUC_MINOR__) \
25 && (defined(__i386__) || defined(__x86_64__))
26 // No need to include something. Is a Compiler API ...
27 # define SGATOMIC_USE_GCC4_BUILTINS
30 # define SGATOMIC_USE_WIN32_INTERLOCKED
32 // The sledge hammer ...
33 # include <simgear/threads/SGThread.hxx>
34 # include <simgear/threads/SGGuard.hxx>
39 SGAtomic(unsigned value = 0) : mValue(value)
43 #if defined(SGATOMIC_USE_GCC4_BUILTINS)
44 return __sync_add_and_fetch(&mValue, 1);
45 #elif defined(SGATOMIC_USE_WIN32_INTERLOCKED)
46 return InterlockedIncrement(reinterpret_cast<long volatile*>(&mValue));
48 SGGuard<SGMutex> lock(mMutex);
54 #if defined(SGATOMIC_USE_GCC4_BUILTINS)
55 return __sync_sub_and_fetch(&mValue, 1);
56 #elif defined(SGATOMIC_USE_WIN32_INTERLOCKED)
57 return InterlockedDecrement(reinterpret_cast<long volatile*>(&mValue));
59 SGGuard<SGMutex> lock(mMutex);
63 operator unsigned() const
65 #if defined(SGATOMIC_USE_GCC4_BUILTINS)
68 #elif defined(SGATOMIC_USE_WIN32_INTERLOCKED)
69 return static_cast<unsigned const volatile &>(mValue);
71 SGGuard<SGMutex> lock(mMutex);
77 SGAtomic(const SGAtomic&);
78 SGAtomic& operator=(const SGAtomic&);
80 #if !defined(SGATOMIC_USE_GCC4_BUILTINS) \
81 && !defined(SGATOMIC_USE_WIN32_INTERLOCKED)
82 mutable SGMutex mMutex;
84 #ifdef SGATOMIC_USE_WIN32_INTERLOCKED