Explorar el Código

omp: refactor CRITICAL constructs

Samuel Pitoiset hace 9 años
padre
commit
80e4f01baf
Se han modificado 1 ficheros con 2 adiciones y 55 borrados
  1. 2 55
      src/util/openmp_runtime_support.c

+ 2 - 55
src/util/openmp_runtime_support.c

@@ -1373,62 +1373,9 @@ void starpu_omp_single_copyprivate_inline_end(void)
 
 void starpu_omp_critical(void (*f)(void *arg), void *arg, const char *name)
 {
-	struct starpu_omp_task *task = STARPU_PTHREAD_GETSPECIFIC(omp_task_key);
-	struct starpu_omp_critical *critical = NULL;
-	struct starpu_omp_task_link link;
-
-	if (name)
-	{
-		_starpu_spin_lock(&_global_state.named_criticals_lock);
-		HASH_FIND_STR(_global_state.named_criticals, name, critical);
-		if (critical == NULL)
-		{
-			critical = create_omp_critical_struct();
-			critical->name = name;
-			HASH_ADD_STR(_global_state.named_criticals, name, critical);
-		}
-		_starpu_spin_unlock(&_global_state.named_criticals_lock);
-	}
-	else
-	{
-		critical = _global_state.default_critical;
-	}
-
-	_starpu_spin_lock(&critical->lock);
-	while (critical->state != 0)
-	{
-		_starpu_spin_lock(&task->lock);
-		task->wait_on |= starpu_omp_task_wait_on_critical;
-		task->transaction_pending = 1;
-		link.task = task;
-		link.next = critical->contention_list_head;
-		critical->contention_list_head = &link;
-		_starpu_spin_unlock(&task->lock);
-		_starpu_spin_unlock(&critical->lock);
-		_starpu_task_prepare_for_continuation_ext(0, transaction_callback, task);
-		starpu_omp_task_preempt();
-
-		/* re-acquire the spin lock */
-		_starpu_spin_lock(&critical->lock);
-	}
-	critical->state = 1;
-	_starpu_spin_unlock(&critical->lock);
-
+	starpu_omp_critical_inline_begin(name);
 	f(arg);
-
-	_starpu_spin_lock(&critical->lock);
-	STARPU_ASSERT(critical->state == 1);
-	critical->state = 0;
-	if (critical->contention_list_head != NULL)
-	{
-		struct starpu_omp_task *next_task = critical->contention_list_head->task;
-		weak_task_lock(next_task);
-		critical->contention_list_head = critical->contention_list_head->next;
-		STARPU_ASSERT(next_task->wait_on & starpu_omp_task_wait_on_critical);
-		next_task->wait_on &= ~starpu_omp_task_wait_on_critical;
-		wake_up_and_unlock_task(next_task);
-	}
-	_starpu_spin_unlock(&critical->lock);
+	starpu_omp_critical_inline_end(name);
 }
 
 void starpu_omp_critical_inline_begin(const char *name)