/[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 2451 by persson, Sun Apr 29 16:14:45 2012 UTC revision 2452 by persson, Mon May 13 17:26:29 2013 UTC
# Line 1  Line 1 
1  /***************************************************************************  /***************************************************************************
2   *                                                                         *   *                                                                         *
3   *   Copyright (C) 2008-2012 Andreas Persson                               *   *   Copyright (C) 2008-2013 Andreas Persson                               *
4   *                                                                         *   *                                                                         *
5   *   This program is free software; you can redistribute it and/or modify  *   *   This program is free software; you can redistribute it and/or modify  *
6   *   it under the terms of the GNU General Public License as published by  *   *   it under the terms of the GNU General Public License as published by  *
# Line 75  Line 75 
75   * - load and store of atomic<int> with relaxed, acquire/release or   * - load and store of atomic<int> with relaxed, acquire/release or
76   *   seq_cst memory ordering   *   seq_cst memory ordering
77   *   *
78   * The supported architectures are x86 and powerpc.   * The supported architectures are x86, powerpc and ARMv7.
79   */   */
80    
81    
# Line 115  namespace LinuxSampler { Line 115  namespace LinuxSampler {
115              asm volatile("lwsync" : : : "memory");              asm volatile("lwsync" : : : "memory");
116  #elif defined(_ARCH_PPC)  #elif defined(_ARCH_PPC)
117              asm volatile("sync" : : : "memory");              asm volatile("sync" : : : "memory");
118    #elif defined(__ARM_ARCH_7A__)
119                asm volatile("dmb" : : : "memory");
120  #else  #else
121              asm volatile("" : : : "memory");              asm volatile("" : : : "memory");
122  #endif  #endif
# Line 127  namespace LinuxSampler { Line 129  namespace LinuxSampler {
129              asm volatile("lock; addl $0,0(%%esp)" : : : "memory");              asm volatile("lock; addl $0,0(%%esp)" : : : "memory");
130  #elif defined(__x86_64__)  #elif defined(__x86_64__)
131              asm volatile("mfence" : : : "memory");              asm volatile("mfence" : : : "memory");
132    #elif defined(__ARM_ARCH_7A__)
133                asm volatile("dmb" : : : "memory");
134  #else  #else
135              asm volatile("" : : : "memory");              asm volatile("" : : : "memory");
136  #endif  #endif
# Line 148  namespace LinuxSampler { Line 152  namespace LinuxSampler {
152    
153              case memory_order_seq_cst:              case memory_order_seq_cst:
154              case memory_order_release: // (invalid)              case memory_order_release: // (invalid)
155    #ifdef _ARCH_PPC
156                  atomic_thread_fence(memory_order_seq_cst);                  atomic_thread_fence(memory_order_seq_cst);
157    #endif
158                  // fall-through                  // fall-through
159    
160              case memory_order_acquire:              case memory_order_acquire:
# Line 164  namespace LinuxSampler { Line 170  namespace LinuxSampler {
170                      : "memory", "cr0");                      : "memory", "cr0");
171  #else  #else
172                  m = f;                  m = f;
173                  asm volatile("" : : : "memory");                  atomic_thread_fence(memory_order_acquire);
174  #endif  #endif
175                  break;                  break;
176              }              }
# Line 184  namespace LinuxSampler { Line 190  namespace LinuxSampler {
190    
191              case memory_order_seq_cst:              case memory_order_seq_cst:
192              case memory_order_acquire: // (invalid)              case memory_order_acquire: // (invalid)
193    #ifdef _ARCH_PPC
194                    atomic_thread_fence(memory_order_seq_cst);
195                    f = m;
196    #else
197                  atomic_thread_fence(memory_order_release);                  atomic_thread_fence(memory_order_release);
198                  f = m;                  f = m;
199                  atomic_thread_fence(memory_order_seq_cst);                  atomic_thread_fence(memory_order_seq_cst);
200    #endif
201                  break;                  break;
202              }              }
203          }          }

Legend:
Removed from v.2451  
changed lines
  Added in v.2452

  ViewVC Help
Powered by ViewVC