Vincent Povirk : mscoree: Implement RequestRuntimeLoadedNotification.
Alexandre Julliard
julliard at winehq.org
Tue Aug 1 16:43:15 CDT 2017
Module: wine
Branch: master
Commit: 57cdf8bfa8a312ce9a8b7c6c80b0570d3be05b11
URL: http://source.winehq.org/git/wine.git/?a=commit;h=57cdf8bfa8a312ce9a8b7c6c80b0570d3be05b11
Author: Vincent Povirk <vincent at codeweavers.com>
Date: Tue Aug 1 11:51:22 2017 -0500
mscoree: Implement RequestRuntimeLoadedNotification.
Signed-off-by: Vincent Povirk <vincent at codeweavers.com>
Signed-off-by: Alexandre Julliard <julliard at winehq.org>
---
dlls/mscoree/metahost.c | 44 +++++++++++++++++++++++-------
dlls/mscoree/tests/metahost.c | 62 ++++++++++++++++++++++++++++++++++++++++---
2 files changed, 92 insertions(+), 14 deletions(-)
diff --git a/dlls/mscoree/metahost.c b/dlls/mscoree/metahost.c
index 4108f55..6edd30f 100644
--- a/dlls/mscoree/metahost.c
+++ b/dlls/mscoree/metahost.c
@@ -66,6 +66,15 @@ static CRITICAL_SECTION_DEBUG runtime_list_cs_debug =
};
static CRITICAL_SECTION runtime_list_cs = { &runtime_list_cs_debug, -1, 0, 0, 0, 0 };
+struct CLRMetaHost
+{
+ ICLRMetaHost ICLRMetaHost_iface;
+
+ RuntimeLoadedCallbackFnPtr callback;
+};
+
+static struct CLRMetaHost GlobalCLRMetaHost;
+
static HMODULE mono_handle;
BOOL is_mono_started;
@@ -299,6 +308,18 @@ static void CDECL mono_print_handler_fn(const char *string, INT is_stdout)
}
}
+static HRESULT WINAPI thread_set_fn(void)
+{
+ WARN("stub\n");
+ return S_OK;
+}
+
+static HRESULT WINAPI thread_unset_fn(void)
+{
+ WARN("stub\n");
+ return S_OK;
+}
+
static HRESULT CLRRuntimeInfo_GetRuntimeHost(CLRRuntimeInfo *This, RuntimeHost **result)
{
HRESULT hr = S_OK;
@@ -318,6 +339,17 @@ static HRESULT CLRRuntimeInfo_GetRuntimeHost(CLRRuntimeInfo *This, RuntimeHost *
EnterCriticalSection(&runtime_list_cs);
+ if (This->loaded_runtime)
+ {
+ *result = This->loaded_runtime;
+ return hr;
+ }
+
+ if (GlobalCLRMetaHost.callback)
+ {
+ GlobalCLRMetaHost.callback(&This->ICLRRuntimeInfo_iface, thread_set_fn, thread_unset_fn);
+ }
+
hr = load_mono(mono_path);
if (SUCCEEDED(hr))
@@ -795,15 +827,6 @@ static const struct IEnumUnknownVtbl InstalledRuntimeEnum_Vtbl = {
InstalledRuntimeEnum_Clone
};
-struct CLRMetaHost
-{
- ICLRMetaHost ICLRMetaHost_iface;
-
- RuntimeLoadedCallbackFnPtr callback;
-};
-
-static struct CLRMetaHost GlobalCLRMetaHost;
-
static HRESULT WINAPI CLRMetaHost_QueryInterface(ICLRMetaHost* iface,
REFIID riid,
void **ppvObject)
@@ -988,7 +1011,8 @@ static HRESULT WINAPI CLRMetaHost_RequestRuntimeLoadedNotification(ICLRMetaHost*
if(!pCallbackFunction)
return E_POINTER;
- WARN("Callback currently will not be called.\n");
+ if (GlobalCLRMetaHost.callback)
+ return HOST_E_INVALIDOPERATION;
GlobalCLRMetaHost.callback = pCallbackFunction;
diff --git a/dlls/mscoree/tests/metahost.c b/dlls/mscoree/tests/metahost.c
index 5a8b3e0..fd97361 100644
--- a/dlls/mscoree/tests/metahost.c
+++ b/dlls/mscoree/tests/metahost.c
@@ -35,6 +35,10 @@ static HRESULT (WINAPI *pCLRCreateInstance)(REFCLSID clsid, REFIID riid, LPVOID
static ICLRMetaHost *metahost;
+static const WCHAR v4_0[] = {'v','4','.','0','.','3','0','3','1','9',0};
+
+static DWORD expect_runtime_tid;
+
static BOOL init_pointers(void)
{
HRESULT hr = E_FAIL;
@@ -148,10 +152,37 @@ static void test_enumruntimes(void)
IEnumUnknown_Release(runtime_enum);
}
+static void WINAPI notification_dummy_callback(ICLRRuntimeInfo *pRuntimeInfo, CallbackThreadSetFnPtr pfnCallbackThreadSet,
+ CallbackThreadUnsetFnPtr pfnCallbackThreadUnset)
+{
+ ok(0, "unexpected call\n");
+}
+
static void WINAPI notification_callback(ICLRRuntimeInfo *pRuntimeInfo, CallbackThreadSetFnPtr pfnCallbackThreadSet,
CallbackThreadUnsetFnPtr pfnCallbackThreadUnset)
{
- ok(0, "Unexpected call\n");
+ HRESULT hr;
+ WCHAR buf[20];
+ DWORD buf_size = 20;
+
+ ok(expect_runtime_tid != 0, "unexpected call\n");
+
+ if (expect_runtime_tid != 0)
+ {
+ ok(GetCurrentThreadId() == expect_runtime_tid,
+ "expected call on thread %04x, got thread %04x\n", expect_runtime_tid, GetCurrentThreadId());
+ expect_runtime_tid = 0;
+ }
+
+ hr = ICLRRuntimeInfo_GetVersionString(pRuntimeInfo, buf, &buf_size);
+ ok(hr == S_OK, "GetVersion returned %x\n", hr);
+ ok(lstrcmpW(buf, v4_0) == 0, "GetVersion returned %s\n", wine_dbgstr_w(buf));
+
+ hr = pfnCallbackThreadSet();
+ ok(hr == S_OK, "pfnCallbackThreadSet returned %x\n", hr);
+
+ hr = pfnCallbackThreadUnset();
+ ok(hr == S_OK, "pfnCallbackThreadUnset returned %x\n", hr);
}
static void test_notification(void)
@@ -159,10 +190,32 @@ static void test_notification(void)
HRESULT hr;
hr = ICLRMetaHost_RequestRuntimeLoadedNotification(metahost, NULL);
- ok(hr == E_POINTER, "GetVersion failed, hr=%x\n", hr);
+ ok(hr == E_POINTER, "RequestRuntimeLoadedNotification returned %x\n", hr);
hr = ICLRMetaHost_RequestRuntimeLoadedNotification(metahost,notification_callback);
- ok(hr == S_OK, "GetVersion failed, hr=%x\n", hr);
+ ok(hr == S_OK, "RequestRuntimeLoadedNotification failed, hr=%x\n", hr);
+
+ hr = ICLRMetaHost_RequestRuntimeLoadedNotification(metahost,notification_dummy_callback);
+ ok(hr == HOST_E_INVALIDOPERATION, "RequestRuntimeLoadedNotification returned %x\n", hr);
+}
+
+static void test_notification_cb(void)
+{
+ HRESULT hr;
+ ICLRRuntimeInfo *info;
+ ICLRRuntimeHost *host;
+
+ hr = ICLRMetaHost_GetRuntime(metahost, v4_0, &IID_ICLRRuntimeInfo, (void**)&info);
+ ok(hr == S_OK, "GetRuntime returned %x\n", hr);
+
+ expect_runtime_tid = GetCurrentThreadId();
+ hr = ICLRRuntimeInfo_GetInterface(info, &CLSID_CLRRuntimeHost, &IID_ICLRRuntimeHost, (void**)&host);
+ ok(hr == S_OK, "GetInterface returned %x\n", hr);
+ ok(expect_runtime_tid == 0, "notification_callback was not called\n");
+
+ ICLRRuntimeHost_Release(host);
+
+ ICLRRuntimeInfo_Release(info);
}
START_TEST(metahost)
@@ -170,8 +223,9 @@ START_TEST(metahost)
if (!init_pointers())
return;
- test_enumruntimes();
test_notification();
+ test_enumruntimes();
+ test_notification_cb();
cleanup();
}
More information about the wine-cvs
mailing list