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