Blame src/mpi/romio/mpl/include/mpl_thread_argobots.h

Packit Service c5cf8c
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit Service c5cf8c
/*
Packit Service c5cf8c
 *  (C) 2017 by Argonne National Laboratory.
Packit Service c5cf8c
 *      See COPYRIGHT in top-level directory.
Packit Service c5cf8c
 */
Packit Service c5cf8c
Packit Service c5cf8c
/* This file is used when configured with (MPICH_THREAD_PACKAGE_NAME ==
Packit Service c5cf8c
 * MPICH_THREAD_PACKAGE_ARGOBOTS) */
Packit Service c5cf8c
Packit Service c5cf8c
#ifndef MPL_THREAD_ARGOBOTS_H_INCLUDED
Packit Service c5cf8c
#define MPL_THREAD_ARGOBOTS_H_INCLUDED
Packit Service c5cf8c
Packit Service c5cf8c
#include "mpl.h"
Packit Service c5cf8c
#include "abt.h"
Packit Service c5cf8c
Packit Service c5cf8c
#include <errno.h>
Packit Service c5cf8c
Packit Service c5cf8c
typedef ABT_mutex MPL_thread_mutex_t;
Packit Service c5cf8c
typedef ABT_cond MPL_thread_cond_t;
Packit Service c5cf8c
typedef ABT_thread_id MPL_thread_id_t;
Packit Service c5cf8c
typedef ABT_key MPL_thread_tls_t;
Packit Service c5cf8c
Packit Service c5cf8c
/* ======================================================================
Packit Service c5cf8c
 *    Creation and misc
Packit Service c5cf8c
 * ======================================================================*/
Packit Service c5cf8c
Packit Service c5cf8c
/* MPL_thread_create() defined in mpiu_thread_argobots.c */
Packit Service c5cf8c
typedef void (*MPL_thread_func_t) (void *data);
Packit Service c5cf8c
void MPL_thread_create(MPL_thread_func_t func, void *data, MPL_thread_id_t * idp, int *errp);
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_exit()
Packit Service c5cf8c
#define MPL_thread_self(id_) ABT_thread_self_id(id_)
Packit Service c5cf8c
#define MPL_thread_same(id1_, id2_, same_)  ABT_thread_equal(id1_, id2_, same_)
Packit Service c5cf8c
Packit Service c5cf8c
/* ======================================================================
Packit Service c5cf8c
 *    Scheduling
Packit Service c5cf8c
 * ======================================================================*/
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_yield ABT_thread_yield
Packit Service c5cf8c
Packit Service c5cf8c
/* ======================================================================
Packit Service c5cf8c
 *    Mutexes
Packit Service c5cf8c
 * ======================================================================*/
