(file) Return to AtomicInt.h CVS log (file) (dir) Up to [Pegasus] / pegasus / src / Pegasus / Common

Diff for /pegasus/src/Pegasus/Common/AtomicInt.h between version 1.24 and 1.25

version 1.24, 2013/05/04 17:36:17 version 1.25, 2013/08/12 06:03:02
Line 96 
Line 96 
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END
  
 // if GNU GCC version >= 4.7.0, use the built-in atomic operations // if GNU GCC version >= 4.7.0, use the built-in atomic operations
 #if defined(GCC_VERSION) && GCC_VERSION >= 40700  // Clang uses libstdc++ and Atmic operations in clang appreared in clang 3.1
   #if defined(GCC_VERSION) && GCC_VERSION >= 40700 || \
      defined (__clang__ ) && ( __clang_major__ >= 3 && __clang_minor__ >= 1)
 # define PEGASUS_ATOMIC_INT_DEFINED # define PEGASUS_ATOMIC_INT_DEFINED
  
 PEGASUS_NAMESPACE_BEGIN PEGASUS_NAMESPACE_BEGIN
Line 156 
Line 158 
 //============================================================================== //==============================================================================
 // //
 // PEGASUS_PLATFORM_LINUX_IX86_GNU // PEGASUS_PLATFORM_LINUX_IX86_GNU
   // PEGASUS_PLATFORM_LINUX_IX86_CLANG
 // PEGASUS_PLATFORM_DARWIN_IX86_GNU // PEGASUS_PLATFORM_DARWIN_IX86_GNU
 // PEGASUS_PLATFORM_LINUX_X86_64_GNU // PEGASUS_PLATFORM_LINUX_X86_64_GNU
   // PEGASUS_PLATFORM_LINUX_X86_64_CLANG
 // //
 //============================================================================== //==============================================================================
  
 #if defined(PEGASUS_PLATFORM_LINUX_IX86_GNU) || \ #if defined(PEGASUS_PLATFORM_LINUX_IX86_GNU) || \
       defined(PEGASUS_PLATFORM_LINUX_IX86_CLANG) || \
     defined(PEGASUS_PLATFORM_DARWIN_IX86_GNU) || \     defined(PEGASUS_PLATFORM_DARWIN_IX86_GNU) || \
     defined(PEGASUS_PLATFORM_LINUX_X86_64_GNU)      defined(PEGASUS_PLATFORM_LINUX_X86_64_GNU) || \
       defined(PEGASUS_PLATFORM_LINUX_X86_64_CLANG)
 # define PEGASUS_ATOMIC_INT_DEFINED # define PEGASUS_ATOMIC_INT_DEFINED
  
 // Note: this lock can be eliminated for single processor systems. // Note: this lock can be eliminated for single processor systems.
Line 524 
Line 530 
  
 //============================================================================== //==============================================================================
 // //
   // PEGASUS_PLATFORM_LINUX_XSCALE_GNU
   //
   //==============================================================================
   
   #if defined (PEGASUS_PLATFORM_LINUX_XSCALE_GNU)
   # define PEGASUS_ATOMIC_INT_DEFINED
   
   PEGASUS_NAMESPACE_BEGIN
   
   inline void AtomicIntDisableIRQs(unsigned long& flags)
   {
       unsigned long temp;
       unsigned long x;
   
       asm volatile(
           "mrs %0, cpsr\n"
           "orr %1, %0, #128\n"
           "msr cpsr_c, %1\n"
           : "=r" (x), "=r" (temp)
           :
           : "memory");
   
       flags = x;
   }
   
   inline void AtomicIntEnableIRQs(unsigned long x)
   {
       unsigned long temp;
   
       asm volatile(
           "mrs %0, cpsr\n"
           "orr %1, %0, #128\n"
           "msr cpsr_c, %1\n"
           : "=r" (x), "=r" (temp)
           :
           : "memory");
   }
   
   struct AtomicType
   {
       volatile Uint32 n;
   };
   
   PEGASUS_TEMPLATE_SPECIALIZATION
   inline AtomicIntTemplate<AtomicType>::AtomicIntTemplate(Uint32 n)
   {
       _rep.n = n;
   }
   
   PEGASUS_TEMPLATE_SPECIALIZATION
   inline AtomicIntTemplate<AtomicType>::~AtomicIntTemplate()
   {
   }
   
   PEGASUS_TEMPLATE_SPECIALIZATION
   inline Uint32 AtomicIntTemplate<AtomicType>::get() const
   {
       return _rep.n;
   }
   
   PEGASUS_TEMPLATE_SPECIALIZATION
   inline void AtomicIntTemplate<AtomicType>::set(Uint32 n)
   {
       _rep.n = n;
   }
   
   PEGASUS_TEMPLATE_SPECIALIZATION
   inline void AtomicIntTemplate<AtomicType>::inc()
   {
       unsigned long flags;
       AtomicIntDisableIRQs(flags);
       _rep.n++;
       AtomicIntEnableIRQs(flags);
   }
   
   PEGASUS_TEMPLATE_SPECIALIZATION
   inline void AtomicIntTemplate<AtomicType>::dec()
   {
       unsigned long flags;
       AtomicIntDisableIRQs(flags);
       _rep.n--;
       AtomicIntEnableIRQs(flags);
   }
   
   PEGASUS_TEMPLATE_SPECIALIZATION
   inline bool AtomicIntTemplate<AtomicType>::decAndTestIfZero()
   {
       Uint32 tmp;
       unsigned long flags;
       AtomicIntDisableIRQs(flags);
       tmp = --_rep.n;
       AtomicIntEnableIRQs(flags);
       return tmp == 0;
   }
   
   typedef AtomicIntTemplate<AtomicType> AtomicInt;
   
   PEGASUS_NAMESPACE_END
   
   #endif /* PEGASUS_PLATFORM_LINUX_XSCALE_GNU */
   
   
   #endif /* GCC_VERSION && GCC_VERSION >= 40700 */
   
   //==============================================================================
   //
 // PEGASUS_OS_TYPE_WINDOWS // PEGASUS_OS_TYPE_WINDOWS
 // //
 //============================================================================== //==============================================================================
