From e6deea5e3b4e88a34fd52efdf74ac73c72fc69bb Mon Sep 17 00:00:00 2001 From: Aleksey Kliger Date: Thu, 19 May 2016 17:42:31 -0400 Subject: [PATCH] [threadpool-ms] MonoError-ize mono_threadpool_ms_end_invoke --- mono/metadata/marshal.c | 4 +++- mono/metadata/threadpool-ms.c | 13 ++++++++----- mono/metadata/threadpool-ms.h | 2 +- 3 files changed, 12 insertions(+), 7 deletions(-) diff --git a/mono/metadata/marshal.c b/mono/metadata/marshal.c index 4e734a7a5f9..4b672478618 100644 --- a/mono/metadata/marshal.c +++ b/mono/metadata/marshal.c @@ -3009,7 +3009,9 @@ mono_delegate_end_invoke (MonoDelegate *delegate, gpointer *params) } else #endif { - res = mono_threadpool_ms_end_invoke (ares, &out_args, &exc); + res = mono_threadpool_ms_end_invoke (ares, &out_args, &exc, &error); + if (mono_error_set_pending_exception (&error)) + return NULL; } if (exc) { diff --git a/mono/metadata/threadpool-ms.c b/mono/metadata/threadpool-ms.c index 4cda0e814d5..9e18e8c3eff 100644 --- a/mono/metadata/threadpool-ms.c +++ b/mono/metadata/threadpool-ms.c @@ -1366,11 +1366,11 @@ mono_threadpool_ms_begin_invoke (MonoDomain *domain, MonoObject *target, MonoMet } MonoObject * -mono_threadpool_ms_end_invoke (MonoAsyncResult *ares, MonoArray **out_args, MonoObject **exc) +mono_threadpool_ms_end_invoke (MonoAsyncResult *ares, MonoArray **out_args, MonoObject **exc, MonoError *error) { - MonoError error; MonoAsyncCall *ac; + mono_error_init (error); g_assert (exc); g_assert (out_args); @@ -1381,7 +1381,7 @@ mono_threadpool_ms_end_invoke (MonoAsyncResult *ares, MonoArray **out_args, Mono mono_monitor_enter ((MonoObject*) ares); if (ares->endinvoke_called) { - *exc = (MonoObject*) mono_get_exception_invalid_operation (NULL); + mono_error_set_invalid_operation(error, "Delegate EndInvoke method called more than once"); mono_monitor_exit ((MonoObject*) ares); return NULL; } @@ -1398,8 +1398,11 @@ mono_threadpool_ms_end_invoke (MonoAsyncResult *ares, MonoArray **out_args, Mono } else { wait_event = CreateEvent (NULL, TRUE, FALSE, NULL); g_assert(wait_event); - MonoWaitHandle *wait_handle = mono_wait_handle_new (mono_object_domain (ares), wait_event, &error); - mono_error_raise_exception (&error); /* FIXME don't raise here */ + MonoWaitHandle *wait_handle = mono_wait_handle_new (mono_object_domain (ares), wait_event, error); + if (!is_ok (error)) { + CloseHandle (wait_event); + return NULL; + } MONO_OBJECT_SETREF (ares, handle, (MonoObject*) wait_handle); } mono_monitor_exit ((MonoObject*) ares); diff --git a/mono/metadata/threadpool-ms.h b/mono/metadata/threadpool-ms.h index 9812ee57ba2..1603e3a15d9 100644 --- a/mono/metadata/threadpool-ms.h +++ b/mono/metadata/threadpool-ms.h @@ -17,7 +17,7 @@ mono_threadpool_ms_cleanup (void); MonoAsyncResult * mono_threadpool_ms_begin_invoke (MonoDomain *domain, MonoObject *target, MonoMethod *method, gpointer *params, MonoError *error); MonoObject * -mono_threadpool_ms_end_invoke (MonoAsyncResult *ares, MonoArray **out_args, MonoObject **exc); +mono_threadpool_ms_end_invoke (MonoAsyncResult *ares, MonoArray **out_args, MonoObject **exc, MonoError *error); gboolean mono_threadpool_ms_remove_domain_jobs (MonoDomain *domain, int timeout); -- 2.25.1