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

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

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

revision 1790 by persson, Sun Nov 2 12:05:00 2008 UTC revision 1887 by persson, Sat Apr 18 08:17:16 2009 UTC
# Line 1  Line 1 
1  /***************************************************************************  /***************************************************************************
2   *                                                                         *   *                                                                         *
3   *   Copyright (C) 2006-2008 Andreas Persson                               *   *   Copyright (C) 2006-2009 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 66  namespace LinuxSampler { Line 66  namespace LinuxSampler {
66                       *          thread                       *          thread
67                       */                       */
68                      const T& Lock() {                      const T& Lock() {
69                          lock.store(1, memory_order_relaxed);                          lock.store(lockCount += 2, memory_order_relaxed);
70                          atomic_thread_fence(memory_order_seq_cst);                          atomic_thread_fence(memory_order_seq_cst);
71                          return parent.config[parent.indexAtomic.load(                          return parent.config[parent.indexAtomic.load(
72                                  memory_order_acquire)];                                  memory_order_acquire)];
# Line 81  namespace LinuxSampler { Line 81  namespace LinuxSampler {
81                       * time threads are locked anymore.                       * time threads are locked anymore.
82                       */                       */
83                      void Unlock() {                      void Unlock() {
84                          atomic_thread_fence(memory_order_release);                          lock.store(0, memory_order_release);
                         lock.store(0, memory_order_relaxed);  
                         flag.store(0, memory_order_relaxed);  
85                      }                      }
86    
87                      Reader(SynchronizedConfig& config);                      Reader(SynchronizedConfig& config);
# Line 91  namespace LinuxSampler { Line 89  namespace LinuxSampler {
89                  private:                  private:
90                      friend class SynchronizedConfig;                      friend class SynchronizedConfig;
91                      SynchronizedConfig& parent;                      SynchronizedConfig& parent;
92                      atomic<int> lock;                      int lockCount; // increased in every Lock(),
93                      atomic<int> flag;                                     // lowest bit is always set.
94                      Reader *next; // only used locally in SwitchConfig                      atomic<int> lock; // equals lockCount when inside
95                                          // critical region, otherwise 0
96                        Reader* next; // only used locally in SwitchConfig
97                        int prevLock; // only used locally in SwitchConfig
98              };              };
99    
100    
# Line 150  namespace LinuxSampler { Line 151  namespace LinuxSampler {
151          for (typename std::set<Reader*>::iterator iter = readers.begin() ;          for (typename std::set<Reader*>::iterator iter = readers.begin() ;
152               iter != readers.end() ;               iter != readers.end() ;
153               iter++) {               iter++) {
154              (*iter)->flag.store(1, memory_order_relaxed);              (*iter)->prevLock = (*iter)->lock.load(memory_order_acquire);
155              if ((*iter)->lock.load(memory_order_acquire) &&              if ((*iter)->prevLock) {
                 (*iter)->flag.load(memory_order_acquire)) {  
156                  (*iter)->next = lockingReaders;                  (*iter)->next = lockingReaders;
157                  lockingReaders = *iter;                  lockingReaders = *iter;
158              }              }
# Line 163  namespace LinuxSampler { Line 163  namespace LinuxSampler {
163              usleep(50000);              usleep(50000);
164              Reader** prev = &lockingReaders;              Reader** prev = &lockingReaders;
165              for (Reader* p = lockingReaders ; p ; p = p->next) {              for (Reader* p = lockingReaders ; p ; p = p->next) {
166                 if (p->lock.load(memory_order_acquire) &&                  if (p->lock.load(memory_order_acquire) == p->prevLock) {
167                     p->flag.load(memory_order_acquire)) prev = &p->next;                      prev = &p->next;
168                  else *prev = p->next; // unlink                  } else {
169                        *prev = p->next; // unlink
170                    }
171              }              }
172          }          }
173    
# Line 178  namespace LinuxSampler { Line 180  namespace LinuxSampler {
180    
181      template <class T>      template <class T>
182      SynchronizedConfig<T>::Reader::Reader(SynchronizedConfig& config) :      SynchronizedConfig<T>::Reader::Reader(SynchronizedConfig& config) :
183          parent(config), lock(0), flag(0) {          parent(config), lock(0), lockCount(1) {
184          parent.readers.insert(this);          parent.readers.insert(this);
185      }      }
186    

Legend:
Removed from v.1790  
changed lines
  Added in v.1887

  ViewVC Help
Powered by ViewVC