|
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_H_INCLUDED)
|
|
Packit |
0848f5 |
#define MPIU_THREAD_H_INCLUDED
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#include "mpi.h"
|
|
Packit |
0848f5 |
#include "mpichconf.h" /* defines MPICH_THREAD_PACKAGE_NAME */
|
|
Packit |
0848f5 |
#include "mpichconfconst.h"
|
|
Packit |
0848f5 |
#include "mpidbg.h"
|
|
Packit |
0848f5 |
#include "mpiassert.h"
|
|
Packit |
0848f5 |
#include "mpiu_strerror.h"
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* FIXME: we should not be including an MPIR-level header here. But
|
|
Packit |
0848f5 |
* the code is currently a rat-hole where the MPIU and MPIR functions
|
|
Packit |
0848f5 |
* are all mixed up. Till that's resolved, adding mpimem.h here as a
|
|
Packit |
0848f5 |
* workaround for using MPIU_Calloc functionality. */
|
|
Packit |
0848f5 |
#include "mpimem.h"
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* _INVALID exists to avoid accidental macro evaluations to 0 */
|
|
Packit |
0848f5 |
#define MPICH_THREAD_PACKAGE_INVALID 0
|
|
Packit |
0848f5 |
#define MPICH_THREAD_PACKAGE_NONE 1
|
|
Packit |
0848f5 |
#define MPICH_THREAD_PACKAGE_POSIX 2
|
|
Packit |
0848f5 |
#define MPICH_THREAD_PACKAGE_SOLARIS 3
|
|
Packit |
0848f5 |
#define MPICH_THREAD_PACKAGE_WIN 4
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#if defined(MPICH_THREAD_PACKAGE_NAME) && (MPICH_THREAD_PACKAGE_NAME == MPICH_THREAD_PACKAGE_POSIX)
|
|
Packit |
0848f5 |
# include "mpiu_thread_posix.h"
|
|
Packit |
0848f5 |
#elif defined(MPICH_THREAD_PACKAGE_NAME) && (MPICH_THREAD_PACKAGE_NAME == MPICH_THREAD_PACKAGE_SOLARIS)
|
|
Packit |
0848f5 |
# include "mpiu_thread_solaris.h"
|
|
Packit |
0848f5 |
#elif defined(MPICH_THREAD_PACKAGE_NAME) && (MPICH_THREAD_PACKAGE_NAME == MPICH_THREAD_PACKAGE_WIN)
|
|
Packit |
0848f5 |
# include "mpiu_thread_win.h"
|
|
Packit |
0848f5 |
#elif defined(MPICH_THREAD_PACKAGE_NAME) && (MPICH_THREAD_PACKAGE_NAME == MPICH_THREAD_PACKAGE_NONE)
|
|
Packit |
0848f5 |
typedef int MPIU_Thread_mutex_t;
|
|
Packit |
0848f5 |
typedef int MPIU_Thread_cond_t;
|
|
Packit |
0848f5 |
typedef int MPIU_Thread_id_t;
|
|
Packit |
0848f5 |
typedef int MPIU_Thread_tls_t;
|
|
Packit |
0848f5 |
typedef void (*MPIU_Thread_func_t) (void *data);
|
|
Packit |
0848f5 |
#define MPIU_Thread_mutex_create(mutex_ptr_, err_ptr_) { *((int*)err_ptr_) = 0;}
|
|
Packit |
0848f5 |
#define MPIU_Thread_mutex_destroy(mutex_ptr_, err_ptr_) { *((int*)err_ptr_) = 0;}
|
|
Packit |
0848f5 |
#else
|
|
Packit |
0848f5 |
# error "thread package not defined or unknown"
|
|
Packit |
0848f5 |
#endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Error values */
|
|
Packit |
0848f5 |
#define MPIU_THREAD_SUCCESS 0
|
|
Packit |
0848f5 |
/* FIXME: Define other error codes. For now, any non-zero value is an error. */
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#if MPICH_THREAD_GRANULARITY == MPICH_THREAD_GRANULARITY_INVALID
|
|
Packit |
0848f5 |
# error Invalid thread granularity option specified (possibly none)
|
|
Packit |
0848f5 |
#elif MPICH_THREAD_GRANULARITY == MPICH_THREAD_GRANULARITY_LOCK_FREE
|
|
Packit |
0848f5 |
# error MPICH_THREAD_GRANULARITY_LOCK_FREE not implemented yet
|
|
Packit |
0848f5 |
#endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
typedef struct {
|
|
Packit |
0848f5 |
int thread_provided; /* Provided level of thread support */
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#if defined(MPICH_IS_THREADED) && !defined(MPICH_TLS_SPECIFIER)
|
|
Packit |
0848f5 |
MPIU_Thread_tls_t thread_storage; /* Id for perthread data */
|
|
Packit |
0848f5 |
#endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* This is a special case for is_thread_main, which must be
|
|
Packit |
0848f5 |
* implemented even if MPICH itself is single threaded. */
|
|
Packit |
0848f5 |
#if MPICH_THREAD_LEVEL >= MPI_THREAD_SERIALIZED
|
|
Packit |
0848f5 |
MPIU_Thread_id_t master_thread; /* Thread that started MPI */
|
|
Packit |
0848f5 |
#endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#if defined MPICH_IS_THREADED
|
|
Packit |
0848f5 |
int isThreaded; /* Set to true if user requested
|
|
Packit |
0848f5 |
* THREAD_MULTIPLE */
|
|
Packit |
0848f5 |
#endif /* MPICH_IS_THREADED */
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* Define the mutex values used for each kind of implementation */
|
|
Packit |
0848f5 |
#if MPICH_THREAD_GRANULARITY == MPICH_THREAD_GRANULARITY_GLOBAL || \
|
|
Packit |
0848f5 |
MPICH_THREAD_GRANULARITY == MPICH_THREAD_GRANULARITY_PER_OBJECT
|
|
Packit |
0848f5 |
MPIU_Thread_mutex_t global_mutex;
|
|
Packit |
0848f5 |
MPIU_Thread_mutex_t memalloc_mutex; /* for MPIU_{Malloc,Free,Calloc} */
|
|
Packit |
0848f5 |
#endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#if MPICH_THREAD_GRANULARITY == MPICH_THREAD_GRANULARITY_PER_OBJECT
|
|
Packit |
0848f5 |
MPIU_Thread_mutex_t handle_mutex;
|
|
Packit |
0848f5 |
MPIU_Thread_mutex_t msgq_mutex;
|
|
Packit |
0848f5 |
MPIU_Thread_mutex_t completion_mutex;
|
|
Packit |
0848f5 |
MPIU_Thread_mutex_t ctx_mutex;
|
|
Packit |
0848f5 |
MPIU_Thread_mutex_t pmi_mutex;
|
|
Packit |
0848f5 |
#endif
|
|
Packit |
0848f5 |
} MPIR_Thread_info_t;
|
|
Packit |
0848f5 |
extern MPIR_Thread_info_t MPIR_ThreadInfo;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#define MPIR_THREAD_GLOBAL_ALLFUNC_MUTEX MPIR_ThreadInfo.global_mutex
|
|
Packit |
0848f5 |
#define MPIR_THREAD_POBJ_HANDLE_MUTEX MPIR_ThreadInfo.handle_mutex
|
|
Packit |
0848f5 |
#define MPIR_THREAD_POBJ_MSGQ_MUTEX MPIR_ThreadInfo.msgq_mutex
|
|
Packit |
0848f5 |
#define MPIR_THREAD_POBJ_COMPLETION_MUTEX MPIR_ThreadInfo.completion_mutex
|
|
Packit |
0848f5 |
#define MPIR_THREAD_POBJ_CTX_MUTEX MPIR_ThreadInfo.ctx_mutex
|
|
Packit |
0848f5 |
#define MPIR_THREAD_POBJ_PMI_MUTEX MPIR_ThreadInfo.pmi_mutex
|
|
Packit |
0848f5 |
#define MPIR_THREAD_ALLGRAN_MEMALLOC_MUTEX MPIR_ThreadInfo.memalloc_mutex
|
|
Packit |
0848f5 |
#define MPIR_THREAD_POBJ_COMM_MUTEX(_comm_ptr) _comm_ptr->mutex
|
|
Packit |
0848f5 |
#define MPIR_THREAD_POBJ_WIN_MUTEX(_win_ptr) _win_ptr->mutex
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* ------------------------------------------------------------------------- */
|
|
Packit |
0848f5 |
/* thread-local storage macros */
|
|
Packit |
0848f5 |
/* moved here from mpiimpl.h because they logically belong here */
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* arbitrary, just needed to avoid cleaning up heap allocated memory at thread
|
|
Packit |
0848f5 |
* destruction time */
|
|
Packit |
0848f5 |
#define MPIU_STRERROR_BUF_SIZE (1024)
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* This structure contains all thread-local variables and will be zeroed at
|
|
Packit |
0848f5 |
* allocation time.
|
|
Packit |
0848f5 |
*
|
|
Packit |
0848f5 |
* Note that any pointers to dynamically allocated memory stored in this
|
|
Packit |
0848f5 |
* structure must be externally cleaned up.
|
|
Packit |
0848f5 |
* */
|
|
Packit |
0848f5 |
typedef struct {
|
|
Packit |
0848f5 |
int op_errno; /* For errors in predefined MPI_Ops */
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
/* error string storage for MPIU_Strerror */
|
|
Packit |
0848f5 |
char strerrbuf[MPIU_STRERROR_BUF_SIZE];
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#if (MPICH_THREAD_LEVEL == MPI_THREAD_MULTIPLE)
|
|
Packit |
0848f5 |
int lock_depth;
|
|
Packit |
0848f5 |
#endif
|
|
Packit |
0848f5 |
} MPIUI_Per_thread_t;
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#if defined (MPICH_IS_THREADED)
|
|
Packit |
0848f5 |
#include "mpiu_thread_multiple.h"
|
|
Packit |
0848f5 |
#else
|
|
Packit |
0848f5 |
#include "mpiu_thread_single.h"
|
|
Packit |
0848f5 |
#endif
|
|
Packit |
0848f5 |
|
|
Packit |
0848f5 |
#endif /* !defined(MPIU_THREAD_H_INCLUDED) */
|