diff options
author | Junyan He <junyan.he@intel.com> | 2016-04-21 22:55:24 +0800 |
---|---|---|
committer | Junyan He <junyan.he@intel.com> | 2016-04-21 22:55:24 +0800 |
commit | 98147a423cf8ad0f90d06ac597cbd53a78be77dd (patch) | |
tree | 4dd6e13bd5b7fc0591541d4fd027464fb2bef24e | |
parent | ddd623765716e767d47e50ce1967044ecb2f035b (diff) |
cond
-rw-r--r-- | libclapi/cl_mutex.c | 27 |
1 files changed, 18 insertions, 9 deletions
diff --git a/libclapi/cl_mutex.c b/libclapi/cl_mutex.c index 569f9eea..d6237065 100644 --- a/libclapi/cl_mutex.c +++ b/libclapi/cl_mutex.c @@ -111,6 +111,8 @@ static void after_get_the_mutex(pthread_mutex_t* mutex, char* file, int line, in assert(nth < 8); item->waiter[nth].file = NULL; item->waiter[nth].line = 0; + assert(item->waiter[nth].file == file); + assert(item->waiter[nth].line == line); } item->holder.file = file; @@ -119,7 +121,7 @@ static void after_get_the_mutex(pthread_mutex_t* mutex, char* file, int line, in pthread_mutex_unlock(&cl_mutex_log_lock); } -static void after_release_the_mutex(pthread_mutex_t* mutex, char* file, int line) +static void before_release_the_mutex(pthread_mutex_t* mutex, char* file, int line, int free_it) { int i, j; cl_mutex_log_item item = NULL; @@ -158,7 +160,7 @@ static void after_release_the_mutex(pthread_mutex_t* mutex, char* file, int lin } } - if (still_used == 0) { + if (free_it && still_used == 0) { cl_mutex_log_map[i] = NULL; free(item); cl_mutex_log_num--; @@ -183,7 +185,6 @@ static void handle_deadlock(pthread_mutex_t* mutex, char* file, int line) { cl_mutex_log_item item = NULL; int i; - int same_file; int print_others; int num; @@ -199,7 +200,6 @@ static void handle_deadlock(pthread_mutex_t* mutex, char* file, int line) printf("We may dead lock at a unknown mutex, call lock point is" "file: %s, line: %d\n", file, line); } else { - same_file = 0; print_others = 1; printf("We may dead lock at a mutex:%p, call lock point is" "file: %s, line: %d.\nThe mutex is held by file: %s, line: %d\n", @@ -213,11 +213,7 @@ static void handle_deadlock(pthread_mutex_t* mutex, char* file, int line) printf(" file: %s, line %d\n", item->waiter[i].file, item->waiter[i].line); } - - if (item->waiter[i].file == file) - same_file = 1; } - assert(same_file); } printf("------------------------------------------------------\n"); @@ -248,7 +244,20 @@ LOCAL void cl_mutex_lock(pthread_mutex_t* mutex, char* file, int line) LOCAL void cl_mutex_unlock(pthread_mutex_t* mutex, char* file, int line) { assert(mutex); + before_release_the_mutex(mutex, file, line, 1); pthread_mutex_unlock(mutex); - after_release_the_mutex(mutex, file, line); +} + +LOCAL int cl_cond_wait(pthread_cond_t* cond, pthread_mutex_t* mutex, char* file, int line) +{ + int ret; + assert(mutex); + assert(cond); + + before_release_the_mutex(mutex, file, line, 0); + ret = pthread_cond_wait(cond, mutex); + after_get_the_mutex(mutex, file, line, -1); + + return ret; } |