From c9665c24d178c33a4736f90e68c8ca0f2350024e Mon Sep 17 00:00:00 2001 From: "Steinar H. Gunderson" Date: Tue, 28 Sep 2010 00:07:02 +0200 Subject: [PATCH] Make AddRef() and Release() atomic. --- modules/access/sdi.cpp | 20 ++++++++++---------- 1 file changed, 10 insertions(+), 10 deletions(-) diff --git a/modules/access/sdi.cpp b/modules/access/sdi.cpp index ec93c27cf6..9c6946e950 100644 --- a/modules/access/sdi.cpp +++ b/modules/access/sdi.cpp @@ -16,6 +16,7 @@ #include #include #include +#include #include @@ -126,32 +127,31 @@ struct demux_sys_t class DeckLinkCaptureDelegate : public IDeckLinkInputCallback { public: - DeckLinkCaptureDelegate( demux_t *p_demux ) : m_ref_(1), p_demux_(p_demux) {} + DeckLinkCaptureDelegate( demux_t *p_demux ) : p_demux_(p_demux) + { + vlc_atomic_set( &m_ref_, 1 ); + } virtual HRESULT STDMETHODCALLTYPE QueryInterface(REFIID iid, LPVOID *ppv) { return E_NOINTERFACE; } - /* Note: AddRef() and Release() here are not thread safe. */ - virtual ULONG STDMETHODCALLTYPE AddRef(void) { - return ++m_ref_; + return vlc_atomic_inc( &m_ref_ ); } virtual ULONG STDMETHODCALLTYPE Release(void) { - if ( --m_ref_ == 0 ) - { + uintptr_t new_ref = vlc_atomic_dec( &m_ref_ ); + if ( new_ref == 0 ) delete this; - return 0; - } - return m_ref_; + return new_ref; } virtual HRESULT STDMETHODCALLTYPE VideoInputFormatChanged(BMDVideoInputFormatChangedEvents, IDeckLinkDisplayMode*, BMDDetectedVideoInputFormatFlags); virtual HRESULT STDMETHODCALLTYPE VideoInputFrameArrived(IDeckLinkVideoInputFrame*, IDeckLinkAudioInputPacket*); private: - int m_ref_; + vlc_atomic_t m_ref_; demux_t *p_demux_; }; -- 2.39.2