Module: wine Branch: master Commit: a7b621bd9b9a5ca93feca3033cbf85739d414366 URL: http://source.winehq.org/git/wine.git/?a=commit;h=a7b621bd9b9a5ca93feca3033c...
Author: Rob Shearman robertshearman@gmail.com Date: Mon Nov 23 15:07:38 2009 +0000
ole32: Fix behaviour of CoLockObjectExternal with fLastUnlockReleases as FALSE.
The parameter controls whether weak references are ignored, not whether the last stub_manager_int_release should be called when the total reference count goes to zero.
---
dlls/ole32/marshal.c | 2 +- dlls/ole32/stubmanager.c | 8 +++++--- dlls/ole32/tests/marshal.c | 3 --- 3 files changed, 6 insertions(+), 7 deletions(-)
diff --git a/dlls/ole32/marshal.c b/dlls/ole32/marshal.c index 821cb87..54a3a87 100644 --- a/dlls/ole32/marshal.c +++ b/dlls/ole32/marshal.c @@ -1336,7 +1336,7 @@ StdMarshalImpl_UnmarshalInterface(LPMARSHAL iface, IStream *pStm, REFIID riid, v
/* unref the ifstub. FIXME: only do this on success? */ if (!stub_manager_is_table_marshaled(stubmgr, &stdobjref.ipid)) - stub_manager_ext_release(stubmgr, stdobjref.cPublicRefs, stdobjref.flags & SORFP_TABLEWEAK, TRUE); + stub_manager_ext_release(stubmgr, stdobjref.cPublicRefs, stdobjref.flags & SORFP_TABLEWEAK, FALSE);
stub_manager_int_release(stubmgr); return hres; diff --git a/dlls/ole32/stubmanager.c b/dlls/ole32/stubmanager.c index 12813c6..f6b8bfa 100644 --- a/dlls/ole32/stubmanager.c +++ b/dlls/ole32/stubmanager.c @@ -406,13 +406,15 @@ ULONG stub_manager_ext_release(struct stub_manager *m, ULONG refs, BOOL tablewea rc = (m->extrefs -= refs);
if (tableweak) - rc += --m->weakrefs; + --m->weakrefs; + if (!last_unlock_releases) + rc += m->weakrefs;
LeaveCriticalSection(&m->lock);
TRACE("removed %u refs from %p (oid %s), rc is now %u\n", refs, m, wine_dbgstr_longlong(m->oid), rc);
- if (rc == 0 && last_unlock_releases) + if (rc == 0) stub_manager_int_release(m);
return rc; @@ -551,7 +553,7 @@ void stub_manager_release_marshal_data(struct stub_manager *m, ULONG refs, const else if (ifstub->flags & MSHLFLAGS_TABLESTRONG) refs = 1;
- stub_manager_ext_release(m, refs, tableweak, TRUE); + stub_manager_ext_release(m, refs, tableweak, FALSE); }
/* is an ifstub table marshaled? */ diff --git a/dlls/ole32/tests/marshal.c b/dlls/ole32/tests/marshal.c index 93fd9a6..bb2b508 100644 --- a/dlls/ole32/tests/marshal.c +++ b/dlls/ole32/tests/marshal.c @@ -1278,10 +1278,7 @@ static void test_lock_object_external(void)
CoLockObjectExternal((IUnknown*)&Test_ClassFactory, FALSE, FALSE);
- todo_wine ok_no_locks(); - if (cLocks > 0) - CoDisconnectObject((IUnknown*)&Test_ClassFactory, 0);
/* test CoLockObjectExternal doesn't release the last reference to an * object with fLastUnlockReleases as TRUE and there is a weak reference