void sgen_workers_start_all_workers (void) { State old_state, new_state; int i; gboolean result; if (!collection_needs_workers ()) return; if (sgen_get_major_collector ()->init_worker_thread) sgen_get_major_collector ()->init_worker_thread (workers_gc_thread_major_collector_data); old_state = new_state = workers_state; assert_not_working (old_state); g_assert (workers_job_queue_num_entries == 0); workers_num_jobs_enqueued = 0; workers_num_jobs_finished = 0; if (workers_started) { workers_signal_enqueue_work (workers_num, FALSE); return; } new_state.data.state = STATE_WORKING; new_state.data.num_awake = workers_num; result = set_state (old_state, new_state); SGEN_ASSERT (0, result, "Nobody else should have modified the state - workers have not been started yet"); for (i = 0; i < workers_num; ++i) workers_start_worker (i); workers_started = TRUE; }
void sgen_workers_start_all_workers (void) { int i; if (!sgen_collection_is_parallel ()) return; if (sgen_get_major_collector ()->init_worker_thread) sgen_get_major_collector ()->init_worker_thread (workers_gc_thread_data.major_collector_data); g_assert (!workers_gc_in_progress); workers_gc_in_progress = TRUE; workers_marking = FALSE; workers_done_posted = 0; if (workers_started) { if (workers_num_waiting != workers_num) g_error ("Expecting all %d sgen workers to be parked, but only %d are", workers_num, workers_num_waiting); workers_wake_up_all (); return; } for (i = 0; i < workers_num; ++i) workers_start_worker (i); workers_started = TRUE; }
static void workers_start_all_workers (void) { int i; if (!collection_is_parallel ()) return; if (major_collector.init_worker_thread) major_collector.init_worker_thread (workers_gc_thread_data.major_collector_data); g_assert (!workers_gc_in_progress); workers_gc_in_progress = TRUE; workers_marking = FALSE; workers_done_posted = 0; if (workers_started) { g_assert (workers_num_waiting == workers_num); workers_wake_up_all (); return; } for (i = 0; i < workers_num; ++i) workers_start_worker (i); workers_started = TRUE; }
void sgen_workers_start_all_workers (void) { State old_state, new_state; int i; if (!collection_needs_workers ()) return; if (sgen_get_major_collector ()->init_worker_thread) sgen_get_major_collector ()->init_worker_thread (workers_gc_thread_major_collector_data); old_state = new_state = workers_state; g_assert (!old_state.data.gc_in_progress); new_state.data.gc_in_progress = TRUE; workers_marking = FALSE; g_assert (workers_job_queue_num_entries == 0); workers_num_jobs_enqueued = 0; workers_num_jobs_finished = 0; if (workers_started) { g_assert (old_state.data.done_posted); if (old_state.data.num_waiting != workers_num) { g_error ("Expecting all %d sgen workers to be parked, but only %d are", workers_num, old_state.data.num_waiting); } /* Clear the done posted flag */ new_state.data.done_posted = 0; if (!set_state (old_state, new_state)) g_assert_not_reached (); workers_wake_up_all (); return; } g_assert (!old_state.data.done_posted); if (!set_state (old_state, new_state)) g_assert_not_reached (); for (i = 0; i < workers_num; ++i) workers_start_worker (i); workers_started = TRUE; }