void embb_mtapi_id_pool_initialize( embb_mtapi_id_pool_t * that, mtapi_uint_t capacity) { mtapi_uint_t ii; that->capacity = capacity; that->id_buffer = (mtapi_uint_t*) embb_mtapi_alloc_allocate(sizeof(mtapi_uint_t)*(capacity)); that->id_buffer[0] = EMBB_MTAPI_IDPOOL_INVALID_ID; for (ii = 1; ii < capacity; ii++) { that->id_buffer[ii] = ii; } that->ids_availabe = capacity - 1; that->put_id_position = 0; that->get_id_position = 1; embb_mtapi_spinlock_initialize(&that->lock); }
mtapi_boolean_t embb_mtapi_thread_context_initialize( embb_mtapi_thread_context_t* that, embb_mtapi_node_t* node, mtapi_uint_t worker_index, mtapi_uint_t core_num, embb_thread_priority_t priority) { mtapi_uint_t ii; mtapi_boolean_t result = MTAPI_TRUE; assert(MTAPI_NULL != that); assert(MTAPI_NULL != node); that->node = node; that->worker_index = worker_index; that->core_num = core_num; that->priorities = node->attributes.max_priorities; that->is_initialized = MTAPI_FALSE; that->thread_priority = priority; that->is_main_thread = (worker_index == 0) ? node->attributes.reuse_main_thread : MTAPI_FALSE; embb_atomic_store_int(&that->run, 0); that->queue = (embb_mtapi_task_queue_t**)embb_mtapi_alloc_allocate( sizeof(embb_mtapi_task_queue_t)*that->priorities); if (that->queue == NULL) { that->private_queue = NULL; return MTAPI_FALSE; } for (ii = 0; ii < that->priorities; ii++) { that->queue[ii] = (embb_mtapi_task_queue_t*) embb_mtapi_alloc_allocate(sizeof(embb_mtapi_task_queue_t)); if (that->queue[ii] != NULL) { embb_mtapi_task_queue_initialize_with_capacity( that->queue[ii], node->attributes.queue_limit); } else { result = MTAPI_FALSE; } } if (!result) { return MTAPI_FALSE; } that->private_queue = (embb_mtapi_task_queue_t**)embb_mtapi_alloc_allocate( sizeof(embb_mtapi_task_queue_t)*that->priorities); if (that->private_queue == NULL) { return MTAPI_FALSE; } for (ii = 0; ii < that->priorities; ii++) { that->private_queue[ii] = (embb_mtapi_task_queue_t*) embb_mtapi_alloc_allocate(sizeof(embb_mtapi_task_queue_t)); if (that->private_queue[ii] != NULL) { embb_mtapi_task_queue_initialize_with_capacity( that->private_queue[ii], node->attributes.queue_limit); } else { result = MTAPI_FALSE; } } if (!result) { return MTAPI_FALSE; } embb_mutex_init(&that->work_available_mutex, EMBB_MUTEX_PLAIN); embb_condition_init(&that->work_available); embb_atomic_store_int(&that->is_sleeping, 0); that->is_initialized = MTAPI_TRUE; return MTAPI_TRUE; }