/* __ompc_add_task_to_pool_simple_2level: * Adds a task to the task pool. The task will be added to the current * thread's queue. */ int __ompc_add_task_to_pool_simple_2level(omp_task_pool_t *pool, omp_task_t *task) { int success; int myid = __omp_myid; omp_task_queue_level_t *per_thread; omp_task_queue_level_t *community; Is_True(pool != NULL, ("__ompc_add_task_to_pool: task pool is uninitialized")); Is_True(task != NULL, ("__ompc_add_task_to_pool: tried to add NULL task to pool")); success = 0; per_thread = &pool->level[PER_THREAD]; community = &pool->level[COMMUNITY]; /* num_pending_tasks track not just tasks entered into the task pool, but * also tasks marked as deferred that could not fit into the task pool */ if (__ompc_atomic_inc(&pool->num_pending_tasks) == 1) { pthread_mutex_lock(&pool->pool_lock); pthread_cond_broadcast(&pool->pool_cond); pthread_mutex_unlock(&pool->pool_lock); } /* don't try to place it in per-thread queue if it looks to be full, because * we have the community queue to use instead */ if (!__ompc_task_queue_is_full(&per_thread->task_queue[myid])) success = __ompc_task_queue_put(&pool->level[PER_THREAD].task_queue[myid], task); if (!success) success = __ompc_task_queue_donate(pool->level[COMMUNITY].task_queue, task); return success; }
/* __ompc_add_task_to_pool_default: * Adds a task to the task pool. The task will be added to the current * thread's queue. */ int __ompc_add_task_to_pool_default(omp_task_pool_t *pool, omp_task_t *task) { int success; int myid = __omp_myid; omp_task_queue_level_t *per_thread; Is_True(pool != NULL, ("__ompc_add_task_to_pool: task pool is uninitialized")); Is_True(task != NULL, ("__ompc_add_task_to_pool: tried to add NULL task to pool")); /* num_pending_tasks track not just tasks entered into the task pool, but * also tasks marked as deferred that could not fit into the task pool */ if (__ompc_atomic_inc(&pool->num_pending_tasks) == 1) { pthread_mutex_lock(&pool->pool_lock); pthread_cond_broadcast(&pool->pool_cond); pthread_mutex_unlock(&pool->pool_lock); } per_thread = &pool->level[PER_THREAD]; if (__ompc_task_is_tied(task)) /* For tied tasks, we don't use the task_queue API. We explicitly put to * the tail */ success = __ompc_queue_put_tail( &per_thread->task_queue[TIED_IDX(myid)], task); else success = __ompc_task_queue_put( &per_thread->task_queue[UNTIED_IDX(myid)], task); return success; }
/* __ompc_add_task_to_pool_simple: * Adds a task to the task pool. The task will be added to the current * thread's queue. */ int __ompc_add_task_to_pool_simple(omp_task_pool_t *pool, omp_task_t *task) { int success; int myid = __omp_myid; Is_True(pool != NULL, ("__ompc_add_task_to_pool: task pool is uninitialized")); Is_True(task != NULL, ("__ompc_add_task_to_pool: tried to add NULL task to pool")); /* num_pending_tasks track not just tasks entered into the task pool, but * also tasks marked as deferred that could not fit into the task pool */ if (__ompc_atomic_inc(&pool->num_pending_tasks) == 1) { pthread_mutex_lock(&pool->pool_lock); pthread_cond_broadcast(&pool->pool_cond); pthread_mutex_unlock(&pool->pool_lock); } success = __ompc_task_queue_put(&pool->level[PER_THREAD].task_queue[myid], task); return success; }