avifil32: Use atomic operations to manipulate the refcount.

Signed-off-by: Michael Stefaniuc <mstefani@redhat.de>
Signed-off-by: Alexandre Julliard <julliard@winehq.org>
This commit is contained in:
Michael Stefaniuc 2016-07-12 10:06:18 +02:00 committed by Alexandre Julliard
parent 919a338947
commit 72175acdd1
1 changed files with 15 additions and 17 deletions

View File

@ -57,11 +57,9 @@ static const IClassFactoryVtbl iclassfact = {
typedef struct typedef struct
{ {
/* IUnknown fields */
IClassFactory IClassFactory_iface; IClassFactory IClassFactory_iface;
DWORD dwRef; LONG ref;
CLSID clsid;
CLSID clsid;
} IClassFactoryImpl; } IClassFactoryImpl;
static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface) static inline IClassFactoryImpl *impl_from_IClassFactory(IClassFactory *iface)
@ -82,7 +80,7 @@ static HRESULT AVIFILE_CreateClassFactory(const CLSID *pclsid, const IID *riid,
return E_OUTOFMEMORY; return E_OUTOFMEMORY;
pClassFactory->IClassFactory_iface.lpVtbl = &iclassfact; pClassFactory->IClassFactory_iface.lpVtbl = &iclassfact;
pClassFactory->dwRef = 0; pClassFactory->ref = 0;
pClassFactory->clsid = *pclsid; pClassFactory->clsid = *pclsid;
hr = IClassFactory_QueryInterface(&pClassFactory->IClassFactory_iface, riid, ppv); hr = IClassFactory_QueryInterface(&pClassFactory->IClassFactory_iface, riid, ppv);
@ -109,26 +107,26 @@ static HRESULT WINAPI IClassFactory_fnQueryInterface(LPCLASSFACTORY iface,
return E_NOINTERFACE; return E_NOINTERFACE;
} }
static ULONG WINAPI IClassFactory_fnAddRef(LPCLASSFACTORY iface) static ULONG WINAPI IClassFactory_fnAddRef(IClassFactory *iface)
{ {
IClassFactoryImpl *This = impl_from_IClassFactory(iface); IClassFactoryImpl *This = impl_from_IClassFactory(iface);
ULONG ref = InterlockedIncrement(&This->ref);
TRACE("(%p)\n", iface); TRACE("(%p) ref = %u\n", This, ref);
return ref;
return ++(This->dwRef);
} }
static ULONG WINAPI IClassFactory_fnRelease(LPCLASSFACTORY iface) static ULONG WINAPI IClassFactory_fnRelease(IClassFactory *iface)
{ {
IClassFactoryImpl *This = impl_from_IClassFactory(iface); IClassFactoryImpl *This = impl_from_IClassFactory(iface);
ULONG ref = InterlockedDecrement(&This->ref);
TRACE("(%p)\n", iface); TRACE("(%p) ref = %u\n", This, ref);
if ((--(This->dwRef)) > 0)
return This->dwRef;
HeapFree(GetProcessHeap(), 0, This); if(!ref)
HeapFree(GetProcessHeap(), 0, This);
return 0; return ref;
} }
static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface, static HRESULT WINAPI IClassFactory_fnCreateInstance(LPCLASSFACTORY iface,