- Use Interlocked* functions in AddRef and Release.

- Store the result of the Interlocked functions and use only this.
This commit is contained in:
Paul Vriens 2005-01-06 19:36:47 +00:00 committed by Alexandre Julliard
parent 5f0e554af5
commit c6559a104c
15 changed files with 118 additions and 75 deletions

View File

@ -410,19 +410,21 @@ static HRESULT WINAPI AVIDec_QueryInterface(IBaseFilter * iface, REFIID riid, LP
static ULONG WINAPI AVIDec_AddRef(IBaseFilter * iface)
{
AVIDecImpl *This = (AVIDecImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, This->refCount);
TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, refCount - 1);
return InterlockedIncrement(&This->refCount);
return refCount;
}
static ULONG WINAPI AVIDec_Release(IBaseFilter * iface)
{
AVIDecImpl *This = (AVIDecImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p/%p)->() Release from %ld\n", This, iface, This->refCount);
TRACE("(%p/%p)->() Release from %ld\n", This, iface, refCount + 1);
if (!InterlockedDecrement(&This->refCount))
if (!refCount)
{
ULONG i;
@ -449,7 +451,7 @@ static ULONG WINAPI AVIDec_Release(IBaseFilter * iface)
return 0;
}
else
return This->refCount;
return refCount;
}
/** IPersist methods **/

View File

@ -211,19 +211,21 @@ static HRESULT WINAPI AVISplitter_QueryInterface(IBaseFilter * iface, REFIID rii
static ULONG WINAPI AVISplitter_AddRef(IBaseFilter * iface)
{
AVISplitter *This = (AVISplitter *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, This->refCount);
TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, refCount - 1);
return InterlockedIncrement(&This->refCount);
return refCount;
}
static ULONG WINAPI AVISplitter_Release(IBaseFilter * iface)
{
AVISplitter *This = (AVISplitter *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p/%p)->() Release from %ld\n", This, iface, This->refCount);
TRACE("(%p/%p)->() Release from %ld\n", This, iface, refCount + 1);
if (!InterlockedDecrement(&This->refCount))
if (!refCount)
{
ULONG i;
@ -243,7 +245,7 @@ static ULONG WINAPI AVISplitter_Release(IBaseFilter * iface)
return 0;
}
else
return This->refCount;
return refCount;
}
/** IPersist methods **/
@ -1116,10 +1118,11 @@ HRESULT WINAPI AVISplitter_OutputPin_QueryInterface(IPin * iface, REFIID riid, L
static ULONG WINAPI AVISplitter_OutputPin_Release(IPin * iface)
{
AVISplitter_OutputPin *This = (AVISplitter_OutputPin *)iface;
ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount);
TRACE("()\n");
if (!InterlockedDecrement(&This->pin.pin.refCount))
if (!refCount)
{
DeleteMediaType(This->pmt);
CoTaskMemFree(This->pmt);
@ -1127,7 +1130,7 @@ static ULONG WINAPI AVISplitter_OutputPin_Release(IPin * iface)
CoTaskMemFree(This);
return 0;
}
return This->pin.pin.refCount;
return refCount;
}
static HRESULT WINAPI AVISplitter_OutputPin_EnumMediaTypes(IPin * iface, IEnumMediaTypes ** ppEnum)

View File

@ -358,19 +358,21 @@ static HRESULT WINAPI DSoundRender_QueryInterface(IBaseFilter * iface, REFIID ri
static ULONG WINAPI DSoundRender_AddRef(IBaseFilter * iface)
{
DSoundRenderImpl *This = (DSoundRenderImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, This->refCount);
TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, refCount - 1);
return InterlockedIncrement(&This->refCount);
return refCount;
}
static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface)
{
DSoundRenderImpl *This = (DSoundRenderImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p/%p)->() Release from %ld\n", This, iface, This->refCount);
TRACE("(%p/%p)->() Release from %ld\n", This, iface, refCount + 1);
if (!InterlockedDecrement(&This->refCount))
if (!refCount)
{
DeleteCriticalSection(&This->csFilter);
if (This->pClock)
@ -388,7 +390,7 @@ static ULONG WINAPI DSoundRender_Release(IBaseFilter * iface)
return 0;
}
else
return This->refCount;
return refCount;
}
/** IPersist methods **/

