summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJunyan He <junyan.he@intel.com>2016-04-21 22:55:24 +0800
committerJunyan He <junyan.he@intel.com>2016-04-21 22:55:24 +0800
commit98147a423cf8ad0f90d06ac597cbd53a78be77dd (patch)
tree4dd6e13bd5b7fc0591541d4fd027464fb2bef24e
parentddd623765716e767d47e50ce1967044ecb2f035b (diff)
cond
-rw-r--r--libclapi/cl_mutex.c27
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;
}