瀏覽代碼

Check the return value of pthread_cond_wait and use a while loop around
condition variables rather than a mere test.

Cédric Augonnet 15 年之前
父節點
當前提交
e77ca93d65
共有 3 個文件被更改,包括 8 次插入7 次删除
  1. 1 0
      src/common/utils.h
  2. 2 2
      src/core/dependencies/tags.c
  3. 5 5
      src/core/workers.c

+ 1 - 0
src/common/utils.h

@@ -26,5 +26,6 @@ int _starpu_check_mutex_deadlock(pthread_mutex_t *mutex);
 
 #define PTHREAD_MUTEX_LOCK(mutex) { int ret = pthread_mutex_lock(mutex); if (STARPU_UNLIKELY(ret)) { perror("pthread_mutex_lock"); STARPU_ABORT(); }}
 #define PTHREAD_MUTEX_UNLOCK(mutex) { int ret = pthread_mutex_unlock(mutex); if (STARPU_UNLIKELY(ret)) { perror("pthread_mutex_unlock"); STARPU_ABORT(); }}
+#define PTHREAD_COND_WAIT(cond, mutex) { int ret = pthread_cond_wait((cond), (mutex)); if (STARPU_UNLIKELY(ret)) { perror("pthread_cond_wait"); STARPU_ABORT();}}
 
 #endif // __COMMON_UTILS_H__

+ 2 - 2
src/core/dependencies/tags.c

@@ -331,8 +331,8 @@ int starpu_tag_wait_array(unsigned ntags, starpu_tag_t *id)
 
 	PTHREAD_MUTEX_LOCK(&cg->succ.succ_apps.cg_mutex);
 
-	if (!cg->succ.succ_apps.completed)
-		pthread_cond_wait(&cg->succ.succ_apps.cg_cond, &cg->succ.succ_apps.cg_mutex);
+	while (!cg->succ.succ_apps.completed)
+		PTHREAD_COND_WAIT(&cg->succ.succ_apps.cg_cond, &cg->succ.succ_apps.cg_mutex);
 
 	PTHREAD_MUTEX_UNLOCK(&cg->succ.succ_apps.cg_mutex);
 

+ 5 - 5
src/core/workers.c

@@ -166,8 +166,8 @@ static void _starpu_init_workers(struct starpu_machine_config_s *config)
 							_starpu_gordon_worker, &gordon_worker_set);
 
 					PTHREAD_MUTEX_LOCK(&gordon_worker_set.mutex);
-					if (!gordon_worker_set.set_is_initialized)
-						pthread_cond_wait(&gordon_worker_set.ready_cond,
+					while (!gordon_worker_set.set_is_initialized)
+						PTHREAD_COND_WAIT(&gordon_worker_set.ready_cond,
 									&gordon_worker_set.mutex);
 					PTHREAD_MUTEX_UNLOCK(&gordon_worker_set.mutex);
 
@@ -193,8 +193,8 @@ static void _starpu_init_workers(struct starpu_machine_config_s *config)
 			case STARPU_CPU_WORKER:
 			case STARPU_CUDA_WORKER:
 				PTHREAD_MUTEX_LOCK(&workerarg->mutex);
-				if (!workerarg->worker_is_initialized)
-					pthread_cond_wait(&workerarg->ready_cond, &workerarg->mutex);
+				while (!workerarg->worker_is_initialized)
+					PTHREAD_COND_WAIT(&workerarg->ready_cond, &workerarg->mutex);
 				PTHREAD_MUTEX_UNLOCK(&workerarg->mutex);
 				break;
 #ifdef STARPU_USE_GORDON
@@ -227,7 +227,7 @@ int starpu_init(struct starpu_conf *user_conf)
 	PTHREAD_MUTEX_LOCK(&init_mutex);
 	while (initialized == CHANGING)
 		/* Wait for the other one changing it */
-		pthread_cond_wait(&init_cond, &init_mutex);
+		PTHREAD_COND_WAIT(&init_cond, &init_mutex);
 	init_count++;
 	if (initialized == INITIALIZED)
 		/* He initialized it, don't do it again */