Packit Service c5cf8c
#define MPL_thread_mutex_create(mutex_ptr_, err_ptr_)                         \
Packit Service c5cf8c
    do {                                                                      \
Packit Service c5cf8c
        int err__;                                                            \
Packit Service c5cf8c
        err__ = ABT_mutex_create(mutex_ptr_);                                 \
Packit Service c5cf8c
        if (unlikely(err__))                                                  \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_mutex_create", err__,          \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_mutex_destroy(mutex_ptr_, err_ptr_)                        \
Packit Service c5cf8c
    do {                                                                      \
Packit Service c5cf8c
        int err__;                                                            \
Packit Service c5cf8c
        err__ = ABT_mutex_free(mutex_ptr_);                                   \
Packit Service c5cf8c
        if (unlikely(err__))                                                  \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_mutex_free", err__,            \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_mutex_lock(mutex_ptr_, err_ptr_)                           \
Packit Service c5cf8c
    do {                                                                      \
Packit Service c5cf8c
        int err__;                                                            \
Packit Service c5cf8c
        err__ = ABT_mutex_lock(*mutex_ptr_);                                  \
Packit Service c5cf8c
        if (unlikely(err__))                                                  \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_mutex_lock", err__,            \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_mutex_trylock(mutex_ptr_, err_ptr_, cs_acq_ptr)      \
Packit Service c5cf8c
    do {                                                                \
Packit Service c5cf8c
        int err__;                                                      \
Packit Service c5cf8c
        *(int*)cs_acq_ptr = 1;                                          \
Packit Service c5cf8c
        err__ = ABT_mutex_trylock(mutex_ptr_);                          \
Packit Service c5cf8c
        if (unlikely(err__ != ABT_SUCCESS && err__ != ABT_ERR_MUTEX_LOCKED)) { \
Packit Service c5cf8c
            *(int*)cs_acq_ptr = 0;                                      \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_mutex_trylock", err__,   \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        }                                                               \
Packit Service c5cf8c
        else {                                                          \
Packit Service c5cf8c
            if (unlikely(err__ != 0))                                   \
Packit Service c5cf8c
                *(int*)cs_acq_ptr = 0;                                  \
Packit Service c5cf8c
             err__ = 0;                                                 \
Packit Service c5cf8c
        }                                                               \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                     \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_mutex_lock_low(mutex_ptr_, err_ptr_)                       \
Packit Service c5cf8c
    do {                                                                      \
Packit Service c5cf8c
        int err__;                                                            \
Packit Service c5cf8c
        err__ = ABT_mutex_lock_low(*mutex_ptr_);                              \
Packit Service c5cf8c
        if (unlikely(err__))                                                  \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_mutex_lock_low", err__,        \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_mutex_unlock(mutex_ptr_, err_ptr_)                         \
Packit Service c5cf8c
    do {                                                                      \
Packit Service c5cf8c
        int err__;                                                            \
Packit Service c5cf8c
        err__ = ABT_mutex_unlock(*mutex_ptr_);                                \
Packit Service c5cf8c
        if (unlikely(err__))                                                  \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_mutex_unlock", err__,          \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_mutex_unlock_se(mutex_ptr_, err_ptr_)                      \
Packit Service c5cf8c
    do {                                                                      \
Packit Service c5cf8c
        int err__;                                                            \
Packit Service c5cf8c
        err__ = ABT_mutex_unlock_se(*mutex_ptr_);                             \
Packit Service c5cf8c
        if (unlikely(err__))                                                  \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_mutex_unlock_se", err__,       \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
/* ======================================================================
Packit Service c5cf8c
 *    Condition Variables
Packit Service c5cf8c
 * ======================================================================*/
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_cond_create(cond_ptr_, err_ptr_)                           \
Packit Service c5cf8c
    do {                                                                      \
Packit Service c5cf8c
        int err__;                                                            \
Packit Service c5cf8c
        err__ = ABT_cond_create((cond_ptr_));                                 \
Packit Service c5cf8c
        if (unlikely(err__))                                                  \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_cond_create", err__,           \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_cond_destroy(cond_ptr_, err_ptr_)                          \
Packit Service c5cf8c
    do {                                                                      \
Packit Service c5cf8c
        int err__;                                                            \
Packit Service c5cf8c
        err__ = ABT_cond_free(cond_ptr_);                                     \
Packit Service c5cf8c
        if (unlikely(err__))                                                  \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_cond_free", err__,             \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_cond_wait(cond_ptr_, mutex_ptr_, err_ptr_)                   \
Packit Service c5cf8c
    do {                                                                        \
Packit Service c5cf8c
        int err__;                                                              \
Packit Service c5cf8c
        MPL_DBG_MSG_FMT(THREAD,TYPICAL,                                         \
Packit Service c5cf8c
                        (MPL_DBG_FDEST,                                         \
Packit Service c5cf8c
                         "Enter cond_wait on cond=%p mutex=%p",                 \
Packit Service c5cf8c
                         (cond_ptr_),(mutex_ptr_)));                            \
Packit Service c5cf8c
        do {                                                                    \
Packit Service c5cf8c
            err__ = ABT_cond_wait((*cond_ptr_), *mutex_ptr_);                   \
Packit Service c5cf8c
        } while (err__ == EINTR);                                               \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                             \
Packit Service c5cf8c
        if (unlikely(err__))                                                    \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_cond_free", err__,                 \
Packit Service c5cf8c
                   "    %s:%d error in cond_wait on cond=%p mutex=%p err__=%d", \
Packit Service c5cf8c
                   __FILE__, __LINE__);       \
Packit Service c5cf8c
        MPL_DBG_MSG_FMT(THREAD,TYPICAL,(MPL_DBG_FDEST,                          \
Packit Service c5cf8c
                                        "Exit cond_wait on cond=%p mutex=%p",   \
Packit Service c5cf8c
                                        (cond_ptr_),(mutex_ptr_)));             \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_cond_broadcast(cond_ptr_, err_ptr_)                        \
Packit Service c5cf8c
    do {                                                                      \
Packit Service c5cf8c
        int err__;                                                            \
Packit Service c5cf8c
        MPL_DBG_MSG_P(THREAD,TYPICAL,                                         \
Packit Service c5cf8c
                      "About to cond_broadcast on MPL_thread_cond %p",        \
Packit Service c5cf8c
                      (cond_ptr_));                                           \
Packit Service c5cf8c
        err__ = ABT_cond_broadcast((*cond_ptr_));                             \
Packit Service c5cf8c
        if (unlikely(err__))                                                  \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_cond_broadcast", err__,        \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_cond_signal(cond_ptr_, err_ptr_)                           \
Packit Service c5cf8c
    do {                                                                      \
Packit Service c5cf8c
        int err__;                                                            \
Packit Service c5cf8c
        MPL_DBG_MSG_P(THREAD,TYPICAL,                                         \
Packit Service c5cf8c
                      "About to cond_signal on MPL_thread_cond %p",           \
Packit Service c5cf8c
                      (cond_ptr_));                                           \
Packit Service c5cf8c
        err__ = ABT_cond_signal((*cond_ptr_));                                \
Packit Service c5cf8c
        if (unlikely(err__))                                                  \
Packit Service c5cf8c
            MPL_internal_sys_error_printf("ABT_cond_signal", err__,           \
Packit Service c5cf8c
                                          "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
/* ======================================================================
Packit Service c5cf8c
 *    Thread Local Storage
Packit Service c5cf8c
 * ======================================================================*/
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_tls_create(exit_func_ptr_, tls_ptr_, err_ptr_)         \
Packit Service c5cf8c
    do {                                                                  \
Packit Service c5cf8c
        int err__;                                                        \
Packit Service c5cf8c
        err__ = ABT_key_create((exit_func_ptr_), (tls_ptr_));             \
Packit Service c5cf8c
        if (unlikely(err__))                                              \
Packit Service c5cf8c
        MPL_internal_sys_error_printf("ABT_key_create", err__,            \
Packit Service c5cf8c
                                      "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = 0;                                           \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_tls_destroy(tls_ptr_, err_ptr_)                        \
Packit Service c5cf8c
    do {                                                                  \
Packit Service c5cf8c
        int err__;                                                        \
Packit Service c5cf8c
        err__ = ABT_key_free(tls_ptr_);                                   \
Packit Service c5cf8c
        if (unlikely(err__))                                              \
Packit Service c5cf8c
        MPL_internal_sys_error_printf("ABT_key_free", err__,              \
Packit Service c5cf8c
                                      "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                       \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_tls_set(tls_ptr_, value_, err_ptr_)                    \
Packit Service c5cf8c
    do {                                                                  \
Packit Service c5cf8c
        int err__;                                                        \
Packit Service c5cf8c
        err__ = ABT_key_set(*(tls_ptr_), (value_));                       \
Packit Service c5cf8c
        if (unlikely(err__))                                              \
Packit Service c5cf8c
        MPL_internal_sys_error_printf("ABT_key_set", err__,               \
Packit Service c5cf8c
                                      "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                       \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#define MPL_thread_tls_get(tls_ptr_, value_ptr_, err_ptr_)                \
Packit Service c5cf8c
    do {                                                                  \
Packit Service c5cf8c
        int err__;                                                        \
Packit Service c5cf8c
        err__ = ABT_key_get(*(tls_ptr_), (value_ptr_));                   \
Packit Service c5cf8c
        if (unlikely(err__))                                              \
Packit Service c5cf8c
        MPL_internal_sys_error_printf("ABT_key_get", err__,               \
Packit Service c5cf8c
                                      "    %s:%d\n", __FILE__, __LINE__); \
Packit Service c5cf8c
        *(int *)(err_ptr_) = err__;                                       \
Packit Service c5cf8c
    } while (0)
Packit Service c5cf8c
Packit Service c5cf8c
#endif /* MPL_THREAD_ARGOBOTS_H_INCLUDED */