1
1
openmpi/orte/threads/threads.h
Ralph Castain 09f02b3087 Update the ORTE thread acquire/release/wakeup macros to trigger release from event_loop so that conditions can be checked.
Add macro versions of condition_wait and friends for debug use.

This commit was SVN r24115.
2010-11-30 17:27:58 +00:00

136 строки
6.2 KiB
C

/*
* Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana
* University Research and Technology
* Corporation. All rights reserved.
* Copyright (c) 2004-2006 The University of Tennessee and The University
* of Tennessee Research Foundation. All rights
* reserved.
* Copyright (c) 2004-2005 High Performance Computing Center Stuttgart,
* University of Stuttgart. All rights reserved.
* Copyright (c) 2004-2005 The Regents of the University of California.
* All rights reserved.
* Copyright (c) 2010 Cisco Systems, Inc. All rights reserved.
* $COPYRIGHT$
*
* Additional copyrights may follow
*
* $HEADER$
*/
#ifndef ORTE_THREAD_H
#define ORTE_THREAD_H
#include "orte_config.h"
#include "opal/class/opal_object.h"
#if OPAL_ENABLE_DEBUG
#include "opal/util/output.h"
#endif
#include "opal/util/fd.h"
#include "opal/mca/event/event.h"
#include "mutex.h"
#include "condition.h"
BEGIN_C_DECLS
typedef struct {
opal_object_t super;
opal_mutex_t lock;
opal_condition_t cond;
volatile bool active;
volatile bool running;
volatile bool stop;
int wakeup_pipe;
char *name;
} orte_thread_ctl_t;
ORTE_DECLSPEC OBJ_CLASS_DECLARATION(orte_thread_ctl_t);
#if OPAL_ENABLE_DEBUG
#define ORTE_ACQUIRE_THREAD(ctl) \
do { \
ORTE_THREAD_LOCK(&(ctl)->lock); \
if (opal_debug_threads) { \
opal_output(0, "Waiting for thread %s at %s:%d:%s", \
(NULL == (ctl)->name) ? "NULL" : (ctl)->name, \
__FILE__, __LINE__, \
((ctl)->active) ? "TRUE" : "FALSE"); \
} \
while ((ctl)->active) { \
ORTE_CONDITION_WAIT(&(ctl)->cond, &(ctl)->lock); \
} \
if (opal_debug_threads) { \
opal_output(0, "Thread %s acquired at %s:%d", \
(NULL == (ctl)->name) ? "NULL" : (ctl)->name, \
__FILE__, __LINE__); \
} \
(ctl)->active = true; \
} while(0);
#else
#define ORTE_ACQUIRE_THREAD(ctl) \
do { \
ORTE_THREAD_LOCK(&(ctl)->lock); \
while ((ctl)->active) { \
ORTE_CONDITION_WAIT(&(ctl)->cond, &(ctl)->lock); \
} \
(ctl)->active = true; \
} while(0);
#endif
#if OPAL_ENABLE_DEBUG
#define ORTE_RELEASE_THREAD(ctl) \
do { \
char byte='a'; \
if (opal_debug_threads) { \
opal_output(0, "Releasing thread %s at %s:%d", \
(NULL == (ctl)->name) ? "NULL" : (ctl)->name, \
__FILE__, __LINE__); \
} \
(ctl)->active = false; \
ORTE_CONDITION_BROADCAST(&(ctl)->cond); \
opal_fd_write((ctl)->wakeup_pipe, 1, &byte); \
ORTE_THREAD_UNLOCK(&(ctl)->lock); \
} while(0);
#else
#define ORTE_RELEASE_THREAD(ctl) \
do { \
char byte='a'; \
(ctl)->active = false; \
ORTE_CONDITION_BROADCAST(&(ctl)->cond); \
opal_fd_write((ctl)->wakeup_pipe, 1, &byte); \
ORTE_THREAD_UNLOCK(&(ctl)->lock); \
} while(0);
#endif
#if OPAL_ENABLE_DEBUG
#define ORTE_WAKEUP_THREAD(ctl) \
do { \
char byte='a'; \
ORTE_THREAD_LOCK(&(ctl)->lock); \
if (opal_debug_threads) { \
opal_output(0, "Waking up thread %s at %s:%d", \
(NULL == (ctl)->name) ? "NULL" : (ctl)->name, \
__FILE__, __LINE__); \
} \
(ctl)->active = false; \
ORTE_CONDITION_BROADCAST(&(ctl)->cond); \
opal_fd_write((ctl)->wakeup_pipe, 1, &byte); \
ORTE_THREAD_UNLOCK(&(ctl)->lock); \
} while(0);
#else
#define ORTE_WAKEUP_THREAD(ctl) \
do { \
char byte='a'; \
ORTE_THREAD_LOCK(&(ctl)->lock); \
(ctl)->active = false; \
ORTE_CONDITION_BROADCAST(&(ctl)->cond); \
opal_fd_write((ctl)->wakeup_pipe, 1, &byte); \
ORTE_THREAD_UNLOCK(&(ctl)->lock); \
} while(0);
#endif
END_C_DECLS
#endif /* ORTE_THREAD_H */