Przeglądaj źródła

src: when spinlock_check is not enabled, modify starpu_spinlock functions to use the starpu_pthread_spin_xxx api

Nathalie Furmento 11 lat temu
rodzic
commit
f7fa8ebb0e
2 zmienionych plików z 22 dodań i 94 usunięć
  1. 17 81
      src/common/starpu_spinlock.c
  2. 5 13
      src/common/starpu_spinlock.h

+ 17 - 81
src/common/starpu_spinlock.c

@@ -19,18 +19,11 @@
 #include <common/config.h>
 #include <common/utils.h>
 #include <common/fxt.h>
-#include <starpu_util.h>
-
-#ifdef STARPU_SIMGRID
-#include <msg/msg.h>
-#endif
+#include <common/thread.h>
 
 int _starpu_spin_init(struct _starpu_spinlock *lock)
 {
-#ifdef STARPU_SIMGRID
-	lock->taken = 0;
-	return 0;
-#elif defined(STARPU_SPINLOCK_CHECK)
+#if defined(STARPU_SPINLOCK_CHECK)
 //	memcpy(&lock->errcheck_lock, PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP, sizeof(PTHREAD_ERRORCHECK_MUTEX_INITIALIZER_NP));
 	int ret;
 	ret = pthread_mutexattr_init(&lock->errcheck_attr);
@@ -41,129 +34,72 @@ int _starpu_spin_init(struct _starpu_spinlock *lock)
 
 	ret = pthread_mutex_init(&lock->errcheck_lock, &lock->errcheck_attr);
 	return ret;
-#elif defined(HAVE_PTHREAD_SPIN_LOCK)
-	int ret = pthread_spin_init(&lock->lock, 0);
+#else
+	int ret = starpu_pthread_spin_init(&lock->lock, 0);
 	STARPU_ASSERT(!ret);
 	return ret;
-#else
-	lock->taken = 0;
-	return 0;
 #endif
 }
 
 int _starpu_spin_destroy(struct _starpu_spinlock *lock STARPU_ATTRIBUTE_UNUSED)
 {
-#ifdef STARPU_SIMGRID
-	/* we don't do anything */
-	return 0;
-#elif defined(STARPU_SPINLOCK_CHECK)
+#if defined(STARPU_SPINLOCK_CHECK)
 	pthread_mutexattr_destroy(&lock->errcheck_attr);
 	return pthread_mutex_destroy(&lock->errcheck_lock);
-#elif defined(HAVE_PTHREAD_SPIN_LOCK)
-	int ret = pthread_spin_destroy(&lock->lock);
-	STARPU_ASSERT(!ret);
-	return ret;
 #else
-	/* we don't do anything */
-	return 0;
+	return starpu_pthread_spin_destroy(&lock->lock);
 #endif
 }
 
 #undef _starpu_spin_lock
 int _starpu_spin_lock(struct _starpu_spinlock *lock)
 {
-#ifdef STARPU_SIMGRID
-	while (1)
-	{
-		if (!lock->taken)
-		{
-			lock->taken = 1;
-			return 0;
-		}
-		/* Give hand to another thread, hopefully the one which has the
-		 * spinlock and probably just has also a short-lived mutex. */
-		MSG_process_sleep(0.000001);
-		STARPU_UYIELD();
-	}
-#elif defined(STARPU_SPINLOCK_CHECK)
+#if defined(STARPU_SPINLOCK_CHECK)
 	int ret = pthread_mutex_lock(&lock->errcheck_lock);
 	STARPU_ASSERT(!ret);
 	return ret;
-#elif defined(HAVE_PTHREAD_SPIN_LOCK)
-	int ret = pthread_spin_lock(&lock->lock);
+#else
+	int ret = starpu_pthread_spin_lock(&lock->lock);
 	STARPU_ASSERT(!ret);
 	return ret;
-#else
-	uint32_t prev;
-	do
-	{
-		prev = STARPU_TEST_AND_SET(&lock->taken, 1);
-		if (prev)
-			STARPU_UYIELD();
-	}
-	while (prev);
-	return 0;
 #endif
 }
 
 int _starpu_spin_checklocked(struct _starpu_spinlock *lock)
 {
-#ifdef STARPU_SIMGRID
-	STARPU_ASSERT(lock->taken);
-	return !lock->taken;
-#elif defined(STARPU_SPINLOCK_CHECK)
+#if defined(STARPU_SPINLOCK_CHECK)
 	int ret = starpu_pthread_mutex_trylock(&lock->errcheck_lock);
 	STARPU_ASSERT(ret != 0);
 	return ret == 0;
-#elif defined(HAVE_PTHREAD_SPIN_LOCK)
-	int ret = pthread_spin_trylock(&lock->lock);
-	STARPU_ASSERT(ret != 0);
-	return ret == 0;
 #else
-	STARPU_ASSERT(lock->taken);
-	return !lock->taken;
+	return _starpu_pthread_spin_checklocked(&lock->lock);
 #endif
 }
 
 #undef _starpu_spin_trylock
 int _starpu_spin_trylock(struct _starpu_spinlock *lock)
 {
-#ifdef STARPU_SIMGRID
-	if (lock->taken)
-		return EBUSY;
-	lock->taken = 1;
-	return 0;
-#elif defined(STARPU_SPINLOCK_CHECK)
+#if defined(STARPU_SPINLOCK_CHECK)
 	int ret = starpu_pthread_mutex_trylock(&lock->errcheck_lock);
 	STARPU_ASSERT(!ret || (ret == EBUSY));
 	return ret;
-#elif defined(HAVE_PTHREAD_SPIN_LOCK)
-	int ret =  pthread_spin_trylock(&lock->lock);
+#else
+	int ret = starpu_pthread_spin_trylock(&lock->lock);
 	STARPU_ASSERT(!ret || (ret == EBUSY));
 	return ret;
-#else
-	uint32_t prev;
-	prev = STARPU_TEST_AND_SET(&lock->taken, 1);
-	return (prev == 0)?0:EBUSY;
 #endif
 }
 
 #undef _starpu_spin_unlock
 int _starpu_spin_unlock(struct _starpu_spinlock *lock STARPU_ATTRIBUTE_UNUSED)
 {
-#ifdef STARPU_SIMGRID
-	lock->taken = 0;
-	return 0;
-#elif defined(STARPU_SPINLOCK_CHECK)
+#if defined(STARPU_SPINLOCK_CHECK)
 	int ret = pthread_mutex_unlock(&lock->errcheck_lock);
 	STARPU_ASSERT(!ret);
 	return ret;
-#elif defined(HAVE_PTHREAD_SPIN_LOCK)
-	int ret = pthread_spin_unlock(&lock->lock);
+#else
+	int ret = starpu_pthread_spin_unlock(&lock->lock);
 	STARPU_ASSERT(!ret);
 	return ret;
-#else
-	STARPU_RELEASE(&lock->taken);
-	return 0;
 #endif
 }

