* threads have a reference to it */
void apartment_disconnectobject(struct apartment *apt, void *object)
{
- int found = FALSE;
+ BOOL found = FALSE;
struct stub_manager *stubmgr;
EnterCriticalSection(&apt->cs);
TRACE("removed %u refs from %p (oid %s), rc is now %u\n", refs, m, wine_dbgstr_longlong(m->oid), rc);
if (last_extern_ref && m->extern_conn)
- IExternalConnection_ReleaseConnection(m->extern_conn, EXTCONN_STRONG, 0, TRUE /* FIXME: Use last_unlock releases? */);
+ IExternalConnection_ReleaseConnection(m->extern_conn, EXTCONN_STRONG, 0, last_unlock_releases);
if (rc == 0)
- stub_manager_int_release(m);
+ if (!(m->extern_conn && last_unlock_releases && m->weakrefs))
+ stub_manager_int_release(m);
return rc;
}
else if (ifstub->flags & MSHLFLAGS_TABLESTRONG)
refs = 1;
- stub_manager_ext_release(m, refs, tableweak, FALSE);
+ stub_manager_ext_release(m, refs, tableweak, !tableweak);
}
/* is an ifstub table marshaled? */