1
1
openmpi/opal/asm/asm.c
Nathan Hjelm ac82d1a6be Per-RFC: remove the --disable-smp-locks configure option
Use of this configuration option can cause crashing, hanging, and
(worse) incorrect results when btl/sm, btl/scif, or btl/vader are
in use. We discussed this at the January 2015 developers meeting
and it was decided to remove the option entirely. This commit does
just that. All usage of OPAL_WANT_SMP_LOCKS has been removed.
2015-03-04 11:31:43 -07:00

75 строки
1.9 KiB
C

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2005 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include "opal/sys/atomic.h"
#include "opal/sys/architecture.h"
#if OPAL_ASSEMBLY_ARCH == OPAL_SPARC
#define LOCKS_TABLE_SIZE 8
/* make sure to get into reasonably useful bits (so shift at least 5) */
#define FIND_LOCK(addr) (&(locks_table[(((unsigned long) addr) >> 8) & \
(LOCKS_TABLE_SIZE - 1)]))
/* have to fix if you change LOCKS_TABLE_SIZE */
static opal_atomic_lock_t locks_table[LOCKS_TABLE_SIZE] = {
{ { OPAL_ATOMIC_UNLOCKED } },
{ { OPAL_ATOMIC_UNLOCKED } },
{ { OPAL_ATOMIC_UNLOCKED } },
{ { OPAL_ATOMIC_UNLOCKED } },
{ { OPAL_ATOMIC_UNLOCKED } },
{ { OPAL_ATOMIC_UNLOCKED } },
{ { OPAL_ATOMIC_UNLOCKED } },
{ { OPAL_ATOMIC_UNLOCKED } }
};
int32_t
opal_atomic_add_32(volatile int32_t *addr, int delta)
{
int32_t ret;
opal_atomic_lock(FIND_LOCK(addr));
ret = (*addr += delta);
opal_atomic_unlock(FIND_LOCK(addr));
return ret;
}
int32_t
opal_atomic_sub_32(volatile int32_t *addr, int delta)
{
int32_t ret;
opal_atomic_lock(FIND_LOCK(addr));
ret = (*addr -= delta);
opal_atomic_unlock(FIND_LOCK(addr));
return ret;
}
#endif /* OPAL_ASSEMBLY_ARCH == OPAL_SPARC32 */