Rob Shearman : ole32: Implement CoAddRefServerProcess and CoReleaseServerProcess.

Alexandre Julliard julliard at wine.codeweavers.com
Fri Mar 9 15:47:47 CST 2007


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

Author: Rob Shearman <rob at codeweavers.com>
Date:   Fri Mar  9 18:55:13 2007 +0000

ole32: Implement CoAddRefServerProcess and CoReleaseServerProcess.

---

 dlls/ole32/compobj.c       |   41 +++++++++++++++++++++++++++++++++++++----
 dlls/ole32/tests/marshal.c |    2 +-
 2 files changed, 38 insertions(+), 5 deletions(-)

diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c
index d0ef89c..a5a3220 100644
--- a/dlls/ole32/compobj.c
+++ b/dlls/ole32/compobj.c
@@ -106,6 +106,8 @@ struct registered_psclsid
  * libraries are freed
  */
 static LONG s_COMLockCount = 0;
+/* Reference count used by CoAddRefServerProcess/CoReleaseServerProcess */
+static LONG s_COMServerProcessReferences = 0;
 
 /*
  * This linked list contains the list of registered class objects. These
@@ -2771,11 +2773,23 @@ HRESULT WINAPI CoSuspendClassObjects(void)
  *
  * RETURNS
  *  New reference count.
+ *
+ * SEE ALSO
+ *  CoReleaseServerProcess().
  */
 ULONG WINAPI CoAddRefServerProcess(void)
 {
-    FIXME("\n");
-    return 2;
+    ULONG refs;
+
+    TRACE("\n");
+
+    EnterCriticalSection(&csRegisteredClassList);
+    refs = ++s_COMServerProcessReferences;
+    LeaveCriticalSection(&csRegisteredClassList);
+
+    TRACE("refs before: %d\n", refs - 1);
+
+    return refs;
 }
 
 /***********************************************************************
@@ -2786,11 +2800,30 @@ ULONG WINAPI CoAddRefServerProcess(void)
  *
  * RETURNS
  *  New reference count.
+ *
+ * NOTES
+ *  When reference count reaches 0, this function suspends all registered
+ *  classes so no new connections are accepted.
+ *
+ * SEE ALSO
+ *  CoAddRefServerProcess(), CoSuspendClassObjects().
  */
 ULONG WINAPI CoReleaseServerProcess(void)
 {
-    FIXME("\n");
-    return 1;
+    ULONG refs;
+
+    TRACE("\n");
+
+    EnterCriticalSection(&csRegisteredClassList);
+
+    refs = --s_COMServerProcessReferences;
+    /* FIXME: if (!refs) COM_SuspendClassObjects(); */
+
+    LeaveCriticalSection(&csRegisteredClassList);
+
+    TRACE("refs after: %d\n", refs);
+
+    return refs;
 }
 
 /***********************************************************************
diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c
index 12ab39b..0c0dff7 100644
--- a/dlls/ole32/tests/marshal.c
+++ b/dlls/ole32/tests/marshal.c
@@ -2303,7 +2303,7 @@ static void test_local_server(void)
 
     /* wait for shutdown signal */
     ret = WaitForSingleObject(heventShutdown, 0);
-    todo_wine { ok(ret != WAIT_TIMEOUT, "Server didn't shut down\n"); }
+    ok(ret != WAIT_TIMEOUT, "Server didn't shut down\n");
 
     /* try to connect again after SCM has suspended registered class objects */
     hr = CoGetClassObject(&CLSID_WineOOPTest, CLSCTX_INPROC_SERVER | CLSCTX_LOCAL_SERVER, NULL,




More information about the wine-cvs mailing list