瀏覽代碼

Use a rw-lock instead of a mutex to protect the list of progression hooks.

Cédric Augonnet 14 年之前
父節點
當前提交
b566d09898
共有 1 個文件被更改,包括 9 次插入8 次删除
  1. 9 8
      src/core/progress_hook.c

+ 9 - 8
src/core/progress_hook.c

@@ -27,13 +27,14 @@ struct progression_hook {
 };
 
 /* protect the hook table */
-static pthread_mutex_t progression_hook_mutex = PTHREAD_MUTEX_INITIALIZER;
+static pthread_rwlock_t progression_hook_rwlock = PTHREAD_RWLOCK_INITIALIZER;
+
 static struct progression_hook hooks[NMAXHOOKS] = {{NULL, NULL, 0}};
 
 int starpu_progression_hook_register(unsigned (*func)(void *arg), void *arg)
 {
 	int hook;
-	PTHREAD_MUTEX_LOCK(&progression_hook_mutex);
+	PTHREAD_RWLOCK_WRLOCK(&progression_hook_rwlock);
 	for (hook = 0; hook < NMAXHOOKS; hook++)
 	{
 		if (!hooks[hook].active)
@@ -43,13 +44,13 @@ int starpu_progression_hook_register(unsigned (*func)(void *arg), void *arg)
 			hooks[hook].arg = arg;
 			hooks[hook].active = 1;
 
-			PTHREAD_MUTEX_UNLOCK(&progression_hook_mutex);
+			PTHREAD_RWLOCK_UNLOCK(&progression_hook_rwlock);
 			
 			return hook;
 		}
 	}
 
-	PTHREAD_MUTEX_UNLOCK(&progression_hook_mutex);
+	PTHREAD_RWLOCK_UNLOCK(&progression_hook_rwlock);
 
 	starpu_wake_all_blocked_workers();
 
@@ -59,9 +60,9 @@ int starpu_progression_hook_register(unsigned (*func)(void *arg), void *arg)
 
 void starpu_progression_hook_deregister(int hook_id)
 {
-	PTHREAD_MUTEX_LOCK(&progression_hook_mutex);
+	PTHREAD_RWLOCK_WRLOCK(&progression_hook_rwlock);
 	hooks[hook_id].active = 0;
-	PTHREAD_MUTEX_UNLOCK(&progression_hook_mutex);
+	PTHREAD_RWLOCK_UNLOCK(&progression_hook_rwlock);
 }
 
 unsigned _starpu_execute_registered_progression_hooks(void)
@@ -75,9 +76,9 @@ unsigned _starpu_execute_registered_progression_hooks(void)
 	{
 		unsigned active;
 
-		PTHREAD_MUTEX_LOCK(&progression_hook_mutex);
+		PTHREAD_RWLOCK_RDLOCK(&progression_hook_rwlock);
 		active = hooks[hook].active;
-		PTHREAD_MUTEX_UNLOCK(&progression_hook_mutex);
+		PTHREAD_RWLOCK_UNLOCK(&progression_hook_rwlock);
 
 		unsigned may_block_hook = 1;