+ 5 - 13
src/common/starpu_spinlock.h

@@ -1,7 +1,7 @@
 /* StarPU --- Runtime system for heterogeneous multicore architectures.
  *
  * Copyright (C) 2010-2013  Université de Bordeaux 1
- * Copyright (C) 2010, 2011, 2013  Centre National de la Recherche Scientifique
+ * Copyright (C) 2010, 2011, 2013, 2014  Centre National de la Recherche Scientifique
  *
  * StarPU is free software; you can redistribute it and/or modify
  * it under the terms of the GNU Lesser General Public License as published by
@@ -19,25 +19,17 @@
 
 #include <errno.h>
 #include <stdint.h>
-#include <starpu_thread.h>
 #include <common/config.h>
-#include <common/thread.h>
+#include <starpu.h>
 
 struct _starpu_spinlock
 {
-#ifdef STARPU_SIMGRID
-	int taken;
-#elif defined(STARPU_SPINLOCK_CHECK)
+#if defined(STARPU_SPINLOCK_CHECK)
 	starpu_pthread_mutexattr_t errcheck_attr;
 	starpu_pthread_mutex_t errcheck_lock;
-#elif defined(HAVE_PTHREAD_SPIN_LOCK)
-	_starpu_pthread_spinlock_t lock;
-#else
-	/* we only have a trivial implementation yet ! */
-	uint32_t taken STARPU_ATTRIBUTE_ALIGNED(16);
-#endif
-#ifdef STARPU_SPINLOCK_CHECK
 	const char *last_taker;
+#else
+	starpu_pthread_spinlock_t lock;
 #endif
 };