/* * mono_dynamic_image_register_token: * * Register the TOKEN->OBJ mapping in the mapping table in ASSEMBLY. This is required for * the Module.ResolveXXXToken () methods to work. */ void mono_dynamic_image_register_token (MonoDynamicImage *assembly, guint32 token, MonoObjectHandle obj, int how_collide) { MONO_REQ_GC_UNSAFE_MODE; g_assert (!MONO_HANDLE_IS_NULL (obj)); g_assert (strcmp (m_class_get_name (mono_handle_class (obj)), "EnumBuilder")); dynamic_image_lock (assembly); MonoObject *prev = (MonoObject *)mono_g_hash_table_lookup (assembly->tokens, GUINT_TO_POINTER (token)); if (prev) { switch (how_collide) { case MONO_DYN_IMAGE_TOK_NEW: g_warning ("%s: Unexpected previous object when called with MONO_DYN_IMAGE_TOK_NEW", __func__); break; case MONO_DYN_IMAGE_TOK_SAME_OK: if (prev != MONO_HANDLE_RAW (obj)) { g_warning ("%s: condition `prev == MONO_HANDLE_RAW (obj)' not met", __func__); } break; case MONO_DYN_IMAGE_TOK_REPLACE: break; default: g_assert_not_reached (); } } mono_g_hash_table_insert (assembly->tokens, GUINT_TO_POINTER (token), MONO_HANDLE_RAW (obj)); dynamic_image_unlock (assembly); }
gpointer ves_icall_System_Threading_StInternalMethods_RegisterHandle_internal (MonoObject *obj) { guint32 handle; if (handles == NULL) { MONO_GC_REGISTER_ROOT_FIXED (handles); handles = mono_g_hash_table_new_type (NULL, NULL, MONO_HASH_VALUE_GC); st_lock_init (&lock, SPIN_COUNT); } st_lock_enter (&lock); handle = next_handle; if (next_handle == (~0 - 1)) { next_handle = 1; } else { next_handle += 1; } mono_g_hash_table_insert (handles, (gpointer)handle, (gpointer)obj); st_lock_exit (&lock); return (gpointer) handle; }
static int continuation_store (MonoContinuation *cont, int state, MonoException **e) { MonoLMF *lmf = mono_get_lmf (); gsize num_bytes; if (!cont->domain) { *e = mono_get_exception_argument ("cont", "Continuation not initialized"); return 0; } if (cont->domain != mono_domain_get () || cont->thread_id != GetCurrentThreadId ()) { *e = mono_get_exception_argument ("cont", "Continuation from another thread or domain"); return 0; } cont->lmf = lmf; cont->return_ip = __builtin_return_address (0); cont->return_sp = __builtin_frame_address (0); num_bytes = (char*)cont->top_sp - (char*)cont->return_sp; /*g_print ("store: %d bytes, sp: %p, ip: %p, lmf: %p\n", num_bytes, cont->return_sp, cont->return_ip, lmf);*/ if (cont->saved_stack && num_bytes <= cont->stack_alloc_size) { /* clear to avoid GC retention */ if (num_bytes < cont->stack_used_size) { memset ((char*)cont->saved_stack + num_bytes, 0, cont->stack_used_size - num_bytes); } cont->stack_used_size = num_bytes; } else { tasklets_lock (); internal_init (); if (cont->saved_stack) { mono_g_hash_table_remove (keepalive_stacks, cont->saved_stack); mono_gc_free_fixed (cont->saved_stack); } cont->stack_used_size = num_bytes; cont->stack_alloc_size = num_bytes * 1.1; cont->saved_stack = mono_gc_alloc_fixed (cont->stack_alloc_size, NULL); mono_g_hash_table_insert (keepalive_stacks, cont->saved_stack, cont->saved_stack); tasklets_unlock (); } memcpy (cont->saved_stack, cont->return_sp, num_bytes); return state; }