/** * \brief Stop all threads after they finish the current jobs. * * Block until all threads have stopped. * * \return 1 on success, 0 on failure */ int kvz_threadqueue_stop(threadqueue_queue_t * const threadqueue) { PTHREAD_LOCK(&threadqueue->lock); if (threadqueue->stop) { // The threadqueue should have stopped already. assert(threadqueue->thread_running_count == 0); PTHREAD_UNLOCK(&threadqueue->lock); return 1; } // Tell all threads to stop. threadqueue->stop = true; PTHREAD_COND_BROADCAST(&threadqueue->job_available); PTHREAD_UNLOCK(&threadqueue->lock); // Wait for them to stop. for (int i = 0; i < threadqueue->thread_count; i++) { if (pthread_join(threadqueue->threads[i], NULL) != 0) { fprintf(stderr, "pthread_join failed!\n"); return 0; } } return 1; }
void starpu_wake_all_blocked_workers(void) { /* workers may be blocked on the various queues' conditions */ unsigned cond_id; starpu_mem_node_descr * const descr = _starpu_get_memory_node_description(); PTHREAD_RWLOCK_RDLOCK(&descr->conditions_rwlock); unsigned nconds = descr->total_condition_count; for (cond_id = 0; cond_id < nconds; cond_id++) { struct _cond_and_mutex *condition; condition = &descr->conditions_all[cond_id]; /* wake anybody waiting on that condition */ PTHREAD_MUTEX_LOCK(condition->mutex); PTHREAD_COND_BROADCAST(condition->cond); PTHREAD_MUTEX_UNLOCK(condition->mutex); } PTHREAD_RWLOCK_UNLOCK(&descr->conditions_rwlock); }
void _starpu_wake_all_blocked_workers_on_node(unsigned nodeid) { /* wake up all workers on that memory node */ unsigned cond_id; starpu_mem_node_descr * const descr = _starpu_get_memory_node_description(); PTHREAD_RWLOCK_RDLOCK(&descr->conditions_rwlock); unsigned nconds = descr->condition_count[nodeid]; for (cond_id = 0; cond_id < nconds; cond_id++) { struct _cond_and_mutex *condition; condition = &descr->conditions_attached_to_node[nodeid][cond_id]; /* wake anybody waiting on that condition */ PTHREAD_MUTEX_LOCK(condition->mutex); PTHREAD_COND_BROADCAST(condition->cond); PTHREAD_MUTEX_UNLOCK(condition->mutex); } PTHREAD_RWLOCK_UNLOCK(&descr->conditions_rwlock); }