Пример #1
0
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;
}
Пример #2
0
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;
}