X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fmetadata%2Fconsole-unix.c;h=5c46a85a9419339be30cb6df72122ac618d40ecc;hb=58e8a9f85176c9607e605b888ef45db01a0f6997;hp=9629857be704a59656a345ab33761c1a7f95c676;hpb=de47498f5a5c262b40942917758fd020166760f1;p=mono.git diff --git a/mono/metadata/console-unix.c b/mono/metadata/console-unix.c index 9629857be70..5c46a85a941 100644 --- a/mono/metadata/console-unix.c +++ b/mono/metadata/console-unix.c @@ -5,6 +5,7 @@ * Gonzalo Paniagua Javier (gonzalo@ximian.com) * * Copyright (C) 2005-2009 Novell, Inc. (http://www.novell.com) + * Licensed under the MIT license. See LICENSE file in the project root for full license information. */ #if defined(__native_client__) #include "console-null.c" @@ -221,6 +222,7 @@ static void do_console_cancel_event (void) { static MonoClassField *cancel_handler_field; + MonoError error; MonoDomain *domain = mono_domain_get (); MonoClass *klass; MonoDelegate *load_value; @@ -231,7 +233,7 @@ do_console_cancel_event (void) if (!domain->domain) return; - klass = mono_class_from_name (mono_defaults.corlib, "System", "Console"); + klass = mono_class_try_load_from_name (mono_defaults.corlib, "System", "Console"); if (klass == NULL) return; @@ -240,9 +242,11 @@ do_console_cancel_event (void) g_assert (cancel_handler_field); } - vtable = mono_class_vtable_full (domain, klass, FALSE); - if (vtable == NULL) + vtable = mono_class_vtable_full (domain, klass, &error); + if (vtable == NULL || !is_ok (&error)) { + mono_error_cleanup (&error); return; + } mono_field_static_get_value (vtable, cancel_handler_field, &load_value); if (load_value == NULL) return; @@ -251,7 +255,11 @@ do_console_cancel_event (void) method = mono_class_get_method_from_name (klass, "BeginInvoke", -1); g_assert (method != NULL); - mono_threadpool_ms_begin_invoke (domain, (MonoObject*) load_value, method, NULL); + mono_threadpool_ms_begin_invoke (domain, (MonoObject*) load_value, method, NULL, &error); + if (!is_ok (&error)) { + g_warning ("Couldn't invoke System.Console cancel handler due to %s", mono_error_get_message (&error)); + mono_error_cleanup (&error); + } } static int need_cancel = FALSE; @@ -344,20 +352,20 @@ console_set_signal_handlers () memset (&sigwinch, 0, sizeof (struct sigaction)); // Continuing - sigcont.sa_handler = (void *) sigcont_handler; - sigcont.sa_flags = 0; + sigcont.sa_handler = (void (*)(int)) sigcont_handler; + sigcont.sa_flags = SA_RESTART; sigemptyset (&sigcont.sa_mask); sigaction (SIGCONT, &sigcont, &save_sigcont); // Interrupt handler - sigint.sa_handler = (void *) sigint_handler; - sigint.sa_flags = 0; + sigint.sa_handler = (void (*)(int)) sigint_handler; + sigint.sa_flags = SA_RESTART; sigemptyset (&sigint.sa_mask); sigaction (SIGINT, &sigint, &save_sigint); // Window size changed - sigwinch.sa_handler = (void *) sigwinch_handler; - sigwinch.sa_flags = 0; + sigwinch.sa_handler = (void (*)(int)) sigwinch_handler; + sigwinch.sa_flags = SA_RESTART; sigemptyset (&sigwinch.sa_mask); sigaction (SIGWINCH, &sigwinch, &save_sigwinch); #endif