revert RCU changes back to union-based solution to fix strict-aliasing; another ...
authorPaul Davis <paul@linuxaudiosystems.com>
Thu, 1 Mar 2007 19:49:00 +0000 (19:49 +0000)
committerPaul Davis <paul@linuxaudiosystems.com>
Thu, 1 Mar 2007 19:49:00 +0000 (19:49 +0000)
git-svn-id: svn://localhost/ardour2/trunk@1545 d708f5d6-7413-0410-9779-e7cbd77b26cf

libs/ardour/audio_diskstream.cc
libs/pbd/pbd/rcu.h

index f0316894e2e50cb53b7000a53bd9f263fd5adcad..6fe1cdc0a627cfdd276e653cc41c2b80e2f9881b 100644 (file)
@@ -1095,7 +1095,13 @@ AudioDiskstream::_do_refill (Sample* mixdown_buffer, float* gain_buffer)
        assert(mixdown_buffer);
        assert(gain_buffer);
 
+       vector.buf[0] = 0;
+       vector.len[0] = 0;
+       vector.buf[1] = 0;
+       vector.len[1] = 0;
+
        channels.front().playback_buf->get_write_vector (&vector);
+
        
        if ((total_space = vector.len[0] + vector.len[1]) == 0) {
                return 0;
index 86cc6e8cab0618a7d4165e0d30d83fbcca49bf88..c9088d51df3513cd4daf4e80b99ec2e74a90b252 100644 (file)
@@ -10,21 +10,23 @@ template<class T>
 class RCUManager
 {
   public:
        RCUManager (T* new_rcu_value) {
-               m_rcu_value = new boost::shared_ptr<T> (new_rcu_value);
+               x.m_rcu_value = new boost::shared_ptr<T> (new_rcu_value);
        }
-       
-       virtual ~RCUManager() { delete m_rcu_value; }
  
-        boost::shared_ptr<T> reader () const { return *((boost::shared_ptr<T> *) g_atomic_pointer_get ((volatile gpointer*) &m_rcu_value)); }
+       virtual ~RCUManager() { delete x.m_rcu_value; }
+        boost::shared_ptr<T> reader () const { return *((boost::shared_ptr<T> *) g_atomic_pointer_get (&x.gptr)); }
  
        virtual boost::shared_ptr<T> write_copy () = 0;
        virtual bool update (boost::shared_ptr<T> new_value) = 0;
 
-       volatile gpointer* pointer() const { return (volatile gpointer*) &m_rcu_value; }
-
   protected:
-       volatile boost::shared_ptr<T>* m_rcu_value;
+       union {
+           boost::shared_ptr<T>* m_rcu_value;
+           volatile gpointer gptr;
+       } x;
 };
  
  
@@ -57,7 +59,7 @@ public:
 
                // store the current 
 
-               current_write_old = (boost::shared_ptr<T>*) RCUManager<T>::m_rcu_value;
+               current_write_old = RCUManager<T>::x.m_rcu_value;
                
                boost::shared_ptr<T> new_copy (new T(**current_write_old));
 
@@ -73,7 +75,7 @@ public:
 
                // update, checking that nobody beat us to it
 
-               bool ret = g_atomic_pointer_compare_and_exchange (RCUManager<T>::pointer(),
+               bool ret = g_atomic_pointer_compare_and_exchange (&RCUManager<T>::x.gptr,
                                                                  (gpointer) current_write_old,
                                                                  (gpointer) new_spp);