Blame src/util/thread/mpiu_thread_multiple.h

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) */