1
1
openmpi/opal/threads/mutex.c
Eugene Loh 2770a12beb Continue clean up of thread options started in r22841, 22842, and 22849.
No need for any CMRs to 1.5... that was already done in CMR 2728.

This commit was SVN r24545.

The following SVN revision numbers were found above:
  r22841 --> open-mpi/ompi@b400b84162
2011-03-18 21:36:35 +00:00

106 строки
2.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 (c) 2007 Los Alamos National Security, LLC. All rights
* reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#include "opal_config.h"
#include "opal/threads/mutex.h"
/*
* If we have progress threads, always default to using threads.
* Otherwise, wait and see if some upper layer wants to use threads.
*/
bool opal_uses_threads = false;
bool opal_mutex_check_locks = false;
#ifdef __WINDOWS__
static void opal_mutex_construct(opal_mutex_t *m)
{
InterlockedExchange(&m->m_lock, 0);
#if !OPAL_ENABLE_MULTI_THREADS && OPAL_ENABLE_DEBUG
m->m_lock_debug = 0;
m->m_lock_file = NULL;
m->m_lock_line = 0;
#endif /* !OPAL_ENABLE_MULTI_THREADS && OPAL_ENABLE_DEBUG */
}
static void opal_mutex_destruct(opal_mutex_t *m)
{
}
#else
static void opal_mutex_construct(opal_mutex_t *m)
{
#if OPAL_HAVE_POSIX_THREADS
#if OPAL_ENABLE_DEBUG
pthread_mutexattr_t attr;
pthread_mutexattr_init(&attr);
/* set type to ERRORCHECK so that we catch recursive locks */
#if OMPI_HAVE_PTHREAD_MUTEX_ERRORCHECK_NP
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK_NP);
#elif OMPI_HAVE_PTHREAD_MUTEX_ERRORCHECK
pthread_mutexattr_settype(&attr, PTHREAD_MUTEX_ERRORCHECK);
#endif /* OMPI_HAVE_PTHREAD_MUTEX_ERRORCHECK_NP */
pthread_mutex_init(&m->m_lock_pthread, &attr);
pthread_mutexattr_destroy(&attr);
#else
/* Without debugging, choose the fastest available mutexes */
pthread_mutex_init(&m->m_lock_pthread, NULL);
#endif /* OPAL_ENABLE_DEBUG */
#elif OPAL_HAVE_SOLARIS_THREADS
mutex_init(&m->m_lock_solaris, USYNC_THREAD, NULL);
#endif
#if OPAL_ENABLE_DEBUG && !OPAL_ENABLE_MULTI_THREADS
m->m_lock_debug = 0;
m->m_lock_file = NULL;
m->m_lock_line = 0;
#endif
#if OPAL_HAVE_ATOMIC_SPINLOCKS
opal_atomic_init( &m->m_lock_atomic, OPAL_ATOMIC_UNLOCKED );
#endif
}
static void opal_mutex_destruct(opal_mutex_t *m)
{
#if OPAL_HAVE_POSIX_THREADS
pthread_mutex_destroy(&m->m_lock_pthread);
#elif OPAL_HAVE_SOLARIS_THREADS
mutex_destroy(&m->m_lock_solaris);
#endif
}
#endif /* __WINDOWS__ */
OBJ_CLASS_INSTANCE(opal_mutex_t,
opal_object_t,
opal_mutex_construct,
opal_mutex_destruct);