|
Packit |
0848f5 |
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
|
|
Packit |
0848f5 |
/*
|
|
Packit |
0848f5 |
* (C) 2001 by Argonne National Laboratory.
|
|
Packit |
0848f5 |
* See COPYRIGHT in top-level directory.
|
|
Packit |
0848f5 |
*/
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#if !defined(MPIU_THREAD_MULTIPLE_H_INCLUDED)
|
|
Packit |
0848f5 |
#define MPIU_THREAD_MULTIPLE_H_INCLUDED
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#include "mpiu_thread_priv.h"
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#define MPIU_THREAD_CHECK_BEGIN if (MPIR_ThreadInfo.isThreaded) {
|
|
Packit |
0848f5 |
#define MPIU_THREAD_CHECK_END }
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Nonrecursive mutex macros */
|
|
Packit |
0848f5 |
#define MPIUI_THREAD_CS_ENTER_NONRECURSIVE(lockname, mutex) \
|
|
Packit |
0848f5 |
do { \
|
|
Packit |
0848f5 |
int err_; \
|
|
Packit |
0848f5 |
MPIU_THREAD_CHECK_BEGIN; \
|
|
Packit |
0848f5 |
MPIU_DBG_MSG_S(THREAD, TYPICAL, "locking %s", lockname); \
|
|
Packit |
0848f5 |
MPIU_Thread_mutex_lock(&mutex, &err_); \
|
|
Packit |
0848f5 |
MPIU_THREAD_CHECK_END; \
|
|
Packit |
0848f5 |
} while (0)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#define MPIUI_THREAD_CS_EXIT_NONRECURSIVE(lockname, mutex) \
|
|
Packit |
0848f5 |
do { \
|
|
Packit |
0848f5 |
int err_; \
|
|
Packit |
0848f5 |
MPIU_THREAD_CHECK_BEGIN; \
|
|
Packit |
0848f5 |
MPIU_DBG_MSG_S(THREAD, TYPICAL, "unlocking %s", lockname); \
|
|
Packit |
0848f5 |
MPIU_Thread_mutex_unlock(&mutex, &err_); \
|
|
Packit |
0848f5 |
MPIU_THREAD_CHECK_END; \
|
|
Packit |
0848f5 |
} while (0)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#define MPIUI_THREAD_CS_YIELD_NONRECURSIVE(lockname, mutex) \
|
|
Packit |
0848f5 |
do { \
|
|
Packit |
0848f5 |
MPIU_THREAD_CHECK_BEGIN; \
|
|
Packit |
0848f5 |
MPIU_DBG_MSG_S(THREAD, TYPICAL, "yielding %s", lockname); \
|
|
Packit |
0848f5 |
MPIU_Thread_yield(&mutex); \
|
|
Packit |
0848f5 |
MPIU_THREAD_CHECK_END; \
|
|
Packit |
0848f5 |
} while (0)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Recursive mutex macros */
|
|
Packit |
0848f5 |
/* We don't need to protect the depth variable since it is thread
|
|
Packit |
0848f5 |
* private and sequentially accessed within a thread */
|
|
Packit |
0848f5 |
#define MPIUI_THREAD_CS_ENTER_RECURSIVE(lockname, mutex) \
|
|
Packit |
0848f5 |
do { \
|
|
Packit |
0848f5 |
int depth_; \
|
|
Packit |
0848f5 |
MPIU_THREADPRIV_DECL; \
|
|
Packit |
0848f5 |
MPIU_THREADPRIV_GET; \
|
|
Packit |
0848f5 |
\
|
|
Packit |
0848f5 |
MPIU_THREAD_CHECK_BEGIN; \
|
|
Packit |
0848f5 |
depth_ = MPIU_THREADPRIV_FIELD(lock_depth); \
|
|
Packit |
0848f5 |
MPIU_DBG_MSG_S(THREAD, TYPICAL, "recursive locking %s", lockname); \
|
|
Packit |
0848f5 |
if (depth_ == 0) { \
|
|
Packit |
0848f5 |
MPIUI_THREAD_CS_ENTER_NONRECURSIVE(lockname, mutex); \
|
|
Packit |
0848f5 |
} \
|
|
Packit |
0848f5 |
MPIU_THREADPRIV_FIELD(lock_depth) += 1; \
|
|
Packit |
0848f5 |
MPIU_THREAD_CHECK_END; \
|
|
Packit |
0848f5 |
} while (0)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#define MPIUI_THREAD_CS_EXIT_RECURSIVE(lockname, mutex) \
|
|
Packit |
0848f5 |
do { \
|
|
Packit |
0848f5 |
int depth_; \
|
|
Packit |
0848f5 |
MPIU_THREADPRIV_DECL; \
|
|
Packit |
0848f5 |
MPIU_THREADPRIV_GET; \
|
|
Packit |
0848f5 |
\
|
|
Packit |
0848f5 |
MPIU_THREAD_CHECK_BEGIN; \
|
|
Packit |
0848f5 |
depth_ = MPIU_THREADPRIV_FIELD(lock_depth); \
|
|
Packit |
0848f5 |
MPIU_DBG_MSG_S(THREAD, TYPICAL, "recursive unlocking %s", lockname); \
|
|
Packit |
0848f5 |
if (depth_ == 1) { \
|
|
Packit |
0848f5 |
MPIUI_THREAD_CS_EXIT_NONRECURSIVE(lockname, mutex); \
|
|
Packit |
0848f5 |
} \
|
|
Packit |
0848f5 |
MPIU_THREADPRIV_FIELD(lock_depth) -= 1; \
|
|
Packit |
0848f5 |
MPIU_THREAD_CHECK_END; \
|
|
Packit |
0848f5 |
} while (0)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#define MPIUI_THREAD_CS_YIELD_RECURSIVE MPIUI_THREAD_CS_YIELD_NONRECURSIVE
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#define MPIU_THREAD_CS_ENTER(name, mutex) MPIUI_THREAD_CS_ENTER_##name(mutex)
|
|
Packit |
0848f5 |
#define MPIU_THREAD_CS_EXIT(name, mutex) MPIUI_THREAD_CS_EXIT_##name(mutex)
|
|
Packit |
0848f5 |
#define MPIU_THREAD_CS_YIELD(name, mutex) MPIUI_THREAD_CS_YIELD_##name(mutex)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Definitions of the thread support for various levels of thread granularity */
|
|
Packit |
0848f5 |
#if MPICH_THREAD_GRANULARITY == MPICH_THREAD_GRANULARITY_GLOBAL
|
|
Packit |
0848f5 |
#include "mpiu_thread_global.h"
|
|
Packit |
0848f5 |
#elif MPICH_THREAD_GRANULARITY == MPICH_THREAD_GRANULARITY_PER_OBJECT
|
|
Packit |
0848f5 |
#include "mpiu_thread_pobj.h"
|
|
Packit |
0848f5 |
#elif MPICH_THREAD_GRANULARITY == MPICH_THREAD_GRANULARITY_LOCK_FREE
|
|
Packit |
0848f5 |
#error lock-free not yet implemented
|
|
Packit |
0848f5 |
#else
|
|
Packit |
0848f5 |
#error Unrecognized thread granularity
|
|
Packit |
0848f5 |
#endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#endif /* !defined(MPIU_THREAD_MULTIPLE_H_INCLUDED) */
|