diff options
Diffstat (limited to 'erts/include/internal/sparc32/spinlock.h')
| -rw-r--r-- | erts/include/internal/sparc32/spinlock.h | 11 | 
1 files changed, 7 insertions, 4 deletions
diff --git a/erts/include/internal/sparc32/spinlock.h b/erts/include/internal/sparc32/spinlock.h index 493d514210..d4e36e09cf 100644 --- a/erts/include/internal/sparc32/spinlock.h +++ b/erts/include/internal/sparc32/spinlock.h @@ -1,7 +1,7 @@  /*   * %CopyrightBegin%   * - * Copyright Ericsson AB 2005-2010. All Rights Reserved. + * Copyright Ericsson AB 2005-2011. All Rights Reserved.   *   * The contents of this file are subject to the Erlang Public License,   * Version 1.1, (the "License"); you may not use this file except in @@ -24,6 +24,9 @@  #ifndef ETHR_SPARC32_SPINLOCK_H  #define ETHR_SPARC32_SPINLOCK_H +#define ETHR_HAVE_NATIVE_SPINLOCKS 1 +#define ETHR_NATIVE_SPINLOCK_IMPL "ethread" +  /* Locked with ldstub, so unlocked when 0 and locked when non-zero. */  typedef struct {      volatile unsigned char lock; @@ -40,7 +43,7 @@ ethr_native_spinlock_init(ethr_native_spinlock_t *lock)  static ETHR_INLINE void  ethr_native_spin_unlock(ethr_native_spinlock_t *lock)  { -    __asm__ __volatile__("membar #LoadStore|#StoreStore"); +    ETHR_MEMBAR(ETHR_LoadStore|ETHR_StoreStore);      lock->lock = 0;  } @@ -51,10 +54,10 @@ ethr_native_spin_trylock(ethr_native_spinlock_t *lock)      __asm__ __volatile__(  	"ldstub [%1], %0\n\t" -	"membar #StoreLoad|#StoreStore"  	: "=r"(prev)  	: "r"(&lock->lock)  	: "memory"); +    ETHR_MEMBAR(ETHR_StoreLoad|ETHR_StoreStore);      return prev == 0;  } @@ -71,7 +74,7 @@ ethr_native_spin_lock(ethr_native_spinlock_t *lock)  	if (__builtin_expect(ethr_native_spin_trylock(lock) != 0, 1))  	    break;  	do { -	    __asm__ __volatile__("membar #LoadLoad"); +	    ETHR_MEMBAR(ETHR_LoadLoad);  	} while (ethr_native_spin_is_locked(lock));      }  }  | 
