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