Beispiel #1
0
void rt_create(void)
{
	rt_code_heap_create();
	rt_symbols_create();

	rt_setup_classes();

	rt_class_init();
	rt_object_init();
	rt_module_init();

	rt_kernel_init();

	rt_bool_init();
	rt_symbol_init();
	rt_string_init();
	rt_fixnum_init();
	rt_proc_init();
	rt_array_init();
	rt_exception_init();
}
Beispiel #2
0
sys_threadpool *
sys_threadpool_create(uint32_t num_workers)
{
	sys_threadpool *pool = (sys_threadpool *)calloc(1, sizeof(*pool));
	sys_worker *worker = NULL;
	size_t i;

	if (!pool)
		return NULL;

	pool->task_mutex = sys_mutex_create();
	pool->task_notify = sys_cond_var_create();
	
	pool->num_workers = num_workers;
	pool->shutdown = false;

	if (pool->num_workers <= 0) {
		if ((pool->num_workers = sys_cpu_count()) <= 0) {
			log_entry(THREADPOOL_MODULE, LOG_WARNING, "Failed to determine processor count. Limiting server to one thread. To avoid this, specify the number of threads");
			pool->num_workers = 1;
		}
	}

	if (rt_array_init(&pool->workers, pool->num_workers, sizeof(sys_worker)) != SYS_OK)
		goto free_task;

	if (rt_array_init(&pool->active_tasks, pool->num_workers, sizeof(sys_task *)) != SYS_OK)
		goto free_workers;	

	if (rt_queue_init(&pool->task_queue, (size_t)pool->num_workers * 2, sizeof(sys_task)) != SYS_OK)
		goto free_active_tasks;

	pool->worker_key = sys_tls_alloc_key();

	rt_array_fill(&pool->workers);
	for (i = 0; i < pool->num_workers; ++i) {
		worker = rt_array_get(&pool->workers, i);

		worker->id = i;
		worker->idle = true;
		worker->pool = pool;
		
		worker->thread = sys_thread_create(_threadpool_worker_proc);

		sys_thread_start(worker->thread, worker);
		sys_thread_detach(worker->thread);
	}

	return pool;

free_active_tasks:
	rt_array_release(&pool->active_tasks);

free_workers:
	rt_array_release(&pool->workers);

free_task:
	sys_mutex_destroy(pool->task_mutex);
	sys_cond_var_destroy(pool->task_notify);

	free(pool);

	return NULL;
}