CrystalSpace

Public API Reference

csutil/threading/atomicops_msvc.h

00001 /*
00002   Copyright (C) 2006 by Marten Svanfeldt
00003 
00004   This library is free software; you can redistribute it and/or
00005   modify it under the terms of the GNU Lesser General Public
00006   License as published by the Free Software Foundation; either
00007   version 2 of the License, or (at your option) any later version.
00008 
00009   This library is distributed in the hope that it will be useful,
00010   but WITHOUT ANY WARRANTY; without even the implied warranty of
00011   MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
00012   Library General Public License for more details.
00013 
00014   You should have received a copy of the GNU Library General Public
00015   License along with this library; if not, write to the Free
00016   Software Foundation, Inc., 675 Mass Ave, Cambridge, MA 02139, USA.
00017 */
00018 
00019 #ifndef __CS_CSUTIL_ATOMICOPS_MSVC_H__
00020 #define __CS_CSUTIL_ATOMICOPS_MSVC_H__
00021 
00022 #ifndef DOXYGEN_RUN
00023 
00024 namespace CS
00025 {
00026 namespace Threading
00027 {
00028 
00029 #pragma warning(push)
00030 #pragma warning(disable: 4311)
00031 
00032   //Windows and MSVC, use intrinsics
00033   class AtomicOperationsMSVC
00034   {
00035   public:
00036     inline static int32 Set (int32* target, int32 value)
00037     {
00038       return (int32)_InterlockedExchange ((long*)target, value);
00039     }
00040 
00041     inline static void* Set (void** target, void* value)
00042     {
00043 #if CS_PROCESSOR_SIZE == 64
00044       return (void*)_InterlockedExchange64 ((__int64*)target, (__int64)value);
00045 #else
00046       return (void*)_InterlockedExchange ((long*)target, (long)value);
00047 #endif
00048     }
00049 
00050     inline static int32 CompareAndSet (int32* target, int32 value,
00051                                        int32 comparand)
00052     {
00053       return (int32)_InterlockedCompareExchange ((long*)target,
00054         (long)value, (long)comparand);
00055     }
00056 
00057     inline static void* CompareAndSet (void** target, void* value,
00058       void* comparand)
00059     {
00060 #if CS_PROCESSOR_SIZE == 64
00061       return (void*)_InterlockedCompareExchange64 ((__int64*)target, 
00062         (__int64)value, (__int64)comparand);
00063 #else
00064       return (void*)_InterlockedCompareExchange ((long*)target, 
00065         (long)value, (long)comparand);
00066 #endif
00067     }
00068 
00069     inline static int32 Increment (int32* target)
00070     {
00071       return (int32)_InterlockedIncrement ((long*)target);
00072     }
00073 
00074     inline static int32 Decrement (int32* target)
00075     {
00076       return (int32)_InterlockedDecrement ((long*)target);
00077     }
00078   };
00079 #pragma warning(pop)
00080   
00081 }
00082 }
00083 
00084 #endif // DOXYGEN_RUN
00085 
00086 #endif // __CS_CSUTIL_ATOMICOPS_MSVC_H__

Generated for Crystal Space 1.2.1 by doxygen 1.5.3