Commit cb3dc989 authored by Zebediah Figura's avatar Zebediah Figura Committed by Alexandre Julliard

quartz: Implement proper DLL refcounting.

parent 3b8b0667
...@@ -493,6 +493,8 @@ static void acm_wrapper_destroy(struct strmbase_filter *iface) ...@@ -493,6 +493,8 @@ static void acm_wrapper_destroy(struct strmbase_filter *iface)
IUnknown_Release(filter->seeking); IUnknown_Release(filter->seeking);
strmbase_filter_cleanup(&filter->filter); strmbase_filter_cleanup(&filter->filter);
free(filter); free(filter);
InterlockedDecrement(&object_locks);
} }
static HRESULT acm_wrapper_init_stream(struct strmbase_filter *iface) static HRESULT acm_wrapper_init_stream(struct strmbase_filter *iface)
......
...@@ -489,6 +489,8 @@ static void avi_decompressor_destroy(struct strmbase_filter *iface) ...@@ -489,6 +489,8 @@ static void avi_decompressor_destroy(struct strmbase_filter *iface)
IUnknown_Release(filter->seeking); IUnknown_Release(filter->seeking);
strmbase_filter_cleanup(&filter->filter); strmbase_filter_cleanup(&filter->filter);
free(filter); free(filter);
InterlockedDecrement(&object_locks);
} }
static HRESULT avi_decompressor_init_stream(struct strmbase_filter *iface) static HRESULT avi_decompressor_init_stream(struct strmbase_filter *iface)
......
...@@ -503,6 +503,8 @@ static void dsound_render_destroy(struct strmbase_renderer *iface) ...@@ -503,6 +503,8 @@ static void dsound_render_destroy(struct strmbase_renderer *iface)
strmbase_renderer_cleanup(&filter->renderer); strmbase_renderer_cleanup(&filter->renderer);
CoTaskMemFree(filter); CoTaskMemFree(filter);
InterlockedDecrement(&object_locks);
} }
static HRESULT dsound_render_query_interface(struct strmbase_renderer *iface, REFIID iid, void **out) static HRESULT dsound_render_query_interface(struct strmbase_renderer *iface, REFIID iid, void **out)
......
...@@ -353,6 +353,8 @@ static void async_reader_destroy(struct strmbase_filter *iface) ...@@ -353,6 +353,8 @@ static void async_reader_destroy(struct strmbase_filter *iface)
strmbase_filter_cleanup(&filter->filter); strmbase_filter_cleanup(&filter->filter);
free(filter); free(filter);
InterlockedDecrement(&object_locks);
} }
static HRESULT async_reader_query_interface(struct strmbase_filter *iface, REFIID iid, void **out) static HRESULT async_reader_query_interface(struct strmbase_filter *iface, REFIID iid, void **out)
......
...@@ -518,6 +518,8 @@ static ULONG WINAPI FilterGraphInner_Release(IUnknown *iface) ...@@ -518,6 +518,8 @@ static ULONG WINAPI FilterGraphInner_Release(IUnknown *iface)
} }
DeleteCriticalSection(&This->cs); DeleteCriticalSection(&This->cs);
CoTaskMemFree(This); CoTaskMemFree(This);
InterlockedDecrement(&object_locks);
} }
return ref; return ref;
} }
......
...@@ -193,8 +193,12 @@ static ULONG WINAPI Inner_Release(IUnknown *iface) ...@@ -193,8 +193,12 @@ static ULONG WINAPI Inner_Release(IUnknown *iface)
TRACE("(%p)->(): new ref = %d\n", This, ref); TRACE("(%p)->(): new ref = %d\n", This, ref);
if (ref == 0) if (ref == 0)
{
CoTaskMemFree(This); CoTaskMemFree(This);
InterlockedDecrement(&object_locks);
}
return ref; return ref;
} }
......
...@@ -27,7 +27,7 @@ extern HRESULT WINAPI QUARTZ_DllGetClassObject(REFCLSID, REFIID, LPVOID *) DECLS ...@@ -27,7 +27,7 @@ extern HRESULT WINAPI QUARTZ_DllGetClassObject(REFCLSID, REFIID, LPVOID *) DECLS
extern HRESULT WINAPI QUARTZ_DllCanUnloadNow(void) DECLSPEC_HIDDEN; extern HRESULT WINAPI QUARTZ_DllCanUnloadNow(void) DECLSPEC_HIDDEN;
extern BOOL WINAPI QUARTZ_DllMain(HINSTANCE, DWORD, LPVOID) DECLSPEC_HIDDEN; extern BOOL WINAPI QUARTZ_DllMain(HINSTANCE, DWORD, LPVOID) DECLSPEC_HIDDEN;
static LONG server_locks = 0; LONG object_locks = 0;
BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved) BOOL WINAPI DllMain(HINSTANCE instance, DWORD reason, void *reserved)
{ {
...@@ -124,6 +124,7 @@ static HRESULT WINAPI DSCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter ...@@ -124,6 +124,7 @@ static HRESULT WINAPI DSCF_CreateInstance(IClassFactory *iface, IUnknown *pOuter
if (SUCCEEDED(hres = This->create_instance(pOuter, &punk))) if (SUCCEEDED(hres = This->create_instance(pOuter, &punk)))
{ {
InterlockedIncrement(&object_locks);
hres = IUnknown_QueryInterface(punk, riid, ppobj); hres = IUnknown_QueryInterface(punk, riid, ppobj);
IUnknown_Release(punk); IUnknown_Release(punk);
} }
...@@ -135,9 +136,9 @@ static HRESULT WINAPI DSCF_LockServer(IClassFactory *iface, BOOL dolock) ...@@ -135,9 +136,9 @@ static HRESULT WINAPI DSCF_LockServer(IClassFactory *iface, BOOL dolock)
IClassFactoryImpl *This = impl_from_IClassFactory(iface); IClassFactoryImpl *This = impl_from_IClassFactory(iface);
FIXME("(%p)->(%d),stub!\n",This,dolock); FIXME("(%p)->(%d),stub!\n",This,dolock);
if(dolock) if(dolock)
InterlockedIncrement(&server_locks); InterlockedIncrement(&object_locks);
else else
InterlockedDecrement(&server_locks); InterlockedDecrement(&object_locks);
return S_OK; return S_OK;
} }
...@@ -200,7 +201,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv) ...@@ -200,7 +201,7 @@ HRESULT WINAPI DllGetClassObject(REFCLSID rclsid, REFIID riid, LPVOID *ppv)
*/ */
HRESULT WINAPI DllCanUnloadNow(void) HRESULT WINAPI DllCanUnloadNow(void)
{ {
if(server_locks == 0 && QUARTZ_DllCanUnloadNow() == S_OK) if (!object_locks && QUARTZ_DllCanUnloadNow() == S_OK)
return S_OK; return S_OK;
return S_FALSE; return S_FALSE;
} }
......
...@@ -911,6 +911,8 @@ static void StdMemAllocator_Destroy(IMemAllocator *iface) ...@@ -911,6 +911,8 @@ static void StdMemAllocator_Destroy(IMemAllocator *iface)
DeleteCriticalSection(&This->csState); DeleteCriticalSection(&This->csState);
CoTaskMemFree(This); CoTaskMemFree(This);
InterlockedDecrement(&object_locks);
} }
HRESULT mem_allocator_create(IUnknown *lpUnkOuter, IUnknown **out) HRESULT mem_allocator_create(IUnknown *lpUnkOuter, IUnknown **out)
......
...@@ -80,6 +80,8 @@ static ULONG WINAPI seeking_passthrough_Release(IUnknown *iface) ...@@ -80,6 +80,8 @@ static ULONG WINAPI seeking_passthrough_Release(IUnknown *iface)
{ {
strmbase_passthrough_cleanup(&passthrough->passthrough); strmbase_passthrough_cleanup(&passthrough->passthrough);
free(passthrough); free(passthrough);
InterlockedDecrement(&object_locks);
} }
return refcount; return refcount;
} }
......
...@@ -56,6 +56,8 @@ static inline const char *debugstr_time(REFERENCE_TIME time) ...@@ -56,6 +56,8 @@ static inline const char *debugstr_time(REFERENCE_TIME time)
return wine_dbg_sprintf("%s", rev); return wine_dbg_sprintf("%s", rev);
} }
extern LONG object_locks;
/* see IAsyncReader::Request on MSDN for the explanation of this */ /* see IAsyncReader::Request on MSDN for the explanation of this */
#define MEDIATIME_FROM_BYTES(x) ((LONGLONG)(x) * 10000000) #define MEDIATIME_FROM_BYTES(x) ((LONGLONG)(x) * 10000000)
#define BYTES_FROM_MEDIATIME(time) ((time) / 10000000) #define BYTES_FROM_MEDIATIME(time) ((time) / 10000000)
......
...@@ -105,6 +105,8 @@ static ULONG WINAPI system_clock_inner_Release(IUnknown *iface) ...@@ -105,6 +105,8 @@ static ULONG WINAPI system_clock_inner_Release(IUnknown *iface)
clock->cs.DebugInfo->Spare[0] = 0; clock->cs.DebugInfo->Spare[0] = 0;
DeleteCriticalSection(&clock->cs); DeleteCriticalSection(&clock->cs);
heap_free(clock); heap_free(clock);
InterlockedDecrement(&object_locks);
} }
return refcount; return refcount;
} }
......
...@@ -248,6 +248,8 @@ static void video_renderer_destroy(struct strmbase_renderer *iface) ...@@ -248,6 +248,8 @@ static void video_renderer_destroy(struct strmbase_renderer *iface)
CloseHandle(filter->run_event); CloseHandle(filter->run_event);
strmbase_renderer_cleanup(&filter->renderer); strmbase_renderer_cleanup(&filter->renderer);
CoTaskMemFree(filter); CoTaskMemFree(filter);
InterlockedDecrement(&object_locks);
} }
static HRESULT video_renderer_query_interface(struct strmbase_renderer *iface, REFIID iid, void **out) static HRESULT video_renderer_query_interface(struct strmbase_renderer *iface, REFIID iid, void **out)
......
...@@ -519,6 +519,8 @@ static void vmr_destroy(struct strmbase_renderer *iface) ...@@ -519,6 +519,8 @@ static void vmr_destroy(struct strmbase_renderer *iface)
BaseControlWindow_Destroy(&filter->baseControlWindow); BaseControlWindow_Destroy(&filter->baseControlWindow);
strmbase_renderer_cleanup(&filter->renderer); strmbase_renderer_cleanup(&filter->renderer);
CoTaskMemFree(filter); CoTaskMemFree(filter);
InterlockedDecrement(&object_locks);
} }
static HRESULT vmr_query_interface(struct strmbase_renderer *iface, REFIID iid, void **out) static HRESULT vmr_query_interface(struct strmbase_renderer *iface, REFIID iid, void **out)
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment