ole32/tests: Test remaining class, object and server reference counts at server exit.

This commit is contained in:
Dmitry Timoshkov 2013-06-11 12:42:49 +09:00 committed by Alexandre Julliard
parent b82a5ab27a
commit ac13aa28ad

View File

@ -61,6 +61,8 @@ static const struct
#undef GUID_NAME
};
static LONG obj_ref, class_ref, server_locks;
static const char *debugstr_guid(const GUID *guid)
{
static char buf[50];
@ -118,6 +120,8 @@ static ULONG WINAPI UnknownImpl_AddRef(IUnknown *iface)
UnknownImpl *This = impl_from_IUnknown(iface);
ULONG ref = InterlockedIncrement(&This->ref);
InterlockedIncrement(&obj_ref);
trace("server: unknown_AddRef: %p, ref %u\n", iface, ref);
return ref;
}
@ -127,6 +131,8 @@ static ULONG WINAPI UnknownImpl_Release(IUnknown *iface)
UnknownImpl *This = impl_from_IUnknown(iface);
ULONG ref = InterlockedDecrement(&This->ref);
InterlockedDecrement(&obj_ref);
trace("server: unknown_Release: %p, ref %u\n", iface, ref);
if (ref == 0) HeapFree(GetProcessHeap(), 0, This);
return ref;
@ -176,6 +182,8 @@ static ULONG WINAPI ClassFactoryImpl_AddRef(IClassFactory *iface)
ClassFactoryImpl *This = impl_from_IClassFactory(iface);
ULONG ref = InterlockedIncrement(&This->ref);
InterlockedIncrement(&class_ref);
trace("server: factory_AddRef: %p, ref %u\n", iface, ref);
return ref;
}
@ -185,6 +193,8 @@ static ULONG WINAPI ClassFactoryImpl_Release(IClassFactory *iface)
ClassFactoryImpl *This = impl_from_IClassFactory(iface);
ULONG ref = InterlockedDecrement(&This->ref);
InterlockedDecrement(&class_ref);
trace("server: factory_Release: %p, ref %u\n", iface, ref);
return ref;
}
@ -203,7 +213,8 @@ static HRESULT WINAPI ClassFactoryImpl_CreateInstance(IClassFactory *iface,
if (!unknown) return E_OUTOFMEMORY;
unknown->IUnknown_iface.lpVtbl = &UnknownImpl_Vtbl;
unknown->ref = 1;
unknown->ref = 0;
IUnknown_AddRef(&unknown->IUnknown_iface);
hr = IUnknown_QueryInterface(&unknown->IUnknown_iface, iid, ppv);
IUnknown_Release(&unknown->IUnknown_iface);
@ -213,7 +224,6 @@ static HRESULT WINAPI ClassFactoryImpl_CreateInstance(IClassFactory *iface,
static HRESULT WINAPI ClassFactoryImpl_LockServer(IClassFactory *iface, BOOL lock)
{
static LONG server_locks;
ULONG ref = lock ? InterlockedIncrement(&server_locks) : InterlockedDecrement(&server_locks);
trace("server: factory_LockServer: %p,%d, ref %u\n", iface, lock, ref);
@ -258,6 +268,11 @@ static void ole_server(void)
trace("server: waiting for requests\n");
WaitForSingleObject(done_event, INFINITE);
/* 1 remainining class ref is supposed to be cleared by CoRevokeClassObject */
ok(class_ref == 1, "expected 1 class refs, got %d\n", class_ref);
ok(!obj_ref, "expected 0 object refs, got %d\n", obj_ref);
ok(!server_locks, "expected 0 server locks, got %d\n", server_locks);
CloseHandle(done_event);
CloseHandle(init_done_event);
if (0)