View File

@ -92,22 +92,28 @@ static HRESULT WINAPI IEnumFiltersImpl_QueryInterface(IEnumFilters * iface, REFI
static ULONG WINAPI IEnumFiltersImpl_AddRef(IEnumFilters * iface)
{
IEnumFiltersImpl *This = (IEnumFiltersImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p)->()\n", iface);
return ++This->refCount;
return refCount;
}
static ULONG WINAPI IEnumFiltersImpl_Release(IEnumFilters * iface)
{
IEnumFiltersImpl *This = (IEnumFiltersImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p)->()\n", iface);
if (!--This->refCount)
if (!refCount)
{
CoTaskMemFree(This->ppFilters);
CoTaskMemFree(This);
return 0;
}
else
return This->refCount;
return refCount;
}
static HRESULT WINAPI IEnumFiltersImpl_Next(IEnumFilters * iface, ULONG cFilters, IBaseFilter ** ppFilters, ULONG * pcFetched)

View File

@ -120,22 +120,28 @@ static HRESULT WINAPI IEnumMediaTypesImpl_QueryInterface(IEnumMediaTypes * iface
static ULONG WINAPI IEnumMediaTypesImpl_AddRef(IEnumMediaTypes * iface)
{
IEnumMediaTypesImpl *This = (IEnumMediaTypesImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("()\n");
return ++This->refCount;
return refCount;
}
static ULONG WINAPI IEnumMediaTypesImpl_Release(IEnumMediaTypes * iface)
{
IEnumMediaTypesImpl *This = (IEnumMediaTypesImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("()\n");
if (!--This->refCount)
if (!refCount)
{
CoTaskMemFree(This->enumMediaDetails.pMediaTypes);
CoTaskMemFree(This);
return 0;
}
else
return This->refCount;
return refCount;
}
static HRESULT WINAPI IEnumMediaTypesImpl_Next(IEnumMediaTypes * iface, ULONG cMediaTypes, AM_MEDIA_TYPE ** ppMediaTypes, ULONG * pcFetched)

View File

@ -120,17 +120,18 @@ static ULONG WINAPI EnumMonikerImpl_AddRef(LPENUMMONIKER iface)
static ULONG WINAPI EnumMonikerImpl_Release(LPENUMMONIKER iface)
{
EnumMonikerImpl *This = (EnumMonikerImpl *)iface;
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("\n");
if (!InterlockedDecrement(&This->ref))
if (!ref)
{
CoTaskMemFree(This->ppMoniker);
This->ppMoniker = NULL;
CoTaskMemFree(This);
return 0;
}
return This->ref;
return ref;
}
static HRESULT WINAPI EnumMonikerImpl_Next(LPENUMMONIKER iface, ULONG celt, IMoniker ** rgelt, ULONG * pceltFetched)

View File

@ -75,25 +75,27 @@ static HRESULT WINAPI IEnumPinsImpl_QueryInterface(IEnumPins * iface, REFIID rii
static ULONG WINAPI IEnumPinsImpl_AddRef(IEnumPins * iface)
{
IEnumPinsImpl *This = (IEnumPinsImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("()\n");
return ++This->refCount;
return refCount;
}
static ULONG WINAPI IEnumPinsImpl_Release(IEnumPins * iface)
{
IEnumPinsImpl *This = (IEnumPinsImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("()\n");
if (!--This->refCount)
if (!refCount)
{
CoTaskMemFree(This);
return 0;
}
else
return This->refCount;
return refCount;
}
static HRESULT WINAPI IEnumPinsImpl_Next(IEnumPins * iface, ULONG cPins, IPin ** ppPins, ULONG * pcFetched)

View File

@ -115,24 +115,26 @@ static HRESULT WINAPI IEnumRegFiltersImpl_QueryInterface(IEnumRegFilters * iface
static ULONG WINAPI IEnumRegFiltersImpl_AddRef(IEnumRegFilters * iface)
{
IEnumRegFiltersImpl *This = (IEnumRegFiltersImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p)\n", iface);
return ++This->refCount;
return refCount;
}
static ULONG WINAPI IEnumRegFiltersImpl_Release(IEnumRegFilters * iface)
{
IEnumRegFiltersImpl *This = (IEnumRegFiltersImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p)\n", iface);
if (!--This->refCount)
if (!refCount)
{
CoTaskMemFree(This);
return 0;
} else
return This->refCount;
return refCount;
}
static HRESULT WINAPI IEnumRegFiltersImpl_Next(IEnumRegFilters * iface, ULONG cFilters, REGFILTER ** ppRegFilter, ULONG * pcFetched)

View File

@ -357,19 +357,21 @@ static HRESULT WINAPI AsyncReader_QueryInterface(IBaseFilter * iface, REFIID rii
static ULONG WINAPI AsyncReader_AddRef(IBaseFilter * iface)
{
AsyncReader *This = (AsyncReader *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, This->refCount);
TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, refCount - 1);
return InterlockedIncrement(&This->refCount);
return refCount;
}
static ULONG WINAPI AsyncReader_Release(IBaseFilter * iface)
{
AsyncReader *This = (AsyncReader *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p/%p)->() Release from %ld\n", This, iface, This->refCount);
TRACE("(%p/%p)->() Release from %ld\n", This, iface, refCount + 1);
if (!InterlockedDecrement(&This->refCount))
if (!refCount)
{
if (This->pOutputPin)
IPin_Release(This->pOutputPin);
@ -379,7 +381,7 @@ static ULONG WINAPI AsyncReader_Release(IBaseFilter * iface)
return 0;
}
else
return This->refCount;
return refCount;
}
/** IPersist methods **/
@ -736,10 +738,11 @@ static HRESULT WINAPI FileAsyncReaderPin_QueryInterface(IPin * iface, REFIID rii
static ULONG WINAPI FileAsyncReaderPin_Release(IPin * iface)
{
FileAsyncReader *This = (FileAsyncReader *)iface;
ULONG refCount = InterlockedDecrement(&This->pin.pin.refCount);
TRACE("()\n");
if (!InterlockedDecrement(&This->pin.pin.refCount))
if (!refCount)
{
DATAREQUEST * pCurrent;
DATAREQUEST * pNext;
@ -753,7 +756,7 @@ static ULONG WINAPI FileAsyncReaderPin_Release(IPin * iface)
CoTaskMemFree(This);
return 0;
}
return This->pin.pin.refCount;
return refCount;
}
static HRESULT WINAPI FileAsyncReaderPin_EnumMediaTypes(IPin * iface, IEnumMediaTypes ** ppEnum)

View File

@ -227,22 +227,23 @@ static HRESULT Filtergraph_QueryInterface(IFilterGraphImpl *This,
return E_NOINTERFACE;
}
This->ref++;
InterlockedIncrement(&This->ref);
return S_OK;
}
static ULONG Filtergraph_AddRef(IFilterGraphImpl *This) {
TRACE("(%p)->(): new ref = %ld\n", This, This->ref + 1);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->(): new ref = %ld\n", This, ref);
return ++This->ref;
return ref;
}
static ULONG Filtergraph_Release(IFilterGraphImpl *This) {
static ULONG ref;
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p)->(): new ref = %ld\n", This, This->ref - 1);
TRACE("(%p)->(): new ref = %ld\n", This, ref);
ref = --This->ref;
if (ref == 0) {
IFilterMapper2_Release(This->pFilterMapper2);
CloseHandle(This->hEventCompletion);

View File

@ -210,24 +210,26 @@ static HRESULT WINAPI FilterMapper2_QueryInterface(IFilterMapper2 * iface, REFII
static ULONG WINAPI FilterMapper2_AddRef(IFilterMapper2 * iface)
{
FilterMapper2Impl *This = (FilterMapper2Impl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p)->()\n", iface);
return InterlockedIncrement(&This->refCount);
return refCount;
}
static ULONG WINAPI FilterMapper2_Release(IFilterMapper2 * iface)
{
FilterMapper2Impl *This = (FilterMapper2Impl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p)->()\n", iface);
if (InterlockedDecrement(&This->refCount) == 0)
if (refCount == 0)
{
CoTaskMemFree(This);
return 0;
}
return This->refCount;
return refCount;
}
/*** IFilterMapper2 methods ***/

View File

@ -139,19 +139,21 @@ static HRESULT WINAPI BaseMemAllocator_QueryInterface(IMemAllocator * iface, REF
static ULONG WINAPI BaseMemAllocator_AddRef(IMemAllocator * iface)
{
BaseMemAllocator *This = (BaseMemAllocator *)iface;
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->() AddRef from %ld\n", iface, This->ref);
TRACE("(%p)->() AddRef from %ld\n", iface, ref - 1);
return InterlockedIncrement(&This->ref);
return ref;
}
static ULONG WINAPI BaseMemAllocator_Release(IMemAllocator * iface)
{
BaseMemAllocator *This = (BaseMemAllocator *)iface;
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p)->() Release from %ld\n", iface, This->ref);
TRACE("(%p)->() Release from %ld\n", iface, ref + 1);
if (!InterlockedDecrement(&This->ref))
if (!ref)
{
CloseHandle(This->hSemWaiting);
if (This->bCommitted)
@ -160,7 +162,7 @@ static ULONG WINAPI BaseMemAllocator_Release(IMemAllocator * iface)
CoTaskMemFree(This);
return 0;
}
return This->ref;
return ref;
}
static HRESULT WINAPI BaseMemAllocator_SetProperties(IMemAllocator * iface, ALLOCATOR_PROPERTIES *pRequest, ALLOCATOR_PROPERTIES *pActual)
@ -471,24 +473,26 @@ static HRESULT WINAPI StdMediaSample2_QueryInterface(IMediaSample2 * iface, REFI
static ULONG WINAPI StdMediaSample2_AddRef(IMediaSample2 * iface)
{
StdMediaSample2 *This = (StdMediaSample2 *)iface;
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)->() AddRef from %ld\n", iface, This->ref);
TRACE("(%p)->() AddRef from %ld\n", iface, ref - 1);
return InterlockedIncrement(&This->ref);
return ref;
}
static ULONG WINAPI StdMediaSample2_Release(IMediaSample2 * iface)
{
StdMediaSample2 *This = (StdMediaSample2 *)iface;
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p)->() Release from %ld\n", iface, This->ref);
TRACE("(%p)->() Release from %ld\n", iface, ref + 1);
if (!InterlockedDecrement(&This->ref))
if (!ref)
{
IMemAllocator_ReleaseBuffer(This->pParent, (IMediaSample *)iface);
return 0;
}
return This->ref;
return ref;
}
static HRESULT WINAPI StdMediaSample2_GetPointer(IMediaSample2 * iface, BYTE ** ppBuffer)

View File

@ -226,10 +226,11 @@ HRESULT OutputPin_Construct(const PIN_INFO * pPinInfo, ALLOCATOR_PROPERTIES *pro
ULONG WINAPI IPinImpl_AddRef(IPin * iface)
{
IPinImpl *This = (IPinImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p)->() AddRef from %ld\n", iface, This->refCount);
TRACE("(%p)->() AddRef from %ld\n", iface, refCount - 1);
return InterlockedIncrement(&This->refCount);
return refCount;
}
HRESULT WINAPI IPinImpl_Disconnect(IPin * iface)
@ -403,10 +404,11 @@ HRESULT WINAPI InputPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv)
ULONG WINAPI InputPin_Release(IPin * iface)
{
InputPin *This = (InputPin *)iface;
ULONG refCount = InterlockedDecrement(&This->pin.refCount);
TRACE("(%p)->() Release from %ld\n", iface, This->pin.refCount);
TRACE("(%p)->() Release from %ld\n", iface, refCount + 1);
if (!InterlockedDecrement(&This->pin.refCount))
if (!refCount)
{
DeleteMediaType(&This->pin.mtCurrent);
if (This->pAllocator)
@ -415,7 +417,7 @@ ULONG WINAPI InputPin_Release(IPin * iface)
return 0;
}
else
return This->pin.refCount;
return refCount;
}
HRESULT WINAPI InputPin_Connect(IPin * iface, IPin * pConnector, const AM_MEDIA_TYPE * pmt)
@ -661,16 +663,17 @@ HRESULT WINAPI OutputPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv)
ULONG WINAPI OutputPin_Release(IPin * iface)
{
OutputPin *This = (OutputPin *)iface;
ULONG refCount = InterlockedDecrement(&This->pin.refCount);
TRACE("(%p/%p)->()\n", This, iface);
if (!InterlockedDecrement(&This->pin.refCount))
if (!refCount)
{
DeleteMediaType(&This->pin.mtCurrent);
CoTaskMemFree(This);
return 0;
}
return This->pin.refCount;
return refCount;
}
HRESULT WINAPI OutputPin_Connect(IPin * iface, IPin * pReceivePin, const AM_MEDIA_TYPE * pmt)
@ -1114,10 +1117,11 @@ HRESULT WINAPI PullPin_QueryInterface(IPin * iface, REFIID riid, LPVOID * ppv)
ULONG WINAPI PullPin_Release(IPin * iface)
{
PullPin *This = (PullPin *)iface;
ULONG refCount = InterlockedDecrement(&This->pin.refCount);
TRACE("(%p/%p)->()\n", This, iface);
if (!InterlockedDecrement(&This->pin.refCount))
if (!refCount)
{
if (This->hThread)
PullPin_StopProcessing(This);
@ -1127,7 +1131,7 @@ ULONG WINAPI PullPin_Release(IPin * iface)
CoTaskMemFree(This);
return 0;
}
return This->pin.refCount;
return refCount;
}
static DWORD WINAPI PullPin_Thread_Main(LPVOID pv)

View File

@ -197,8 +197,11 @@ IReferenceClockVtbl SystemClock_Vtbl;
static ULONG WINAPI SystemClockImpl_AddRef(IReferenceClock* iface) {
SystemClockImpl *This = (SystemClockImpl *)iface;
TRACE("(%p): AddRef from %ld\n", This, This->ref);
return ++(This->ref);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p): AddRef from %ld\n", This, ref - 1);
return ref;
}
static HRESULT WINAPI SystemClockImpl_QueryInterface(IReferenceClock* iface, REFIID riid, void** ppobj) {
@ -218,8 +221,8 @@ static HRESULT WINAPI SystemClockImpl_QueryInterface(IReferenceClock* iface, REF
static ULONG WINAPI SystemClockImpl_Release(IReferenceClock* iface) {
SystemClockImpl *This = (SystemClockImpl *)iface;
ULONG ref = --This->ref;
TRACE("(%p): ReleaseRef to %ld\n", This, This->ref);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p): ReleaseRef to %ld\n", This, ref);
if (ref == 0) {
if (SystemClockPostMessageToAdviseThread(This, ADVISE_EXIT)) {
WaitForSingleObject(This->adviseThread, INFINITE);

View File

@ -404,19 +404,21 @@ static HRESULT WINAPI VideoRenderer_QueryInterface(IBaseFilter * iface, REFIID r
static ULONG WINAPI VideoRenderer_AddRef(IBaseFilter * iface)
{
VideoRendererImpl *This = (VideoRendererImpl *)iface;
ULONG refCount = InterlockedIncrement(&This->refCount);
TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, This->refCount);
TRACE("(%p/%p)->() AddRef from %ld\n", This, iface, refCount - 1);
return InterlockedIncrement(&This->refCount);
return refCount;
}
static ULONG WINAPI VideoRenderer_Release(IBaseFilter * iface)
{
VideoRendererImpl *This = (VideoRendererImpl *)iface;
ULONG refCount = InterlockedDecrement(&This->refCount);
TRACE("(%p/%p)->() Release from %ld\n", This, iface, This->refCount);
TRACE("(%p/%p)->() Release from %ld\n", This, iface, refCount + 1);
if (!InterlockedDecrement(&This->refCount))
if (!refCount)
{
DeleteCriticalSection(&This->csFilter);
IReferenceClock_Release(This->pClock);
@ -432,7 +434,7 @@ static ULONG WINAPI VideoRenderer_Release(IBaseFilter * iface)
return 0;
}
else
return This->refCount;
return refCount;
}
/** IPersist methods **/