Line 810 
Line 922 
  
 PEGASUS_NAMESPACE_END PEGASUS_NAMESPACE_END
  
 #endif //PEGASUS_PLATFORM_HPUX_IA64_GNU  #endif //PEGASUS_PLATFORM_HPUX_IA64_ACC
   
 //==============================================================================  
 //  
 // PEGASUS_PLATFORM_LINUX_XSCALE_GNU  
 //  
 //==============================================================================  
   
 #if defined (PEGASUS_PLATFORM_LINUX_XSCALE_GNU)  
 # define PEGASUS_ATOMIC_INT_DEFINED  
   
 PEGASUS_NAMESPACE_BEGIN  
   
 inline void AtomicIntDisableIRQs(unsigned long& flags)  
 {  
     unsigned long temp;  
     unsigned long x;  
   
     asm volatile(  
         "mrs %0, cpsr\n"  
         "orr %1, %0, #128\n"  
         "msr cpsr_c, %1\n"  
         : "=r" (x), "=r" (temp)  
         :  
         : "memory");  
   
     flags = x;  
 }  
   
 inline void AtomicIntEnableIRQs(unsigned long x)  
 {  
     unsigned long temp;  
   
     asm volatile(  
         "mrs %0, cpsr\n"  
         "orr %1, %0, #128\n"  
         "msr cpsr_c, %1\n"  
         : "=r" (x), "=r" (temp)  
         :  
         : "memory");  
 }  
   
 struct AtomicType  
 {  
     volatile Uint32 n;  
 };  
   
 PEGASUS_TEMPLATE_SPECIALIZATION  
 inline AtomicIntTemplate<AtomicType>::AtomicIntTemplate(Uint32 n)  
 {  
     _rep.n = n;  
 }  
   
 PEGASUS_TEMPLATE_SPECIALIZATION  
 inline AtomicIntTemplate<AtomicType>::~AtomicIntTemplate()  
 {  
 }  
   
 PEGASUS_TEMPLATE_SPECIALIZATION  
 inline Uint32 AtomicIntTemplate<AtomicType>::get() const  
 {  
     return _rep.n;  
 }  
   
 PEGASUS_TEMPLATE_SPECIALIZATION  
 inline void AtomicIntTemplate<AtomicType>::set(Uint32 n)  
 {  
     _rep.n = n;  
 }  
   
 PEGASUS_TEMPLATE_SPECIALIZATION  
 inline void AtomicIntTemplate<AtomicType>::inc()  
 {  
     unsigned long flags;  
     AtomicIntDisableIRQs(flags);  
     _rep.n++;  
     AtomicIntEnableIRQs(flags);  
 }  
   
 PEGASUS_TEMPLATE_SPECIALIZATION  
 inline void AtomicIntTemplate<AtomicType>::dec()  
 {  
     unsigned long flags;  
     AtomicIntDisableIRQs(flags);  
     _rep.n--;  
     AtomicIntEnableIRQs(flags);  
 }  
   
 PEGASUS_TEMPLATE_SPECIALIZATION  
 inline bool AtomicIntTemplate<AtomicType>::decAndTestIfZero()  
 {  
     Uint32 tmp;  
     unsigned long flags;  
     AtomicIntDisableIRQs(flags);  
     tmp = --_rep.n;  
     AtomicIntEnableIRQs(flags);  
     return tmp == 0;  
 }  
   
 typedef AtomicIntTemplate<AtomicType> AtomicInt;  
   
 PEGASUS_NAMESPACE_END  
   
 #endif /* PEGASUS_PLATFORM_LINUX_XSCALE_GNU */  
  
 //============================================================================== //==============================================================================
 // //
Line 1114 
Line 1123 
 #endif /* PEGASUS_PLATFORM_AIX_RS_IBMCXX, \ #endif /* PEGASUS_PLATFORM_AIX_RS_IBMCXX, \
         PEGASUS_PLATFORM_PASE_ISERIES_IBMCXX */         PEGASUS_PLATFORM_PASE_ISERIES_IBMCXX */
  
 #endif /* GCC_VERSION && GCC_VERSION >= 40700 */  
  
 //============================================================================== //==============================================================================
 // //


Legend:
Removed from v.1.24  
changed lines
  Added in v.1.25

No CVS admin address has been configured
Powered by
ViewCVS 0.9.2