Module: wine Branch: master Commit: f0189b8789280f2255bb2c2bf32e1ce018477c6b URL: http://source.winehq.org/git/wine.git/?a=commit;h=f0189b8789280f2255bb2c2bf3...
Author: Rob Shearman rob@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,