MonoAsyncResult * mono_thread_pool_add (MonoObject *target, MonoMethodMessage *msg, MonoDelegate *async_callback, MonoObject *state) { MonoDomain *domain = mono_domain_get (); MonoAsyncResult *ares; ASyncCall *ac; ac = (ASyncCall*)mono_object_new (domain, async_call_klass); MONO_OBJECT_SETREF (ac, msg, msg); MONO_OBJECT_SETREF (ac, state, state); if (async_callback) { ac->cb_method = mono_get_delegate_invoke (((MonoObject *)async_callback)->vtable->klass); MONO_OBJECT_SETREF (ac, cb_target, async_callback); } ares = mono_async_result_new (domain, NULL, ac->state, NULL, (MonoObject*)ac); MONO_OBJECT_SETREF (ares, async_delegate, target); #ifndef DISABLE_SOCKETS if (socket_io_filter (target, state)) { socket_io_add (ares, (MonoSocketAsyncResult *) state); return ares; } #endif threadpool_append_job (&async_tp, (MonoObject *) ares); return ares; }
static void do_console_cancel_event (void) { static MonoClassField *cancel_handler_field; MonoDomain *domain = mono_domain_get (); MonoClass *klass; MonoDelegate *load_value; MonoMethod *method; MonoMethodMessage *msg; MonoMethod *im; MonoVTable *vtable; /* FIXME: this should likely iterate all the domains, instead */ if (!domain->domain) return; klass = mono_class_from_name (mono_defaults.corlib, "System", "Console"); if (klass == NULL) return; if (cancel_handler_field == NULL) { cancel_handler_field = mono_class_get_field_from_name (klass, "cancel_handler"); g_assert (cancel_handler_field); } vtable = mono_class_vtable_full (domain, klass, FALSE); if (vtable == NULL) return; mono_field_static_get_value (vtable, cancel_handler_field, &load_value); if (load_value == NULL) return; klass = load_value->object.vtable->klass; method = mono_class_get_method_from_name (klass, "BeginInvoke", -1); g_assert (method != NULL); im = mono_get_delegate_invoke (method->klass); msg = mono_method_call_message_new (method, NULL, im, NULL, NULL); mono_thread_pool_add ((MonoObject *) load_value, msg, NULL, NULL); }