GC_on_heap_resize = on_gc_heap_resize;
}
+static gboolean alloc_events = FALSE;
+
+void
+mono_gc_enable_alloc_events (void)
+{
+ alloc_events = TRUE;
+}
+
int
mono_gc_register_root (char *start, size_t size, void *descr)
{
obj->vtable = vtable;
}
+ if (G_UNLIKELY (alloc_events))
+ mono_profiler_allocation (obj);
+
return obj;
}
obj->max_length = max_length;
+ if (G_UNLIKELY (alloc_events))
+ mono_profiler_allocation (&obj->obj);
+
return obj;
}
if (bounds_size)
obj->bounds = (MonoArrayBounds *) ((char *) obj + size - bounds_size);
+ if (G_UNLIKELY (alloc_events))
+ mono_profiler_allocation (&obj->obj);
+
return obj;
}
obj->length = len;
obj->chars [len] = 0;
+ if (G_UNLIKELY (alloc_events))
+ mono_profiler_allocation (&obj->object);
+
return obj;
}
gboolean mono_gc_is_finalizer_thread (MonoThread *thread);
gpointer mono_gc_out_of_memory (size_t size);
void mono_gc_enable_events (void);
+void mono_gc_enable_alloc_events (void);
/* disappearing link functionality */
void mono_gc_weak_link_add (void **link_addr, MonoObject *obj, gboolean track);
{
}
+void
+mono_gc_enable_alloc_events (void)
+{
+}
+
int
mono_gc_register_root (char *start, size_t size, void *descr)
{
#define ldstr_unlock() mono_mutex_unlock (&ldstr_section)
static mono_mutex_t ldstr_section;
-static gboolean profile_allocs = TRUE;
-
void
mono_runtime_object_init (MonoObject *this)
{
{
*pass_size_in_words = FALSE;
- if (!(mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS))
- profile_allocs = FALSE;
-
if (mono_class_has_finalizer (vtable->klass) || mono_class_is_marshalbyref (vtable->klass) || (mono_profiler_get_events () & MONO_PROFILE_ALLOCATIONS))
return mono_object_new_specific;
/* If the object doesn't contain references this will do a simple memmove. */
mono_gc_wbarrier_object_copy (o, obj);
- if (G_UNLIKELY (profile_allocs))
- mono_profiler_allocation (o, obj->vtable->klass);
-
if (obj->vtable->klass->has_finalize)
mono_object_register_finalizer (o);
return o;
}
}
- if (G_UNLIKELY (profile_allocs))
- mono_profiler_allocation (o, array_class);
-
return array;
}
o = mono_gc_alloc_vector (vtable, byte_len, n);
ao = (MonoArray*)o;
- if (G_UNLIKELY (profile_allocs))
- mono_profiler_allocation (o, vtable->klass);
-
return ao;
}
g_assert (vtable);
s = mono_gc_alloc_string (vtable, size, len);
- if (G_UNLIKELY (profile_allocs))
- mono_profiler_allocation ((MonoObject*)s, mono_defaults.string_class);
return s;
}
return NULL;
size = mono_class_instance_size (class);
res = mono_object_new_alloc_specific (vtable);
- if (G_UNLIKELY (profile_allocs))
- mono_profiler_allocation (res, class);
size = size - sizeof (MonoObject);
void mono_profiler_method_end_invoke (MonoMethod *method);
void mono_profiler_code_transition (MonoMethod *method, int result);
-void mono_profiler_allocation (MonoObject *obj, MonoClass *klass);
+void mono_profiler_allocation (MonoObject *obj);
void mono_profiler_monitor_event (MonoObject *obj, MonoProfilerMonitorEvent event);
void mono_profiler_stat_hit (guchar *ip, void *context);
void mono_profiler_stat_call_chain (int call_chain_depth, guchar **ips, void *context);
void
mono_profiler_install_allocation (MonoProfileAllocFunc callback)
{
+ mono_gc_enable_alloc_events ();
if (!prof_list)
return;
prof_list->allocation_cb = callback;
}
void
-mono_profiler_allocation (MonoObject *obj, MonoClass *klass)
+mono_profiler_allocation (MonoObject *obj)
{
ProfilerDesc *prof;
for (prof = prof_list; prof; prof = prof->next) {
if ((prof->events & MONO_PROFILE_ALLOCATIONS) && prof->allocation_cb)
- prof->allocation_cb (prof->profiler, obj, klass);
+ prof->allocation_cb (prof->profiler, obj, obj->vtable->klass);
}
}
* Allocation
*/
+static gboolean alloc_events = FALSE;
+
+void
+mono_gc_enable_alloc_events (void)
+{
+ alloc_events = TRUE;
+}
+
void*
mono_gc_alloc_obj (MonoVTable *vtable, size_t size)
{
- return sgen_alloc_obj (vtable, size);
+ MonoObject *obj = sgen_alloc_obj (vtable, size);
+
+ if (G_UNLIKELY (alloc_events))
+ mono_profiler_allocation (obj);
+
+ return obj;
}
void*
mono_gc_alloc_pinned_obj (MonoVTable *vtable, size_t size)
{
- return sgen_alloc_obj_pinned (vtable, size);
+ MonoObject *obj = sgen_alloc_obj_pinned (vtable, size);
+
+ if (G_UNLIKELY (alloc_events))
+ mono_profiler_allocation (obj);
+
+ return obj;
}
void*
mono_gc_alloc_mature (MonoVTable *vtable)
{
MonoObject *obj = sgen_alloc_obj_mature (vtable, vtable->klass->instance_size);
+
if (obj && G_UNLIKELY (obj->vtable->klass->has_finalize))
mono_object_register_finalizer (obj);
+
+ if (G_UNLIKELY (alloc_events))
+ mono_profiler_allocation (obj);
+
return obj;
}
UNLOCK_GC;
done:
+ if (G_UNLIKELY (alloc_events))
+ mono_profiler_allocation (&arr->obj);
+
SGEN_ASSERT (6, SGEN_ALIGN_UP (size) == SGEN_ALIGN_UP (sgen_client_par_object_get_size ((GCVTable*)vtable, (GCObject*)arr)), "Vector has incorrect size.");
return arr;
}
UNLOCK_GC;
done:
+ if (G_UNLIKELY (alloc_events))
+ mono_profiler_allocation (&arr->obj);
+
SGEN_ASSERT (6, SGEN_ALIGN_UP (size) == SGEN_ALIGN_UP (sgen_client_par_object_get_size ((GCVTable*)vtable, (GCObject*)arr)), "Array has incorrect size.");
return arr;
}
/*This doesn't require fencing since EXIT_CRITICAL_REGION already does it for us*/
str->length = len;
EXIT_CRITICAL_REGION;
- return str;
+ goto done;
}
EXIT_CRITICAL_REGION;
#endif
UNLOCK_GC;
+ done:
+ if (G_UNLIKELY (alloc_events))
+ mono_profiler_allocation (&str->object);
+
return str;
}