From: Vlad Brezae Date: Wed, 12 Apr 2017 22:14:41 +0000 (+0300) Subject: [sgen] Don't execute jobs before actually starting the workers X-Git-Url: http://wien.tomnetworks.com/gitweb/?p=mono.git;a=commitdiff_plain;h=f1542c6e52fba916b224dcbe17b750e2b3764e57 [sgen] Don't execute jobs before actually starting the workers It's counter intuitive and it might lead to races at some point. --- diff --git a/mono/sgen/sgen-workers.c b/mono/sgen/sgen-workers.c index 47fb00d9e1f..73691061643 100644 --- a/mono/sgen/sgen-workers.c +++ b/mono/sgen/sgen-workers.c @@ -22,6 +22,7 @@ static int workers_num; static int active_workers_num; +static volatile gboolean started; static volatile gboolean forced_stop; static WorkerData *workers_data; static SgenWorkerCallback worker_init_cb; @@ -313,7 +314,7 @@ should_work_func (void *data_untyped) WorkerData *data = (WorkerData*)data_untyped; int current_worker = (int) (data - workers_data); - return current_worker < active_workers_num; + return started && current_worker < active_workers_num; } static void @@ -415,6 +416,8 @@ sgen_workers_stop_all_workers (void) sgen_thread_pool_wait_for_all_jobs (pool); sgen_thread_pool_idle_wait (pool); SGEN_ASSERT (0, sgen_workers_all_done (), "Can only signal enqueue work when in no work state"); + + started = FALSE; } void @@ -431,11 +434,14 @@ sgen_workers_set_num_active_workers (int num_workers) void sgen_workers_start_all_workers (SgenObjectOperations *object_ops_nopar, SgenObjectOperations *object_ops_par, SgenWorkersFinishCallback callback) { + SGEN_ASSERT (0, !started, "Why are we starting to work without finishing previous cycle"); + idle_func_object_ops_par = object_ops_par; idle_func_object_ops_nopar = object_ops_nopar; forced_stop = FALSE; finish_callback = callback; worker_awakenings = 0; + started = TRUE; mono_memory_write_barrier (); /* @@ -461,6 +467,8 @@ sgen_workers_join (void) SGEN_ASSERT (0, sgen_section_gray_queue_is_empty (&workers_distribute_gray_queue), "Why is there still work left to do?"); for (i = 0; i < active_workers_num; ++i) SGEN_ASSERT (0, sgen_gray_object_queue_is_empty (&workers_data [i].private_gray_queue), "Why is there still work left to do?"); + + started = FALSE; } /*