[sgen] Don't execute jobs before actually starting the workers
authorVlad Brezae <brezaevlad@gmail.com>
Wed, 12 Apr 2017 22:14:41 +0000 (01:14 +0300)
committerVlad Brezae <brezaevlad@gmail.com>
Mon, 15 May 2017 09:52:51 +0000 (12:52 +0300)
It's counter intuitive and it might lead to races at some point.

mono/sgen/sgen-workers.c

index 47fb00d9e1f8db39461cc62ff7a29c126ffedf61..7369106164391697916b5cb9338462dff4ef0ed0 100644 (file)
@@ -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;
 }
 
 /*