static gboolean workers_get_work (WorkerData *data) { SgenMajorCollector *major; g_assert (sgen_gray_object_queue_is_empty (&data->private_gray_queue)); /* If we're concurrent, steal from the workers distribute gray queue. */ major = sgen_get_major_collector (); if (major->is_concurrent) { GrayQueueSection *section = sgen_section_gray_queue_dequeue (&workers_distribute_gray_queue); if (section) { sgen_gray_object_enqueue_section (&data->private_gray_queue, section); return TRUE; } } /* Nobody to steal from */ g_assert (sgen_gray_object_queue_is_empty (&data->private_gray_queue)); return FALSE; }
static gboolean workers_get_work (WorkerData *data) { SgenMajorCollector *major; int i; g_assert (sgen_gray_object_queue_is_empty (&data->private_gray_queue)); /* Try to steal from our own stack. */ if (workers_steal (data, data, TRUE)) return TRUE; /* From another worker. */ for (i = 0; i < workers_num; ++i) { WorkerData *victim_data = &workers_data [i]; if (data == victim_data) continue; if (workers_steal (data, victim_data, TRUE)) return TRUE; } /* * If we're concurrent or parallel, from the workers * distribute gray queue. */ major = sgen_get_major_collector (); if (major->is_concurrent || major->is_parallel) { GrayQueueSection *section = sgen_section_gray_queue_dequeue (&workers_distribute_gray_queue); if (section) { sgen_gray_object_enqueue_section (&data->private_gray_queue, section); return TRUE; } } /* Nobody to steal from */ g_assert (sgen_gray_object_queue_is_empty (&data->private_gray_queue)); return FALSE; }