浏览代码

- Some pthread functions seem to leave errno unmodified, so we use strerror
instead of perror.
- Check the returns values of pthread_{mutex,cond}_{init,destroy} too.

Cédric Augonnet 15 年之前
父节点
当前提交
61652faf3b
共有 2 个文件被更改,包括 15 次插入8 次删除
  1. 10 3
      src/common/utils.h
  2. 5 5
      src/core/jobs.c

+ 10 - 3
src/common/utils.h

@@ -20,12 +20,19 @@
 #include <starpu.h>
 #include <common/config.h>
 #include <sys/stat.h>
+#include <string.h>
 
 int _starpu_mkpath(const char *s, mode_t mode);
 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();}}
+#define PTHREAD_MUTEX_INIT(mutex, attr) { int ret = pthread_mutex_init((mutex), (attr)); if (STARPU_UNLIKELY(ret)) { fprintf(stderr, "pthread_mutex_init: %s\n", strerror(ret)); STARPU_ABORT(); }}
+#define PTHREAD_MUTEX_DESTROY(mutex) { int ret = pthread_mutex_destroy(mutex); if (STARPU_UNLIKELY(ret)) { fprintf(stderr, "pthread_mutex_destroy: %s\n", strerror(ret)); STARPU_ABORT(); }}
+#define PTHREAD_MUTEX_LOCK(mutex) { int ret = pthread_mutex_lock(mutex); if (STARPU_UNLIKELY(ret)) { fprintf(stderr, "pthread_mutex_lock : %s", strerror(ret)); STARPU_ABORT(); }}
+#define PTHREAD_MUTEX_UNLOCK(mutex) { int ret = pthread_mutex_unlock(mutex); if (STARPU_UNLIKELY(ret)) { fprintf(stderr, "pthread_mutex_unlock : %s", strerror(ret)); STARPU_ABORT(); }}
+
+#define PTHREAD_COND_INIT(cond, attr) { int ret = pthread_cond_init((cond), (attr)); if (STARPU_UNLIKELY(ret)) { fprintf(stderr, "pthread_cond_init : %s", strerror(ret)); STARPU_ABORT(); }}
+#define PTHREAD_COND_DESTROY(cond) { int ret = pthread_cond_destroy(cond); if (STARPU_UNLIKELY(ret)) { fprintf(stderr, "pthread_cond_destroy : %s", strerror(ret)); STARPU_ABORT();}}
+#define PTHREAD_COND_BROADCAST(cond) { int ret = pthread_cond_broadcast(cond); if (STARPU_UNLIKELY(ret)) { fprintf(stderr, "pthread_cond_broadcast : %s", strerror(ret)); STARPU_ABORT();}}
+#define PTHREAD_COND_WAIT(cond, mutex) { int ret = pthread_cond_wait((cond), (mutex)); if (STARPU_UNLIKELY(ret)) { fprintf(stderr, "pthread_cond_wait : %s", strerror(ret)); STARPU_ABORT();}}
 
 #endif // __COMMON_UTILS_H__

+ 5 - 5
src/core/jobs.c

@@ -55,8 +55,8 @@ starpu_job_t __attribute__((malloc)) _starpu_job_create(struct starpu_task *task
 
 	_starpu_cg_list_init(&job->job_successors);
 
-	pthread_mutex_init(&job->sync_mutex, NULL);
-	pthread_cond_init(&job->sync_cond, NULL);
+	PTHREAD_MUTEX_INIT(&job->sync_mutex, NULL);
+	PTHREAD_COND_INIT(&job->sync_cond, NULL);
 
 	if (task->use_tag)
 		_starpu_tag_declare(task->tag_id, job);
@@ -66,8 +66,8 @@ starpu_job_t __attribute__((malloc)) _starpu_job_create(struct starpu_task *task
 
 void _starpu_job_destroy(starpu_job_t j)
 {
-	pthread_cond_destroy(&j->sync_cond);
-	pthread_mutex_destroy(&j->sync_mutex);
+	PTHREAD_COND_DESTROY(&j->sync_cond);
+	PTHREAD_MUTEX_DESTROY(&j->sync_mutex);
 
 	_starpu_cg_list_deinit(&j->job_successors);
 
@@ -133,7 +133,7 @@ void _starpu_handle_job_termination(starpu_job_t j)
 		/* we do not desallocate the job structure if some is going to
 		 * wait after the task */
 		PTHREAD_MUTEX_LOCK(&j->sync_mutex);
-		pthread_cond_broadcast(&j->sync_cond);
+		PTHREAD_COND_BROADCAST(&j->sync_cond);
 		PTHREAD_MUTEX_UNLOCK(&j->sync_mutex);
 	}
 	else {