static GCObject* alloc_degraded (GCVTable vtable, size_t size, gboolean for_mature) { GCObject *p; if (!for_mature) { sgen_client_degraded_allocation (); SGEN_ATOMIC_ADD_P (sgen_degraded_mode, size); sgen_ensure_free_space (size, GENERATION_OLD); } else { if (sgen_need_major_collection (size)) sgen_perform_collection (size, GENERATION_OLD, "mature allocation failure", !for_mature, TRUE); } p = sgen_major_collector.alloc_degraded (vtable, size); if (!for_mature) sgen_binary_protocol_alloc_degraded (p, vtable, size, sgen_client_get_provenance ()); return p; }
static void* alloc_degraded (MonoVTable *vtable, size_t size, gboolean for_mature) { static int last_major_gc_warned = -1; static int num_degraded = 0; void *p; if (!for_mature) { if (last_major_gc_warned < stat_major_gcs) { ++num_degraded; if (num_degraded == 1 || num_degraded == 3) mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "Warning: Degraded allocation. Consider increasing nursery-size if the warning persists."); else if (num_degraded == 10) mono_trace (G_LOG_LEVEL_INFO, MONO_TRACE_GC, "Warning: Repeated degraded allocation. Consider increasing nursery-size."); last_major_gc_warned = stat_major_gcs; } SGEN_ATOMIC_ADD_P (degraded_mode, size); sgen_ensure_free_space (size); } else { if (sgen_need_major_collection (size)) sgen_perform_collection (size, GENERATION_OLD, "mature allocation failure", !for_mature); } p = major_collector.alloc_degraded (vtable, size); if (for_mature) { MONO_GC_MAJOR_OBJ_ALLOC_MATURE ((mword)p, size, vtable->klass->name_space, vtable->klass->name); } else { binary_protocol_alloc_degraded (p, vtable, size); MONO_GC_MAJOR_OBJ_ALLOC_DEGRADED ((mword)p, size, vtable->klass->name_space, vtable->klass->name); } return p; }
static void* alloc_degraded (MonoVTable *vtable, size_t size, gboolean for_mature) { static int last_major_gc_warned = -1; static int num_degraded = 0; if (!for_mature) { if (last_major_gc_warned < stat_major_gcs) { ++num_degraded; if (num_degraded == 1 || num_degraded == 3) fprintf (stderr, "Warning: Degraded allocation. Consider increasing nursery-size if the warning persists.\n"); else if (num_degraded == 10) fprintf (stderr, "Warning: Repeated degraded allocation. Consider increasing nursery-size.\n"); last_major_gc_warned = stat_major_gcs; } InterlockedExchangeAdd (°raded_mode, size); } if (sgen_need_major_collection (0)) { sgen_collect_major_no_lock ("degraded overflow"); } return major_collector.alloc_degraded (vtable, size); }