コード例 #1
0
ファイル: sgen-workers.c プロジェクト: rcruzs00/mono
void
sgen_workers_init (int num_workers)
{
    int i;
    void **workers_data_ptrs = alloca(num_workers * sizeof(void *));

    if (!sgen_get_major_collector ()->is_concurrent) {
        sgen_thread_pool_init (num_workers, thread_pool_init_func, NULL, NULL, NULL);
        return;
    }

    //g_print ("initing %d workers\n", num_workers);

    workers_num = num_workers;

    workers_data = sgen_alloc_internal_dynamic (sizeof (WorkerData) * num_workers, INTERNAL_MEM_WORKER_DATA, TRUE);
    memset (workers_data, 0, sizeof (WorkerData) * num_workers);

    init_distribute_gray_queue ();

    for (i = 0; i < workers_num; ++i)
        workers_data_ptrs [i] = (void *) &workers_data [i];

    sgen_thread_pool_init (num_workers, thread_pool_init_func, marker_idle_func, continue_idle_func, workers_data_ptrs);

    mono_counters_register ("# workers finished", MONO_COUNTER_GC | MONO_COUNTER_ULONG, &stat_workers_num_finished);
}
コード例 #2
0
ファイル: sgen-workers.c プロジェクト: rcruzs00/mono
void
sgen_workers_init_distribute_gray_queue (void)
{
    SGEN_ASSERT (0, sgen_get_major_collector ()->is_concurrent,
                 "Why should we init the distribute gray queue if we don't need it?");
    init_distribute_gray_queue ();
}
コード例 #3
0
ファイル: sgen-workers.c プロジェクト: AlexanderBekrenev/mono
void
sgen_workers_init_distribute_gray_queue (void)
{
	if (!collection_needs_workers ())
		return;

	init_distribute_gray_queue (sgen_get_major_collector ()->is_concurrent);
}
コード例 #4
0
ファイル: sgen-workers.c プロジェクト: AlexanderBekrenev/mono
void
sgen_workers_init (int num_workers)
{
	int i;

	if (!sgen_get_major_collector ()->is_concurrent)
		return;

	//g_print ("initing %d workers\n", num_workers);

	workers_num = num_workers;

	workers_data = sgen_alloc_internal_dynamic (sizeof (WorkerData) * num_workers, INTERNAL_MEM_WORKER_DATA, TRUE);
	memset (workers_data, 0, sizeof (WorkerData) * num_workers);

	MONO_SEM_INIT (&workers_waiting_sem, 0);
	MONO_SEM_INIT (&workers_done_sem, 0);

	init_distribute_gray_queue (sgen_get_major_collector ()->is_concurrent);

	if (sgen_get_major_collector ()->alloc_worker_data)
		workers_gc_thread_major_collector_data = sgen_get_major_collector ()->alloc_worker_data ();

	for (i = 0; i < workers_num; ++i) {
		workers_data [i].index = i;

		/* private gray queue is inited by the thread itself */
		mono_mutex_init (&workers_data [i].stealable_stack_mutex);
		workers_data [i].stealable_stack_fill = 0;

		if (sgen_get_major_collector ()->alloc_worker_data)
			workers_data [i].major_collector_data = sgen_get_major_collector ()->alloc_worker_data ();
	}

	LOCK_INIT (workers_job_queue_mutex);

	sgen_register_fixed_internal_mem_type (INTERNAL_MEM_JOB_QUEUE_ENTRY, sizeof (JobQueueEntry));

	mono_counters_register ("Stolen from self lock", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_workers_stolen_from_self_lock);
	mono_counters_register ("Stolen from self no lock", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_workers_stolen_from_self_no_lock);
	mono_counters_register ("Stolen from others", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_workers_stolen_from_others);
	mono_counters_register ("# workers waited", MONO_COUNTER_GC | MONO_COUNTER_LONG, &stat_workers_num_waited);
}