MonoMethod* mono_gc_get_managed_array_allocator (MonoVTable *vtable, int rank) { #ifdef MANAGED_ALLOCATION MonoClass *klass = vtable->klass; #ifdef HAVE_KW_THREAD int tlab_next_offset = -1; int tlab_temp_end_offset = -1; MONO_THREAD_VAR_OFFSET (tlab_next, tlab_next_offset); MONO_THREAD_VAR_OFFSET (tlab_temp_end, tlab_temp_end_offset); if (tlab_next_offset == -1 || tlab_temp_end_offset == -1) return NULL; #endif if (rank != 1) return NULL; if (!mono_runtime_has_tls_get ()) return NULL; if (mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS) return NULL; if (has_per_allocation_action) return NULL; g_assert (!mono_class_has_finalizer (klass) && !klass->marshalbyref); return mono_gc_get_managed_allocator_by_type (ATYPE_VECTOR); #else return NULL; #endif }
MonoMethod* mono_gc_get_managed_allocator_by_type (int atype) { #ifdef MANAGED_ALLOCATION MonoMethod *res; if (!use_managed_allocator) return NULL; if (!mono_runtime_has_tls_get ()) return NULL; res = alloc_method_cache [atype]; if (res) return res; res = create_allocator (atype); LOCK_GC; if (alloc_method_cache [atype]) { mono_free_method (res); res = alloc_method_cache [atype]; } else { mono_memory_barrier (); alloc_method_cache [atype] = res; } UNLOCK_GC; return res; #else return NULL; #endif }
MonoMethod* mono_gc_get_managed_allocator_by_type (int atype) { #ifdef MANAGED_ALLOCATION MonoMethod *res; if (!mono_runtime_has_tls_get ()) return NULL; mono_loader_lock (); res = alloc_method_cache [atype]; if (!res) res = alloc_method_cache [atype] = create_allocator (atype); mono_loader_unlock (); return res; #else return NULL; #endif }
/* * Generate an allocator method implementing the fast path of mono_gc_alloc_obj (). * The signature of the called method is: * object allocate (MonoVTable *vtable) */ MonoMethod* mono_gc_get_managed_allocator (MonoClass *klass, gboolean for_box, gboolean known_instance_size) { #ifdef MANAGED_ALLOCATION #ifdef HAVE_KW_THREAD int tlab_next_offset = -1; int tlab_temp_end_offset = -1; MONO_THREAD_VAR_OFFSET (tlab_next, tlab_next_offset); MONO_THREAD_VAR_OFFSET (tlab_temp_end, tlab_temp_end_offset); if (tlab_next_offset == -1 || tlab_temp_end_offset == -1) return NULL; #endif if (collect_before_allocs) return NULL; if (!mono_runtime_has_tls_get ()) return NULL; if (klass->instance_size > tlab_size) return NULL; if (known_instance_size && ALIGN_TO (klass->instance_size, ALLOC_ALIGN) >= MAX_SMALL_OBJ_SIZE) return NULL; if (klass->has_finalize || mono_class_is_marshalbyref (klass) || (mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS)) return NULL; if (klass->rank) return NULL; if (klass->byval_arg.type == MONO_TYPE_STRING) return mono_gc_get_managed_allocator_by_type (ATYPE_STRING); /* Generic classes have dynamic field and can go above MAX_SMALL_OBJ_SIZE. */ if (known_instance_size) return mono_gc_get_managed_allocator_by_type (ATYPE_SMALL); else return mono_gc_get_managed_allocator_by_type (ATYPE_NORMAL); #else return NULL; #endif }
/* * Generate an allocator method implementing the fast path of mono_gc_alloc_obj (). * The signature of the called method is: * object allocate (MonoVTable *vtable) */ MonoMethod* mono_gc_get_managed_allocator (MonoVTable *vtable, gboolean for_box) { #ifdef MANAGED_ALLOCATION MonoClass *klass = vtable->klass; #ifdef HAVE_KW_THREAD int tlab_next_offset = -1; int tlab_temp_end_offset = -1; MONO_THREAD_VAR_OFFSET (tlab_next, tlab_next_offset); MONO_THREAD_VAR_OFFSET (tlab_temp_end, tlab_temp_end_offset); if (tlab_next_offset == -1 || tlab_temp_end_offset == -1) return NULL; #endif if (!mono_runtime_has_tls_get ()) return NULL; if (klass->instance_size > tlab_size) return NULL; if (klass->has_finalize || klass->marshalbyref || (mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS)) return NULL; if (klass->rank) return NULL; if (klass->byval_arg.type == MONO_TYPE_STRING) return NULL; if (collect_before_allocs) return NULL; if (ALIGN_TO (klass->instance_size, ALLOC_ALIGN) < MAX_SMALL_OBJ_SIZE) return mono_gc_get_managed_allocator_by_type (ATYPE_SMALL); else return mono_gc_get_managed_allocator_by_type (ATYPE_NORMAL); #else return NULL; #endif }