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