Blame src/util/thread/mpiu_thread_solaris.h

Packit 0848f5
/* -*- Mode: C; c-basic-offset:4 ; indent-tabs-mode:nil ; -*- */
Packit 0848f5
/*
Packit 0848f5
 *
Packit 0848f5
 *  (C) 2001 by Argonne National Laboratory.
Packit 0848f5
 *      See COPYRIGHT in top-level directory.
Packit 0848f5
 */
Packit 0848f5
#ifndef MPIU_THREAD_SOLARIS_H_INCLUDED
Packit 0848f5
#define MPIU_THREAD_SOLARIS_H_INCLUDED
Packit 0848f5
Packit 0848f5
#include <thread.h>
Packit 0848f5
#include <synch.h>
Packit 0848f5
Packit 0848f5
typedef mutex_t MPIU_Thread_mutex_t;
Packit 0848f5
typedef cond_t MPIU_Thread_cond_t;
Packit 0848f5
typedef thread_t MPIU_Thread_id_t;
Packit 0848f5
Packit 0848f5
typedef void (*MPIU_Thread_func_t) (void *data);
Packit 0848f5
void MPIU_Thread_create(MPIU_Thread_func_t func, void *data, MPIU_Thread_id_t * id, int *err);
Packit 0848f5
Packit 0848f5
/*
Packit 0848f5
 * Threads
Packit 0848f5
 */
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_exit()			\
Packit 0848f5
    do {                                        \
Packit 0848f5
        thr_exit(NULL);				\
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_self(id_ptr_)		\
Packit 0848f5
    do {                                        \
Packit 0848f5
        *(id_ptr_) = thr_self();                \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_same(id1_ptr_, id2_ptr_, same_ptr_)                 \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        *(same_ptr_) = (*(id1_ptr_) == *(id2_ptr_)) ? TRUE : FALSE;     \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_yield(mutex_ptr_)                   \
Packit 0848f5
    do {                                                \
Packit 0848f5
        int err;                                        \
Packit 0848f5
        MPIU_Thread_mutex_unlock(mutex_ptr_, &err;;     \
Packit 0848f5
        thr_yield();                                    \
Packit 0848f5
        MPIU_Thread_mutex_lock(mutex_ptr_, &err;;       \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
Packit 0848f5
/*
Packit 0848f5
 *    Mutexes
Packit 0848f5
 */
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_mutex_create(mutex_ptr_, err_ptr_)	\
Packit 0848f5
    do {                                                \
Packit 0848f5
        *(mutex_ptr_) = DEFAULTMUTEX;			\
Packit 0848f5
        if ((err_ptr_) == NULL) {                       \
Packit 0848f5
            *(err_ptr_) = MPIU_THREAD_SUCCESS;		\
Packit 0848f5
        }                                               \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_mutex_destroy(mutex_ptr_, err_ptr_)                 \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        if ((err_ptr_) == NULL) {                                       \
Packit 0848f5
            mutex_destroy(mutex_ptr_);                                  \
Packit 0848f5
        }								\
Packit 0848f5
        else {                                                          \
Packit 0848f5
            *(err_ptr_) = mutex_destroy(mutex_ptr_);                    \
Packit 0848f5
            /* FIXME: convert error to an MPIU_THREAD_ERR value */	\
Packit 0848f5
        }								\
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_mutex_lock(mutex_ptr_, err_ptr_)                    \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        if ((err_ptr_) == NULL) {                                       \
Packit 0848f5
            mutex_lock(mutex_ptr_);					\
Packit 0848f5
        }								\
Packit 0848f5
        else {                                                          \
Packit 0848f5
            *(err_ptr_) = mutex_lock(mutex_ptr_);			\
Packit 0848f5
            /* FIXME: convert error to an MPIU_THREAD_ERR value */	\
Packit 0848f5
        }								\
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_mutex_unlock(mutex_ptr_, err_ptr_)                  \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        if ((err_ptr_) == NULL) {                                       \
Packit 0848f5
            mutex_unlock(mutex_ptr_);                                   \
Packit 0848f5
        }								\
Packit 0848f5
        else {                                                          \
Packit 0848f5
            *(err_ptr_) = mutex_unlock(mutex_ptr_);			\
Packit 0848f5
            /* FIXME: convert error to an MPIU_THREAD_ERR value */	\
Packit 0848f5
        }								\
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
Packit 0848f5
/*
Packit 0848f5
 * Condition Variables
Packit 0848f5
 */
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_cond_create(cond_ptr_, err_ptr_)	\
Packit 0848f5
    do {                                                \
Packit 0848f5
        *(cond_ptr_) = DEFAULTCV;                       \
Packit 0848f5
        if ((err_ptr_) == NULL) {                       \
Packit 0848f5
            *(err_ptr_) = MPIU_THREAD_SUCCESS;		\
Packit 0848f5
        }                                               \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_cond_destroy(cond_ptr_, err_ptr_)                   \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        if ((err_ptr_) == NULL) {                                       \
Packit 0848f5
            cond_destroy(cond_ptr_);                                    \
Packit 0848f5
        }								\
Packit 0848f5
        else {                                                          \
Packit 0848f5
            *(err_ptr_) = cond_destroy(cond_ptr_);			\
Packit 0848f5
            /* FIXME: convert error to a MPIU_THREAD_ERR value */	\
Packit 0848f5
        }								\
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_cond_wait(cond_ptr_, mutex_ptr_, err_ptr_)          \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        if ((err_ptr_) == NULL) {                                       \
Packit 0848f5
            cond_wait((cond_ptr_), (mutex_ptr_));			\
Packit 0848f5
        }								\
Packit 0848f5
        else {                                                          \
Packit 0848f5
            *(err_ptr_) = cond_wait((cond_ptr_), (mutex_ptr_));         \
Packit 0848f5
            /* FIXME: convert error to a MPIU_THREAD_ERR value */	\
Packit 0848f5
        }								\
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_cond_broadcast(cond_ptr_, err_ptr_)                 \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        if ((err_ptr_) == NULL) {                                       \
Packit 0848f5
            cond_broadcast(cond_ptr_);                                  \
Packit 0848f5
        }								\
Packit 0848f5
        else {                                                          \
Packit 0848f5
            *(err_ptr_) = cond_broadcast(cond_ptr_);                    \
Packit 0848f5
            /* FIXME: convert error to a MPIU_THREAD_ERR value */	\
Packit 0848f5
        }								\
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_cond_signal(cond_ptr_, err_ptr_)                    \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        if ((err_ptr_) == NULL) {                                       \
Packit 0848f5
            cond_signal(cond_ptr_);					\
Packit 0848f5
        }								\
Packit 0848f5
        else {                                                          \
Packit 0848f5
            *(err_ptr_) = cond_signal(cond_ptr_);			\
Packit 0848f5
            /* FIXME: convert error to a MPIU_THREAD_ERR value */	\
Packit 0848f5
        }								\
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
Packit 0848f5
/*
Packit 0848f5
 * Thread Local Storage
Packit 0848f5
 */
Packit 0848f5
#define MPIU_Thread_tls_create(exit_func_ptr_, tls_ptr_, err_ptr_)	\
Packit 0848f5
    do {                                                                \
Packit 0848f5
        if ((err_ptr_) == NULL) {                                       \
Packit 0848f5
            thr_keycreate((tls_ptr), (exit_func_ptr));			\
Packit 0848f5
        }                                                               \
Packit 0848f5
        else {								\
Packit 0848f5
            *(err_ptr_) = thr_keycreate((tls_ptr), (exit_func_ptr));	\
Packit 0848f5
            /* FIXME: convert error to a MPIU_THREAD_ERR value */       \
Packit 0848f5
        }                                                               \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_tls_destroy(tls_ptr_, err_ptr_)                     \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        /*                                                              \
Packit 0848f5
         * FIXME: Solaris threads does not have a key destroy.  We      \
Packit 0848f5
         * need to create equivalent functionality to prevent a         \
Packit 0848f5
         * callback from occuring when a thread exits after the TLS is  \
Packit 0848f5
         * destroyed.  This is the only way to prevent subsystems that  \
Packit 0848f5
         * have shutdown from continuing to receive callbacks.          \
Packit 0848f5
         */                                                             \
Packit 0848f5
        if ((err_ptr_) != NULL) {                                       \
Packit 0848f5
            *(err_ptr) = MPIU_THREAD_SUCCESS;                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_tls_set(tls_ptr, value_)                            \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        if ((err_ptr_) == NULL) {                                       \
Packit 0848f5
            thr_setspecific(*(tls_ptr), (value_));			\
Packit 0848f5
        }								\
Packit 0848f5
        else {                                                          \
Packit 0848f5
            *(err_ptr_) = thr_setspecific(*(tls_ptr), (value_));	\
Packit 0848f5
            /* FIXME: convert error to a MPIU_THREAD_ERR value */	\
Packit 0848f5
        }								\
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_tls_get(tls_ptr, value_ptr_)                        \
Packit 0848f5
    do {                                                                \
Packit 0848f5
        if ((err_ptr_) == NULL) {                                       \
Packit 0848f5
            thr_setspecific(*(tls_ptr), (value_ptr_));			\
Packit 0848f5
        }                                                               \
Packit 0848f5
        else {								\
Packit 0848f5
            *(err_ptr_) = thr_setspecific(*(tls_ptr), (value_ptr_));	\
Packit 0848f5
            /* FIXME: convert error to a MPIU_THREAD_ERR value */       \
Packit 0848f5
        }                                                               \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#endif /* MPIU_THREAD_SOLARIS_H_INCLUDED */