/[svn]/linuxsampler/trunk/src/common/lsatomic.h
ViewVC logotype

Diff of /linuxsampler/trunk/src/common/lsatomic.h

Parent Directory Parent Directory | Revision Log Revision Log | View Patch Patch

revision 1794 by persson, Sun Nov 30 09:10:07 2008 UTC revision 1870 by persson, Sun Mar 22 16:53:01 2009 UTC
# Line 70  namespace LinuxSampler { Line 70  namespace LinuxSampler {
70          }          }
71      }      }
72    
73      template<typename T> class atomic {      template<typename T> class atomic;
74        template<> class atomic<int> { // int is the only implemented type
75      public:      public:
76          atomic() { }          atomic() { }
77          atomic(T m) : f(m) { }          explicit atomic(int m) : f(m) { }
78          T load(memory_order order = memory_order_seq_cst) const volatile {          int load(memory_order order = memory_order_seq_cst) const volatile {
79              T m;              int m;
80              switch (order) {              switch (order) {
81              case memory_order_relaxed:              case memory_order_relaxed:
82                  m = f;                  m = f;
# Line 90  namespace LinuxSampler { Line 91  namespace LinuxSampler {
91  #ifdef _ARCH_PPC  #ifdef _ARCH_PPC
92                  // PPC load-acquire: artificial dependency + isync                  // PPC load-acquire: artificial dependency + isync
93                  asm volatile(                  asm volatile(
 #ifdef _ARCH_PPC64  
                     "ld %0,%1\n\t"  
 #else  
94                      "lwz%U1%X1 %0,%1\n\t"                      "lwz%U1%X1 %0,%1\n\t"
 #endif  
95                      "cmpw %0,%0\n\t"                      "cmpw %0,%0\n\t"
96                      "bne- 1f\n\t"                      "bne- 1f\n\t"
97                      "1: isync"                      "1: isync"
98                      : "=r" (m)                      : "=r" (m)
99                      : "m"  (f)                      : "m"  (f)
100                      : "memory", "cc");                      : "memory", "cr0");
101  #else  #else
102                  m = f;                  m = f;
103                  asm volatile("" : : : "memory");                  asm volatile("" : : : "memory");
# Line 110  namespace LinuxSampler { Line 107  namespace LinuxSampler {
107              return m;              return m;
108          }          }
109    
110          void store(T m, memory_order order = memory_order_seq_cst) volatile {          void store(int m, memory_order order = memory_order_seq_cst) volatile {
111              switch (order) {              switch (order) {
112              case memory_order_relaxed:              case memory_order_relaxed:
113                  f = m;                  f = m;
# Line 119  namespace LinuxSampler { Line 116  namespace LinuxSampler {
116              case memory_order_release:              case memory_order_release:
117                  atomic_thread_fence(memory_order_release);                  atomic_thread_fence(memory_order_release);
118                  f = m;                  f = m;
                 asm volatile("" : : : "memory");  
119                  break;                  break;
120    
121              case memory_order_seq_cst:              case memory_order_seq_cst:
# Line 131  namespace LinuxSampler { Line 127  namespace LinuxSampler {
127              }              }
128          }          }
129      private:      private:
130          T f;          int f;
131            atomic(const atomic&); // not allowed
132            atomic& operator=(const atomic&); // not allowed
133      };      };
134  }  }
135  #endif  #endif

Legend:
Removed from v.1794  
changed lines
  Added in v.1870

  ViewVC Help
Powered by ViewVC