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

Alexandre Julliard julliard at winehq.org
Tue Jun 11 14:27:52 CDT 2013


Module: wine
Branch: master
Commit: ac13aa28ad7e67330b26c163bc8e4190f50d196e
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=ac13aa28ad7e67330b26c163bc8e4190f50d196e

Author: Dmitry Timoshkov <dmitry at baikal.ru>
Date:   Tue Jun 11 12:42:49 2013 +0900

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

---

 dlls/ole32/tests/ole_server.c |   19 +++++++++++++++++--
 1 files changed, 17 insertions(+), 2 deletions(-)

diff --git a/dlls/ole32/tests/ole_server.c b/dlls/ole32/tests/ole_server.c
index 9cff693..9c901ee 100644
--- a/dlls/ole32/tests/ole_server.c
+++ b/dlls/ole32/tests/ole_server.c
@@ -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)




More information about the wine-cvs mailing list