X-Git-Url: http://wien.tomnetworks.com/gitweb/?a=blobdiff_plain;f=mono%2Fsgen%2Fsgen-gc.c;h=4c3454823fdd42c2f5e0073a87f650601d6b84bf;hb=a7c9e39f0f58a1dcd41475f5623f301f14e31da7;hp=54ff725b22b3c169e7234dffde1a626cf11ee9c2;hpb=75fd607a5c178dde86a8d382ddf2ffa35d4e111c;p=mono.git diff --git a/mono/sgen/sgen-gc.c b/mono/sgen/sgen-gc.c index 54ff725b22b..4c3454823fd 100644 --- a/mono/sgen/sgen-gc.c +++ b/mono/sgen/sgen-gc.c @@ -195,6 +195,7 @@ #include #include +#include #undef pthread_create #undef pthread_join @@ -336,13 +337,6 @@ nursery_canaries_enabled (void) #define safe_object_get_size sgen_safe_object_get_size -#if defined(HAVE_CONC_GC_AS_DEFAULT) -/* Use concurrent major on deskstop platforms */ -#define DEFAULT_MAJOR SGEN_MAJOR_CONCURRENT -#else -#define DEFAULT_MAJOR SGEN_MAJOR_SERIAL -#endif - typedef enum { SGEN_MAJOR_DEFAULT, SGEN_MAJOR_SERIAL, @@ -1862,7 +1856,7 @@ collect_nursery (const char *reason, gboolean is_overflow, SgenGrayQueue *unpin_ major_collector.finish_nursery_collection (); TV_GETTIME (last_minor_collection_end_tv); - InterlockedAdd64 (&gc_stats.minor_gc_time, TV_ELAPSED (last_minor_collection_start_tv, last_minor_collection_end_tv)); + UnlockedAdd64 (&gc_stats.minor_gc_time, TV_ELAPSED (last_minor_collection_start_tv, last_minor_collection_end_tv)); sgen_debug_dump_heap ("minor", InterlockedRead (&gc_stats.minor_gc_count) - 1, NULL); @@ -2356,7 +2350,7 @@ major_do_collection (const char *reason, gboolean is_overflow, gboolean forced) sgen_gray_object_queue_dispose (&gc_thread_gray_queue); TV_GETTIME (time_end); - InterlockedAdd64 (&gc_stats.major_gc_time, TV_ELAPSED (time_start, time_end)); + UnlockedAdd64 (&gc_stats.major_gc_time, TV_ELAPSED (time_start, time_end)); /* FIXME: also report this to the user, preferably in gc-end. */ if (major_collector.get_and_reset_num_major_objects_marked) @@ -2392,7 +2386,7 @@ major_start_concurrent_collection (const char *reason) num_objects_marked = major_collector.get_and_reset_num_major_objects_marked (); TV_GETTIME (time_end); - InterlockedAdd64 (&gc_stats.major_gc_time, TV_ELAPSED (time_start, time_end)); + UnlockedAdd64 (&gc_stats.major_gc_time, TV_ELAPSED (time_start, time_end)); current_collection_generation = -1; } @@ -2420,7 +2414,7 @@ major_update_concurrent_collection (void) sgen_los_update_cardtable_mod_union (); TV_GETTIME (total_end); - InterlockedAdd64 (&gc_stats.major_gc_time, TV_ELAPSED (total_start, total_end)); + UnlockedAdd64 (&gc_stats.major_gc_time, TV_ELAPSED (total_start, total_end)); } static void @@ -2442,7 +2436,7 @@ major_finish_concurrent_collection (gboolean forced) sgen_workers_stop_all_workers (GENERATION_OLD); SGEN_TV_GETTIME (time_major_conc_collection_end); - InterlockedAdd64 (&gc_stats.major_gc_time_concurrent, SGEN_TV_ELAPSED (time_major_conc_collection_start, time_major_conc_collection_end)); + UnlockedAdd64 (&gc_stats.major_gc_time_concurrent, SGEN_TV_ELAPSED (time_major_conc_collection_start, time_major_conc_collection_end)); major_collector.update_cardtable_mod_union (); sgen_los_update_cardtable_mod_union (); @@ -2457,7 +2451,7 @@ major_finish_concurrent_collection (gboolean forced) sgen_gray_object_queue_dispose (&gc_thread_gray_queue); TV_GETTIME (total_end); - InterlockedAdd64 (&gc_stats.major_gc_time, TV_ELAPSED (total_start, total_end)); + UnlockedAdd64 (&gc_stats.major_gc_time, TV_ELAPSED (total_start, total_end)); current_collection_generation = -1; } @@ -2509,7 +2503,7 @@ sgen_ensure_free_space (size_t size, int generation) * LOCKING: Assumes the GC lock is held. */ void -sgen_perform_collection (size_t requested_size, int generation_to_collect, const char *reason, gboolean wait_to_finish, gboolean stw) +sgen_perform_collection_inner (size_t requested_size, int generation_to_collect, const char *reason, gboolean wait_to_finish, gboolean stw) { TV_DECLARE (gc_total_start); TV_DECLARE (gc_total_end); @@ -2588,6 +2582,52 @@ sgen_perform_collection (size_t requested_size, int generation_to_collect, const sgen_restart_world (oldest_generation_collected); } +#ifdef HOST_WASM + +typedef struct { + size_t requested_size; + int generation_to_collect; + const char *reason; +} SgenGcRequest; + +static SgenGcRequest gc_request; +static gboolean pending_request; + +extern void request_gc_cycle (void); + +#include + +EMSCRIPTEN_KEEPALIVE void +mono_gc_pump_callback (void) +{ + if (!pending_request) + return; + pending_request = FALSE; + sgen_perform_collection_inner (gc_request.requested_size, gc_request.generation_to_collect, gc_request.reason, TRUE, TRUE); +} +#endif + +void +sgen_perform_collection (size_t requested_size, int generation_to_collect, const char *reason, gboolean wait_to_finish, gboolean stw) +{ +#ifdef HOST_WASM + g_assert (stw); //can't handle non-stw mode (IE, domain unload) + //we ignore wait_to_finish + if (!pending_request || gc_request.generation_to_collect <= generation_to_collect) { //no active request or request was for a smaller part of the heap + gc_request.requested_size = requested_size; + gc_request.generation_to_collect = generation_to_collect; + gc_request.reason = reason; + if (!pending_request) { + request_gc_cycle (); + pending_request = TRUE; + } + } + + degraded_mode = 1; //enable degraded mode so allocation can continue +#else + sgen_perform_collection_inner (requested_size, generation_to_collect, reason, wait_to_finish, stw); +#endif +} /* * ###################################################################### * ######## Memory allocation from the OS