do_console_cancel_event (void)
{
static MonoClassField *cancel_handler_field;
+ MonoError error;
MonoDomain *domain = mono_domain_get ();
MonoClass *klass;
MonoDelegate *load_value;
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;
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;
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;
// Continuing
sigcont.sa_handler = (void (*)(int)) sigcont_handler;
- sigcont.sa_flags = 0;
+ sigcont.sa_flags = SA_RESTART;
sigemptyset (&sigcont.sa_mask);
sigaction (SIGCONT, &sigcont, &save_sigcont);
// Interrupt handler
sigint.sa_handler = (void (*)(int)) sigint_handler;
- sigint.sa_flags = 0;
+ sigint.sa_flags = SA_RESTART;
sigemptyset (&sigint.sa_mask);
sigaction (SIGINT, &sigint, &save_sigint);
// Window size changed
sigwinch.sa_handler = (void (*)(int)) sigwinch_handler;
- sigwinch.sa_flags = 0;
+ sigwinch.sa_flags = SA_RESTART;
sigemptyset (&sigwinch.sa_mask);
sigaction (SIGWINCH, &sigwinch, &save_sigwinch);
#endif