Module: wine Branch: master Commit: 38a9a232f7c079280a285cc50a3c18d18188e210 URL: http://source.winehq.org/git/wine.git/?a=commit;h=38a9a232f7c079280a285cc50a...
Author: Jacek Caban jacek@codeweavers.com Date: Fri Sep 4 11:50:19 2015 +0200
ole32: Use get_stub_manager_from_object in CoDisconnectObject.
---
dlls/ole32/compobj.c | 8 +++++++- dlls/ole32/compobj_private.h | 1 - dlls/ole32/stubmanager.c | 25 ------------------------- 3 files changed, 7 insertions(+), 27 deletions(-)
diff --git a/dlls/ole32/compobj.c b/dlls/ole32/compobj.c index 23c825a..0d0459a 100644 --- a/dlls/ole32/compobj.c +++ b/dlls/ole32/compobj.c @@ -2019,6 +2019,7 @@ void WINAPI DECLSPEC_HOTPATCH CoUninitialize(void) */ HRESULT WINAPI CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved ) { + struct stub_manager *manager; HRESULT hr; IMarshal *marshal; APARTMENT *apt; @@ -2039,7 +2040,12 @@ HRESULT WINAPI CoDisconnectObject( LPUNKNOWN lpUnk, DWORD reserved ) if (!apt) return CO_E_NOTINITIALIZED;
- apartment_disconnectobject(apt, lpUnk); + manager = get_stub_manager_from_object(apt, lpUnk, FALSE); + if (manager) { + /* Release stub manager twice, to remove the apartment reference. */ + stub_manager_int_release(manager); + stub_manager_int_release(manager); + }
/* Note: native is pretty broken here because it just silently * fails, without returning an appropriate error code if the object was diff --git a/dlls/ole32/compobj_private.h b/dlls/ole32/compobj_private.h index 9f56d47..c63d645 100644 --- a/dlls/ole32/compobj_private.h +++ b/dlls/ole32/compobj_private.h @@ -235,7 +235,6 @@ APARTMENT *apartment_findfromoxid(OXID oxid, BOOL ref) DECLSPEC_HIDDEN; APARTMENT *apartment_findfromtid(DWORD tid) DECLSPEC_HIDDEN; DWORD apartment_release(struct apartment *apt) DECLSPEC_HIDDEN; HRESULT apartment_disconnectproxies(struct apartment *apt) DECLSPEC_HIDDEN; -void apartment_disconnectobject(struct apartment *apt, void *object) DECLSPEC_HIDDEN; static inline HRESULT apartment_getoxid(const struct apartment *apt, OXID *oxid) { *oxid = apt->oxid; diff --git a/dlls/ole32/stubmanager.c b/dlls/ole32/stubmanager.c index 668d46f..30e2054 100644 --- a/dlls/ole32/stubmanager.c +++ b/dlls/ole32/stubmanager.c @@ -356,31 +356,6 @@ struct stub_manager *get_stub_manager_from_object(APARTMENT *apt, IUnknown *obj, return result; }
-/* removes the apartment reference to an object, destroying it when no other - * threads have a reference to it */ -void apartment_disconnectobject(struct apartment *apt, void *object) -{ - BOOL found = FALSE; - struct stub_manager *stubmgr; - - EnterCriticalSection(&apt->cs); - LIST_FOR_EACH_ENTRY( stubmgr, &apt->stubmgrs, struct stub_manager, entry ) - { - if (stubmgr->object == object) - { - found = TRUE; - stub_manager_int_release(stubmgr); - break; - } - } - LeaveCriticalSection(&apt->cs); - - if (found) - TRACE("disconnect object %p\n", object); - else - WARN("couldn't find object %p\n", object); -} - /* gets the stub manager associated with an object id - caller must have * a reference to the apartment while a reference to the stub manager is held. * it must also call release on the stub manager when it is no longer needed */