mscoree: Add a proper implementation of DllCanUnloadNow.

This commit is contained in:
Vincent Povirk 2010-10-03 13:42:24 -05:00 committed by Alexandre Julliard
parent e5d3294b83
commit 1309731b4a
4 changed files with 26 additions and 1 deletions

View File

@ -108,6 +108,8 @@ static HRESULT RuntimeHost_AddDomain(RuntimeHost *This, MonoDomain **result)
list_add_tail(&This->domains, &entry->entry);
MSCOREE_LockModule();
*result = entry->domain;
end:
@ -149,6 +151,7 @@ static void RuntimeHost_DeleteDomain(RuntimeHost *This, MonoDomain *domain)
if (This->default_domain == domain)
This->default_domain = NULL;
HeapFree(GetProcessHeap(), 0, entry);
MSCOREE_UnlockModule();
break;
}
}
@ -193,6 +196,9 @@ static HRESULT WINAPI corruntimehost_QueryInterface(ICorRuntimeHost* iface,
static ULONG WINAPI corruntimehost_AddRef(ICorRuntimeHost* iface)
{
RuntimeHost *This = impl_from_ICorRuntimeHost( iface );
MSCOREE_LockModule();
return InterlockedIncrement( &This->ref );
}
@ -201,6 +207,8 @@ static ULONG WINAPI corruntimehost_Release(ICorRuntimeHost* iface)
RuntimeHost *This = impl_from_ICorRuntimeHost( iface );
ULONG ref;
MSCOREE_UnlockModule();
ref = InterlockedDecrement( &This->ref );
return ref;

View File

@ -225,11 +225,13 @@ static HRESULT WINAPI CLRRuntimeInfo_QueryInterface(ICLRRuntimeInfo* iface,
static ULONG WINAPI CLRRuntimeInfo_AddRef(ICLRRuntimeInfo* iface)
{
MSCOREE_LockModule();
return 2;
}
static ULONG WINAPI CLRRuntimeInfo_Release(ICLRRuntimeInfo* iface)
{
MSCOREE_UnlockModule();
return 1;
}
@ -668,6 +670,8 @@ static ULONG WINAPI InstalledRuntimeEnum_AddRef(IEnumUnknown* iface)
struct InstalledRuntimeEnum *This = (struct InstalledRuntimeEnum*)iface;
ULONG ref = InterlockedIncrement(&This->ref);
MSCOREE_LockModule();
TRACE("(%p) refcount=%u\n", iface, ref);
return ref;
@ -678,6 +682,8 @@ static ULONG WINAPI InstalledRuntimeEnum_Release(IEnumUnknown* iface)
struct InstalledRuntimeEnum *This = (struct InstalledRuntimeEnum*)iface;
ULONG ref = InterlockedDecrement(&This->ref);
MSCOREE_UnlockModule();
TRACE("(%p) refcount=%u\n", iface, ref);
if (ref == 0)
@ -818,11 +824,13 @@ static HRESULT WINAPI CLRMetaHost_QueryInterface(ICLRMetaHost* iface,
static ULONG WINAPI CLRMetaHost_AddRef(ICLRMetaHost* iface)
{
MSCOREE_LockModule();
return 2;
}
static ULONG WINAPI CLRMetaHost_Release(ICLRMetaHost* iface)
{
MSCOREE_UnlockModule();
return 1;
}

View File

@ -44,6 +44,8 @@
WINE_DEFAULT_DEBUG_CHANNEL( mscoree );
LONG dll_refs = 0;
static BOOL get_install_root(LPWSTR install_dir)
{
const WCHAR dotnet_key[] = {'S','O','F','T','W','A','R','E','\\','M','i','c','r','o','s','o','f','t','\\','.','N','E','T','F','r','a','m','e','w','o','r','k','\\',0};
@ -398,6 +400,9 @@ HRESULT WINAPI DllUnregisterServer(void)
HRESULT WINAPI DllCanUnloadNow(VOID)
{
if (dll_refs)
return S_FALSE;
else
return S_OK;
}

View File

@ -20,6 +20,10 @@
#ifndef __MSCOREE_PRIVATE__
#define __MSCOREE_PRIVATE__
extern LONG dll_refs;
static inline void MSCOREE_LockModule(void) { InterlockedIncrement(&dll_refs); }
static inline void MSCOREE_UnlockModule(void) { InterlockedDecrement(&dll_refs); }
extern HRESULT CLRMetaHost_CreateInstance(REFIID riid, void **ppobj);
typedef struct tagASSEMBLY ASSEMBLY;