From: Steinar H. Gunderson Date: Mon, 27 Sep 2010 22:07:02 +0000 (+0200) Subject: Make AddRef() and Release() atomic. X-Git-Url: https://git.sesse.net/?p=vlc;a=commitdiff_plain;h=c9665c24d178c33a4736f90e68c8ca0f2350024e Make AddRef() and Release() atomic. --- 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_; };