diff --git a/libs/ardour/audio_diskstream.cc b/libs/ardour/audio_diskstream.cc index f0316894e2..6fe1cdc0a6 100644 --- a/libs/ardour/audio_diskstream.cc +++ b/libs/ardour/audio_diskstream.cc @@ -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; diff --git a/libs/pbd/pbd/rcu.h b/libs/pbd/pbd/rcu.h index 86cc6e8cab..c9088d51df 100644 --- a/libs/pbd/pbd/rcu.h +++ b/libs/pbd/pbd/rcu.h @@ -10,21 +10,23 @@ template class RCUManager { public: - RCUManager (T* new_rcu_value) { - m_rcu_value = new boost::shared_ptr (new_rcu_value); - } - - virtual ~RCUManager() { delete m_rcu_value; } - boost::shared_ptr reader () const { return *((boost::shared_ptr *) g_atomic_pointer_get ((volatile gpointer*) &m_rcu_value)); } + RCUManager (T* new_rcu_value) { + x.m_rcu_value = new boost::shared_ptr (new_rcu_value); + } + + virtual ~RCUManager() { delete x.m_rcu_value; } + + boost::shared_ptr reader () const { return *((boost::shared_ptr *) g_atomic_pointer_get (&x.gptr)); } virtual boost::shared_ptr write_copy () = 0; virtual bool update (boost::shared_ptr new_value) = 0; - volatile gpointer* pointer() const { return (volatile gpointer*) &m_rcu_value; } - protected: - volatile boost::shared_ptr* m_rcu_value; + union { + boost::shared_ptr* m_rcu_value; + volatile gpointer gptr; + } x; }; @@ -57,7 +59,7 @@ public: // store the current - current_write_old = (boost::shared_ptr*) RCUManager::m_rcu_value; + current_write_old = RCUManager::x.m_rcu_value; boost::shared_ptr 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::pointer(), + bool ret = g_atomic_pointer_compare_and_exchange (&RCUManager::x.gptr, (gpointer) current_write_old, (gpointer) new_spp);