Module: wine Branch: master Commit: 1309731b4a3fbfcd10243a2c1f886e0a035d6d1d URL: http://source.winehq.org/git/wine.git/?a=commit;h=1309731b4a3fbfcd10243a2c1f...
Author: Vincent Povirk vincent@codeweavers.com Date: Sun Oct 3 13:42:24 2010 -0500
mscoree: Add a proper implementation of DllCanUnloadNow.
---
dlls/mscoree/corruntimehost.c | 8 ++++++++ dlls/mscoree/metahost.c | 8 ++++++++ dlls/mscoree/mscoree_main.c | 7 ++++++- dlls/mscoree/mscoree_private.h | 4 ++++ 4 files changed, 26 insertions(+), 1 deletions(-)
diff --git a/dlls/mscoree/corruntimehost.c b/dlls/mscoree/corruntimehost.c index 95f7ef3..46b9f91 100644 --- a/dlls/mscoree/corruntimehost.c +++ b/dlls/mscoree/corruntimehost.c @@ -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; diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c index 51897b2..018c1ee 100644 --- a/dlls/mscoree/metahost.c +++ b/dlls/mscoree/metahost.c @@ -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; }
diff --git a/dlls/mscoree/mscoree_main.c b/dlls/mscoree/mscoree_main.c index 0e96a47..e0d1e95 100644 --- a/dlls/mscoree/mscoree_main.c +++ b/dlls/mscoree/mscoree_main.c @@ -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,7 +400,10 @@ HRESULT WINAPI DllUnregisterServer(void)
HRESULT WINAPI DllCanUnloadNow(VOID) { - return S_OK; + if (dll_refs) + return S_FALSE; + else + return S_OK; }
INT WINAPI ND_RU1( const void *ptr, INT offset ) diff --git a/dlls/mscoree/mscoree_private.h b/dlls/mscoree/mscoree_private.h index 5062431..00c3652 100644 --- a/dlls/mscoree/mscoree_private.h +++ b/dlls/mscoree/mscoree_private.h @@ -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;