Blame src/util/thread/mpiu_thread_win.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
Packit 0848f5
#ifndef MPIU_THREAD_WIN_H_INCLUDED
Packit 0848f5
#define MPIU_THREAD_WIN_H_INCLUDED
Packit 0848f5
Packit 0848f5
#define WIN32_LEAN_AND_MEAN
Packit 0848f5
Packit 0848f5
#include <windows.h>
Packit 0848f5
Packit 0848f5
typedef HANDLE MPIU_Thread_mutex_t;
Packit 0848f5
typedef HANDLE MPIU_Thread_id_t;
Packit 0848f5
typedef DWORD MPIU_Thread_tls_t;
Packit 0848f5
Packit 0848f5
typedef struct MPIUI_Win_thread_cond_fifo_t {
Packit 0848f5
    HANDLE event;
Packit 0848f5
    struct MPIUI_Win_thread_cond_fifo_t *next;
Packit 0848f5
} MPIUI_Win_thread_cond_fifo_t;
Packit 0848f5
typedef struct MPIU_Thread_cond_t {
Packit 0848f5
    MPIU_Thread_tls_t tls;
Packit 0848f5
    MPIU_Thread_mutex_t fifo_mutex;
Packit 0848f5
    MPIUI_Win_thread_cond_fifo_t *fifo_head, *fifo_tail;
Packit 0848f5
} MPIU_Thread_cond_t;
Packit 0848f5
Packit 0848f5
typedef void (*MPIU_Thread_func_t) (void *data);
Packit 0848f5
Packit 0848f5
void MPIU_Thread_create(MPIU_Thread_func_t func, void *data, MPIU_Thread_id_t * id, int *err);
Packit 0848f5
void MPIU_Thread_exit(void);
Packit 0848f5
void MPIU_Thread_self(MPIU_Thread_id_t * id);
Packit 0848f5
void MPIU_Thread_same(MPIU_Thread_id_t * id1, MPIU_Thread_id_t * id2, int *same);
Packit 0848f5
void MPIU_Thread_yield(void);
Packit 0848f5
Packit 0848f5
void MPIU_Thread_mutex_create(MPIU_Thread_mutex_t * mutex, int *err);
Packit 0848f5
void MPIU_Thread_mutex_destroy(MPIU_Thread_mutex_t * mutex, int *err);
Packit 0848f5
void MPIU_Thread_mutex_lock(MPIU_Thread_mutex_t * mutex, int *err);
Packit 0848f5
void MPIU_Thread_mutex_unlock(MPIU_Thread_mutex_t * mutex, int *err);
Packit 0848f5
Packit 0848f5
void MPIU_Thread_cond_create(MPIU_Thread_cond_t * cond, int *err);
Packit 0848f5
void MPIU_Thread_cond_destroy(MPIU_Thread_cond_t * cond, int *err);
Packit 0848f5
void MPIU_Thread_cond_wait(MPIU_Thread_cond_t * cond, MPIU_Thread_mutex_t * mutex, int *err);
Packit 0848f5
void MPIU_Thread_cond_broadcast(MPIU_Thread_cond_t * cond, int *err);
Packit 0848f5
void MPIU_Thread_cond_signal(MPIU_Thread_cond_t * cond, int *err);
Packit 0848f5
Packit 0848f5
/*
Packit 0848f5
 * Thread Local Storage
Packit 0848f5
 */
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_tls_create(exit_func_ptr_, tls_ptr_, err_ptr_)	\
Packit 0848f5
    do {                                                                \
Packit 0848f5
        *(tls_ptr_) = TlsAlloc();                                       \
Packit 0848f5
        if ((err_ptr_) != NULL) {                                       \
Packit 0848f5
            if (*(tls_ptr_) == TLS_OUT_OF_INDEXES) {                    \
Packit 0848f5
                *(int *)(err_ptr_) = GetLastError();			\
Packit 0848f5
            }								\
Packit 0848f5
            else {                                                      \
Packit 0848f5
                *(int *)(err_ptr_) = MPIU_THREAD_SUCCESS;               \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_tls_destroy(tls_ptr_, err_ptr_)		\
Packit 0848f5
    do {                                                        \
Packit 0848f5
        BOOL result__;                                          \
Packit 0848f5
        result__ = TlsFree(*(tls_ptr_));                        \
Packit 0848f5
        if ((err_ptr_) != NULL) {                               \
Packit 0848f5
            if (result__) {                                     \
Packit 0848f5
                *(int *)(err_ptr_) = MPIU_THREAD_SUCCESS;       \
Packit 0848f5
            }                                                   \
Packit 0848f5
            else {                                              \
Packit 0848f5
                *(int *)(err_ptr_) = GetLastError();		\
Packit 0848f5
            }							\
Packit 0848f5
        }                                                       \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_tls_set(tls_ptr_, value_, err_ptr_)		\
Packit 0848f5
    do {                                                        \
Packit 0848f5
        BOOL result__;                                          \
Packit 0848f5
        result__ = TlsSetValue(*(tls_ptr_), (value_));		\
Packit 0848f5
        if ((err_ptr_) != NULL) {                               \
Packit 0848f5
            if (result__) {                                     \
Packit 0848f5
                *(int *)(err_ptr_) = MPIU_THREAD_SUCCESS;       \
Packit 0848f5
            }                                                   \
Packit 0848f5
            else {                                              \
Packit 0848f5
                *(int *)(err_ptr_) = GetLastError();		\
Packit 0848f5
            }							\
Packit 0848f5
        }                                                       \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#define MPIU_Thread_tls_get(tls_ptr_, value_ptr_, err_ptr_)             \
Packit 0848f5
    do {								\
Packit 0848f5
        *((void **)value_ptr_) = TlsGetValue(*(tls_ptr_));              \
Packit 0848f5
        if ((err_ptr_) != NULL) {                                       \
Packit 0848f5
            if (*(value_ptr_) == 0 && GetLastError() != NO_ERROR) {     \
Packit 0848f5
                *(int *)(err_ptr_) = GetLastError();                    \
Packit 0848f5
            }                                                           \
Packit 0848f5
            else {                                                      \
Packit 0848f5
                *(int *)(err_ptr_) = MPIU_THREAD_SUCCESS;               \
Packit 0848f5
            }                                                           \
Packit 0848f5
        }                                                               \
Packit 0848f5
    } while (0)
Packit 0848f5
Packit 0848f5
#endif /* MPIU_THREAD_WIN_H_INCLUDED */