Add a suffix to the opal_output stream descriptor object - we can now output both a prefix and a suffix for a given stream. Default the suffix to NULL.
Remove lingering references to a filtering system as this will no longer be implemented. This commit was SVN r18586.
Этот коммит содержится в:
родитель
91a281080a
Коммит
ca91ec525b
@ -68,6 +68,9 @@ typedef struct {
|
|||||||
char *ldi_prefix;
|
char *ldi_prefix;
|
||||||
int ldi_prefix_len;
|
int ldi_prefix_len;
|
||||||
|
|
||||||
|
char *ldi_suffix;
|
||||||
|
int ldi_suffix_len;
|
||||||
|
|
||||||
bool ldi_stdout;
|
bool ldi_stdout;
|
||||||
bool ldi_stderr;
|
bool ldi_stderr;
|
||||||
|
|
||||||
@ -76,8 +79,6 @@ typedef struct {
|
|||||||
char *ldi_file_suffix;
|
char *ldi_file_suffix;
|
||||||
int ldi_fd;
|
int ldi_fd;
|
||||||
int ldi_file_num_lines_lost;
|
int ldi_file_num_lines_lost;
|
||||||
|
|
||||||
int ldi_filter_flags;
|
|
||||||
} output_desc_t;
|
} output_desc_t;
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -92,7 +93,7 @@ static int make_string(char **no_newline_string, output_desc_t *ldi,
|
|||||||
static int output(int output_id, const char *format, va_list arglist);
|
static int output(int output_id, const char *format, va_list arglist);
|
||||||
|
|
||||||
|
|
||||||
#define OPAL_OUTPUT_MAX_STREAMS 32
|
#define OPAL_OUTPUT_MAX_STREAMS 64
|
||||||
#if defined(__WINDOWS__) || defined(HAVE_SYSLOG)
|
#if defined(__WINDOWS__) || defined(HAVE_SYSLOG)
|
||||||
#define USE_SYSLOG 1
|
#define USE_SYSLOG 1
|
||||||
#else
|
#else
|
||||||
@ -145,8 +146,6 @@ bool opal_output_init(void)
|
|||||||
info[i].ldi_file_want_append = false;
|
info[i].ldi_file_want_append = false;
|
||||||
info[i].ldi_fd = -1;
|
info[i].ldi_fd = -1;
|
||||||
info[i].ldi_file_num_lines_lost = 0;
|
info[i].ldi_file_num_lines_lost = 0;
|
||||||
info[i].ldi_filter_flags =
|
|
||||||
OPAL_OUTPUT_FILTER_STDOUT | OPAL_OUTPUT_FILTER_STDERR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Initialize the mutex that protects the output */
|
/* Initialize the mutex that protects the output */
|
||||||
@ -235,13 +234,13 @@ void opal_output_reopen_all(void)
|
|||||||
lds.lds_want_syslog = false;
|
lds.lds_want_syslog = false;
|
||||||
#endif
|
#endif
|
||||||
lds.lds_prefix = info[i].ldi_prefix;
|
lds.lds_prefix = info[i].ldi_prefix;
|
||||||
|
lds.lds_suffix = info[i].ldi_suffix;
|
||||||
lds.lds_want_stdout = info[i].ldi_stdout;
|
lds.lds_want_stdout = info[i].ldi_stdout;
|
||||||
lds.lds_want_stderr = info[i].ldi_stderr;
|
lds.lds_want_stderr = info[i].ldi_stderr;
|
||||||
lds.lds_want_file = (-1 == info[i].ldi_fd) ? false : true;
|
lds.lds_want_file = (-1 == info[i].ldi_fd) ? false : true;
|
||||||
/* open all streams in append mode */
|
/* open all streams in append mode */
|
||||||
lds.lds_want_file_append = true;
|
lds.lds_want_file_append = true;
|
||||||
lds.lds_file_suffix = info[i].ldi_file_suffix;
|
lds.lds_file_suffix = info[i].ldi_file_suffix;
|
||||||
lds.lds_filter_flags = info[i].ldi_filter_flags;
|
|
||||||
|
|
||||||
/*
|
/*
|
||||||
* call opal_output_open to open the stream. The return value
|
* call opal_output_open to open the stream. The return value
|
||||||
@ -460,6 +459,7 @@ static void construct(opal_object_t *obj)
|
|||||||
stream->lds_syslog_priority = 0;
|
stream->lds_syslog_priority = 0;
|
||||||
stream->lds_syslog_ident = NULL;
|
stream->lds_syslog_ident = NULL;
|
||||||
stream->lds_prefix = NULL;
|
stream->lds_prefix = NULL;
|
||||||
|
stream->lds_suffix = NULL;
|
||||||
stream->lds_is_debugging = false;
|
stream->lds_is_debugging = false;
|
||||||
stream->lds_want_syslog = false;
|
stream->lds_want_syslog = false;
|
||||||
stream->lds_want_stdout = false;
|
stream->lds_want_stdout = false;
|
||||||
@ -467,8 +467,6 @@ static void construct(opal_object_t *obj)
|
|||||||
stream->lds_want_file = false;
|
stream->lds_want_file = false;
|
||||||
stream->lds_want_file_append = false;
|
stream->lds_want_file_append = false;
|
||||||
stream->lds_file_suffix = NULL;
|
stream->lds_file_suffix = NULL;
|
||||||
stream->lds_filter_flags =
|
|
||||||
OPAL_OUTPUT_FILTER_STDOUT | OPAL_OUTPUT_FILTER_STDERR;
|
|
||||||
}
|
}
|
||||||
|
|
||||||
/*
|
/*
|
||||||
@ -562,6 +560,14 @@ static int do_open(int output_id, opal_output_stream_t * lds)
|
|||||||
info[i].ldi_prefix_len = 0;
|
info[i].ldi_prefix_len = 0;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
if (NULL != lds->lds_suffix) {
|
||||||
|
info[i].ldi_suffix = strdup(lds->lds_suffix);
|
||||||
|
info[i].ldi_suffix_len = (int)strlen(lds->lds_suffix);
|
||||||
|
} else {
|
||||||
|
info[i].ldi_suffix = NULL;
|
||||||
|
info[i].ldi_suffix_len = 0;
|
||||||
|
}
|
||||||
|
|
||||||
info[i].ldi_stdout = lds->lds_want_stdout;
|
info[i].ldi_stdout = lds->lds_want_stdout;
|
||||||
info[i].ldi_stderr = lds->lds_want_stderr;
|
info[i].ldi_stderr = lds->lds_want_stderr;
|
||||||
|
|
||||||
@ -572,8 +578,6 @@ static int do_open(int output_id, opal_output_stream_t * lds)
|
|||||||
info[i].ldi_file_want_append = lds->lds_want_file_append;
|
info[i].ldi_file_want_append = lds->lds_want_file_append;
|
||||||
info[i].ldi_file_num_lines_lost = 0;
|
info[i].ldi_file_num_lines_lost = 0;
|
||||||
|
|
||||||
info[i].ldi_filter_flags = lds->lds_filter_flags;
|
|
||||||
|
|
||||||
/* Don't open a file in the session directory now -- do that lazily
|
/* Don't open a file in the session directory now -- do that lazily
|
||||||
* so that if there's no output, we don't have an empty file */
|
* so that if there's no output, we don't have an empty file */
|
||||||
|
|
||||||
@ -658,7 +662,12 @@ static void free_descriptor(int output_id)
|
|||||||
}
|
}
|
||||||
ldi->ldi_prefix = NULL;
|
ldi->ldi_prefix = NULL;
|
||||||
|
|
||||||
if (NULL != ldi->ldi_file_suffix) {
|
if (NULL != ldi->ldi_suffix) {
|
||||||
|
free(ldi->ldi_suffix);
|
||||||
|
}
|
||||||
|
ldi->ldi_suffix = NULL;
|
||||||
|
|
||||||
|
if (NULL != ldi->ldi_file_suffix) {
|
||||||
free(ldi->ldi_file_suffix);
|
free(ldi->ldi_file_suffix);
|
||||||
}
|
}
|
||||||
ldi->ldi_file_suffix = NULL;
|
ldi->ldi_file_suffix = NULL;
|
||||||
@ -686,10 +695,22 @@ static int make_string(char **no_newline_string, output_desc_t *ldi,
|
|||||||
if ('\n' != (*no_newline_string)[len - 1]) {
|
if ('\n' != (*no_newline_string)[len - 1]) {
|
||||||
want_newline = true;
|
want_newline = true;
|
||||||
++total_len;
|
++total_len;
|
||||||
|
} else if (NULL != ldi->ldi_suffix) {
|
||||||
|
/* if we have a suffix, then we don't want a
|
||||||
|
* newline to appear before it
|
||||||
|
*/
|
||||||
|
(*no_newline_string)[len - 1] = '\0';
|
||||||
|
want_newline = true; /* add newline to end after suffix */
|
||||||
|
/* total_len won't change since we just moved the newline
|
||||||
|
* to appear after the suffix
|
||||||
|
*/
|
||||||
}
|
}
|
||||||
if (NULL != ldi->ldi_prefix) {
|
if (NULL != ldi->ldi_prefix) {
|
||||||
total_len += strlen(ldi->ldi_prefix);
|
total_len += strlen(ldi->ldi_prefix);
|
||||||
}
|
}
|
||||||
|
if (NULL != ldi->ldi_suffix) {
|
||||||
|
total_len += strlen(ldi->ldi_suffix);
|
||||||
|
}
|
||||||
if (temp_str_len < total_len + want_newline) {
|
if (temp_str_len < total_len + want_newline) {
|
||||||
if (NULL != temp_str) {
|
if (NULL != temp_str) {
|
||||||
free(temp_str);
|
free(temp_str);
|
||||||
@ -700,14 +721,30 @@ static int make_string(char **no_newline_string, output_desc_t *ldi,
|
|||||||
}
|
}
|
||||||
temp_str_len = total_len * 2;
|
temp_str_len = total_len * 2;
|
||||||
}
|
}
|
||||||
if (NULL != ldi->ldi_prefix) {
|
if (NULL != ldi->ldi_prefix && NULL != ldi->ldi_suffix) {
|
||||||
if (want_newline) {
|
if (want_newline) {
|
||||||
snprintf(temp_str, temp_str_len, "%s%s\n", ldi->ldi_prefix,
|
snprintf(temp_str, temp_str_len, "%s%s%s\n",
|
||||||
*no_newline_string);
|
ldi->ldi_prefix, *no_newline_string, ldi->ldi_suffix);
|
||||||
|
} else {
|
||||||
|
snprintf(temp_str, temp_str_len, "%s%s%s", ldi->ldi_prefix,
|
||||||
|
*no_newline_string, ldi->ldi_suffix);
|
||||||
|
}
|
||||||
|
} else if (NULL != ldi->ldi_prefix) {
|
||||||
|
if (want_newline) {
|
||||||
|
snprintf(temp_str, temp_str_len, "%s%s\n",
|
||||||
|
ldi->ldi_prefix, *no_newline_string);
|
||||||
} else {
|
} else {
|
||||||
snprintf(temp_str, temp_str_len, "%s%s", ldi->ldi_prefix,
|
snprintf(temp_str, temp_str_len, "%s%s", ldi->ldi_prefix,
|
||||||
*no_newline_string);
|
*no_newline_string);
|
||||||
}
|
}
|
||||||
|
} else if (NULL != ldi->ldi_suffix) {
|
||||||
|
if (want_newline) {
|
||||||
|
snprintf(temp_str, temp_str_len, "%s%s\n",
|
||||||
|
*no_newline_string, ldi->ldi_suffix);
|
||||||
|
} else {
|
||||||
|
snprintf(temp_str, temp_str_len, "%s%s",
|
||||||
|
*no_newline_string, ldi->ldi_suffix);
|
||||||
|
}
|
||||||
} else {
|
} else {
|
||||||
if (want_newline) {
|
if (want_newline) {
|
||||||
snprintf(temp_str, temp_str_len, "%s\n", *no_newline_string);
|
snprintf(temp_str, temp_str_len, "%s\n", *no_newline_string);
|
||||||
@ -715,7 +752,7 @@ static int make_string(char **no_newline_string, output_desc_t *ldi,
|
|||||||
snprintf(temp_str, temp_str_len, "%s", *no_newline_string);
|
snprintf(temp_str, temp_str_len, "%s", *no_newline_string);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
return OPAL_SUCCESS;
|
return OPAL_SUCCESS;
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -752,20 +789,7 @@ static int output(int output_id, const char *format, va_list arglist)
|
|||||||
/* Syslog output -- does not use the newline-appended string */
|
/* Syslog output -- does not use the newline-appended string */
|
||||||
#if defined(HAVE_SYSLOG)
|
#if defined(HAVE_SYSLOG)
|
||||||
if (ldi->ldi_syslog) {
|
if (ldi->ldi_syslog) {
|
||||||
char *out = str;
|
|
||||||
if (ldi->ldi_filter_flags & OPAL_OUTPUT_FILTER_SYSLOG) {
|
|
||||||
#if 0
|
|
||||||
/* JMS call the filter, perhaps like this */
|
|
||||||
out = filter(str);
|
|
||||||
if (NULL == out) {
|
|
||||||
out = str;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
syslog(ldi->ldi_syslog_priority, "%s", str);
|
syslog(ldi->ldi_syslog_priority, "%s", str);
|
||||||
if (out != str) {
|
|
||||||
free(out);
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
@ -773,20 +797,6 @@ static int output(int output_id, const char *format, va_list arglist)
|
|||||||
with a newline appended */
|
with a newline appended */
|
||||||
|
|
||||||
out = temp_str;
|
out = temp_str;
|
||||||
if ((ldi->ldi_stdout &&
|
|
||||||
ldi->ldi_filter_flags & OPAL_OUTPUT_FILTER_STDOUT) ||
|
|
||||||
(ldi->ldi_stderr &&
|
|
||||||
ldi->ldi_filter_flags & OPAL_OUTPUT_FILTER_STDERR) ||
|
|
||||||
(ldi->ldi_file &&
|
|
||||||
ldi->ldi_filter_flags & OPAL_OUTPUT_FILTER_FILE)) {
|
|
||||||
#if 0
|
|
||||||
/* JMS call the filter, perhaps like this */
|
|
||||||
out = filter(temp_str);
|
|
||||||
if (NULL == out) {
|
|
||||||
out = temp_str;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
|
|
||||||
/* stdout output */
|
/* stdout output */
|
||||||
if (ldi->ldi_stdout) {
|
if (ldi->ldi_stdout) {
|
||||||
@ -816,16 +826,7 @@ static int output(int output_id, const char *format, va_list arglist)
|
|||||||
snprintf(buffer, BUFSIZ - 1,
|
snprintf(buffer, BUFSIZ - 1,
|
||||||
"[WARNING: %d lines lost because the Open MPI process session directory did\n not exist when opal_output() was invoked]\n",
|
"[WARNING: %d lines lost because the Open MPI process session directory did\n not exist when opal_output() was invoked]\n",
|
||||||
ldi->ldi_file_num_lines_lost);
|
ldi->ldi_file_num_lines_lost);
|
||||||
if (ldi->ldi_filter_flags & OPAL_OUTPUT_FILTER_FILE) {
|
write(ldi->ldi_fd, buffer, (int)strlen(buffer));
|
||||||
#if 0
|
|
||||||
/* JMS call the filter */
|
|
||||||
out = filter(buffer);
|
|
||||||
if (NULL == out) {
|
|
||||||
out = buffer;
|
|
||||||
}
|
|
||||||
#endif
|
|
||||||
}
|
|
||||||
write(ldi->ldi_fd, buffer, (int)strlen(buffer));
|
|
||||||
ldi->ldi_file_num_lines_lost = 0;
|
ldi->ldi_file_num_lines_lost = 0;
|
||||||
if (out != buffer) {
|
if (out != buffer) {
|
||||||
free(out);
|
free(out);
|
||||||
|
@ -80,15 +80,6 @@
|
|||||||
|
|
||||||
BEGIN_C_DECLS
|
BEGIN_C_DECLS
|
||||||
|
|
||||||
/** Flag to filter syslog output */
|
|
||||||
#define OPAL_OUTPUT_FILTER_SYSLOG 0x01
|
|
||||||
/** Flag to filter stdout output */
|
|
||||||
#define OPAL_OUTPUT_FILTER_STDOUT 0x02
|
|
||||||
/** Flag to filter stderr output */
|
|
||||||
#define OPAL_OUTPUT_FILTER_STDERR 0x04
|
|
||||||
/** Flag to filter file output */
|
|
||||||
#define OPAL_OUTPUT_FILTER_FILE 0x08
|
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* \class opal_output_stream_t
|
* \class opal_output_stream_t
|
||||||
*
|
*
|
||||||
@ -153,6 +144,16 @@ struct opal_output_stream_t {
|
|||||||
*/
|
*/
|
||||||
char *lds_prefix;
|
char *lds_prefix;
|
||||||
|
|
||||||
|
/**
|
||||||
|
* String suffix added to all output on the stream.
|
||||||
|
*
|
||||||
|
* When this field is non-NULL, it is appended to all lines of
|
||||||
|
* output on the stream. When this field is NULL, no suffix is
|
||||||
|
* added to each line of output in the stream. The suffix is copied
|
||||||
|
* to an internal structure in the call to opal_output_open()!
|
||||||
|
*/
|
||||||
|
char *lds_suffix;
|
||||||
|
|
||||||
/**
|
/**
|
||||||
* Indicates whether the output of the stream is
|
* Indicates whether the output of the stream is
|
||||||
* debugging/developer-only output or not.
|
* debugging/developer-only output or not.
|
||||||
@ -224,15 +225,6 @@ struct opal_output_stream_t {
|
|||||||
*/
|
*/
|
||||||
char *lds_file_suffix;
|
char *lds_file_suffix;
|
||||||
|
|
||||||
/**
|
|
||||||
* What outputs do we want passed through the filter first?
|
|
||||||
*
|
|
||||||
* Bit field indicating which of syslog, stdout, stderr, and file
|
|
||||||
* you want passed through the filter before sending to the
|
|
||||||
* output. Default is stdout, stderr filtered; syslog and file
|
|
||||||
* are not filtered.
|
|
||||||
*/
|
|
||||||
int lds_filter_flags;
|
|
||||||
};
|
};
|
||||||
|
|
||||||
/**
|
/**
|
||||||
|
@ -111,10 +111,12 @@ int orte_output_open(opal_output_stream_t *lds)
|
|||||||
|
|
||||||
void orte_output(int output_id, const char *format, ...)
|
void orte_output(int output_id, const char *format, ...)
|
||||||
{
|
{
|
||||||
/* just call opal_output_vverbose with a verbosity of 0 */
|
/* just call opal_output_vverbose with a negative verbosity to
|
||||||
|
* ensure the message gets out
|
||||||
|
*/
|
||||||
va_list arglist;
|
va_list arglist;
|
||||||
va_start(arglist, format);
|
va_start(arglist, format);
|
||||||
opal_output_vverbose(0, output_id, format, arglist);
|
opal_output_vverbose(-1, output_id, format, arglist);
|
||||||
va_end(arglist);
|
va_end(arglist);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -166,8 +168,6 @@ int orte_show_help(const char *filename, const char *topic,
|
|||||||
#define ORTE_OUTPUT_STDERR 0x02
|
#define ORTE_OUTPUT_STDERR 0x02
|
||||||
#define ORTE_OUTPUT_SHOW_HELP 0x04
|
#define ORTE_OUTPUT_SHOW_HELP 0x04
|
||||||
|
|
||||||
#define ORTE_OUTPUT_MAX_TAGS 10
|
|
||||||
|
|
||||||
/* List items for holding process names */
|
/* List items for holding process names */
|
||||||
typedef struct {
|
typedef struct {
|
||||||
opal_list_item_t super;
|
opal_list_item_t super;
|
||||||
@ -297,7 +297,6 @@ static int get_tli(const char *filename, const char *topic,
|
|||||||
|
|
||||||
|
|
||||||
static void output_vverbose(int verbose_level, int output_id,
|
static void output_vverbose(int verbose_level, int output_id,
|
||||||
int major_id, int minor_id,
|
|
||||||
const char *format, va_list arglist)
|
const char *format, va_list arglist)
|
||||||
{
|
{
|
||||||
char *output = NULL;
|
char *output = NULL;
|
||||||
@ -325,7 +324,32 @@ static void output_vverbose(int verbose_level, int output_id,
|
|||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* Per a soon-to-be-filed trac ticket: because this function calls
|
/* lookup the flags for this stream */
|
||||||
|
flags = OPAL_VALUE_ARRAY_GET_ITEM(&orte_output_streams, uint8_t, output_id);
|
||||||
|
|
||||||
|
/* if I am the HNP, then I need to output this via
|
||||||
|
* the appropriate channel
|
||||||
|
*/
|
||||||
|
if (orte_process_info.hnp) {
|
||||||
|
if (ORTE_OUTPUT_STDOUT & flags) {
|
||||||
|
OPAL_OUTPUT_VERBOSE((5, orte_debug_output,
|
||||||
|
"%s output %s to stdout",
|
||||||
|
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
|
||||||
|
output));
|
||||||
|
opal_output(stdout_stream, output);
|
||||||
|
} else {
|
||||||
|
OPAL_OUTPUT_VERBOSE((5, orte_debug_output,
|
||||||
|
"%s output %s to stderr",
|
||||||
|
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
|
||||||
|
output));
|
||||||
|
opal_output(stderr_stream, output);
|
||||||
|
}
|
||||||
|
goto cleanup;
|
||||||
|
}
|
||||||
|
|
||||||
|
/* If I am NOT the HNP...
|
||||||
|
|
||||||
|
Per a soon-to-be-filed trac ticket: because this function calls
|
||||||
RML send, recursion is possible in two places:
|
RML send, recursion is possible in two places:
|
||||||
|
|
||||||
1. RML send itself calls orte_output()
|
1. RML send itself calls orte_output()
|
||||||
@ -354,21 +378,6 @@ static void output_vverbose(int verbose_level, int output_id,
|
|||||||
}
|
}
|
||||||
am_inside = true;
|
am_inside = true;
|
||||||
|
|
||||||
/* if I am the HNP, then I need to just pass this on to the
|
|
||||||
* opal_output_verbose function using the provided stream
|
|
||||||
*/
|
|
||||||
if (orte_process_info.hnp) {
|
|
||||||
OPAL_OUTPUT_VERBOSE((5, orte_debug_output,
|
|
||||||
"%s output to stream %d",
|
|
||||||
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
|
|
||||||
output_id));
|
|
||||||
opal_output(output_id, output);
|
|
||||||
goto cleanup;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* lookup the flags for this stream */
|
|
||||||
flags = OPAL_VALUE_ARRAY_GET_ITEM(&orte_output_streams, uint8_t, output_id);
|
|
||||||
|
|
||||||
/* If there's other flags besides STDOUT and STDERR set, then also
|
/* If there's other flags besides STDOUT and STDERR set, then also
|
||||||
output this locally via opal_output */
|
output this locally via opal_output */
|
||||||
if ((~(ORTE_OUTPUT_STDOUT | ORTE_OUTPUT_STDERR)) & flags) {
|
if ((~(ORTE_OUTPUT_STDOUT | ORTE_OUTPUT_STDERR)) & flags) {
|
||||||
@ -631,7 +640,16 @@ int orte_output_init(void)
|
|||||||
|
|
||||||
/* define the default stream that has everything off */
|
/* define the default stream that has everything off */
|
||||||
OBJ_CONSTRUCT(&orte_output_default, opal_output_stream_t);
|
OBJ_CONSTRUCT(&orte_output_default, opal_output_stream_t);
|
||||||
|
orte_output_default.lds_want_stdout = false;
|
||||||
|
if (orte_process_info.hnp) {
|
||||||
|
orte_output_default.lds_want_stderr = true;
|
||||||
|
} else {
|
||||||
|
/* if we are not the HNP, route stderr through
|
||||||
|
* the HNP - don't open it here
|
||||||
|
*/
|
||||||
|
orte_output_default.lds_want_stderr = false;
|
||||||
|
}
|
||||||
|
|
||||||
/* Show help duplicate detection */
|
/* Show help duplicate detection */
|
||||||
OBJ_CONSTRUCT(&abd_tuples, opal_list_t);
|
OBJ_CONSTRUCT(&abd_tuples, opal_list_t);
|
||||||
|
|
||||||
@ -663,6 +681,15 @@ int orte_output_init(void)
|
|||||||
OBJ_CONSTRUCT(&stdout_lds, opal_output_stream_t);
|
OBJ_CONSTRUCT(&stdout_lds, opal_output_stream_t);
|
||||||
/* deliver to stdout only */
|
/* deliver to stdout only */
|
||||||
stdout_lds.lds_want_stdout = true;
|
stdout_lds.lds_want_stdout = true;
|
||||||
|
if (orte_xml_output) {
|
||||||
|
/* define an appropriate prefix/suffix */
|
||||||
|
stdout_lds.lds_prefix = strdup("<stdout>");
|
||||||
|
stdout_lds.lds_suffix = strdup("</stdout>");
|
||||||
|
} else {
|
||||||
|
/* turn off the prefix/suffix */
|
||||||
|
stdout_lds.lds_prefix = NULL;
|
||||||
|
stdout_lds.lds_suffix = NULL;
|
||||||
|
}
|
||||||
stdout_stream = opal_output_open(&stdout_lds);
|
stdout_stream = opal_output_open(&stdout_lds);
|
||||||
OPAL_VALUE_ARRAY_SET_ITEM(&orte_output_streams, uint8_t, stdout_stream, ORTE_OUTPUT_STDOUT);
|
OPAL_VALUE_ARRAY_SET_ITEM(&orte_output_streams, uint8_t, stdout_stream, ORTE_OUTPUT_STDOUT);
|
||||||
/* setup stderr stream - we construct our own
|
/* setup stderr stream - we construct our own
|
||||||
@ -671,8 +698,15 @@ int orte_output_init(void)
|
|||||||
OBJ_CONSTRUCT(&stderr_lds, opal_output_stream_t);
|
OBJ_CONSTRUCT(&stderr_lds, opal_output_stream_t);
|
||||||
/* deliver to stderr only */
|
/* deliver to stderr only */
|
||||||
stderr_lds.lds_want_stderr = true;
|
stderr_lds.lds_want_stderr = true;
|
||||||
/* we filter the stderr */
|
if (orte_xml_output) {
|
||||||
stderr_lds.lds_filter_flags = OPAL_OUTPUT_FILTER_STDERR;
|
/* define an appropriate prefix/suffix */
|
||||||
|
stderr_lds.lds_prefix = strdup("<stderr>");
|
||||||
|
stderr_lds.lds_suffix = strdup("</stderr>");
|
||||||
|
} else {
|
||||||
|
/* turn off the prefix/suffix */
|
||||||
|
stderr_lds.lds_prefix = NULL;
|
||||||
|
stderr_lds.lds_suffix = NULL;
|
||||||
|
}
|
||||||
stderr_stream = opal_output_open(&stderr_lds);
|
stderr_stream = opal_output_open(&stderr_lds);
|
||||||
OPAL_VALUE_ARRAY_SET_ITEM(&orte_output_streams, uint8_t, stderr_stream, ORTE_OUTPUT_STDERR);
|
OPAL_VALUE_ARRAY_SET_ITEM(&orte_output_streams, uint8_t, stderr_stream, ORTE_OUTPUT_STDERR);
|
||||||
}
|
}
|
||||||
@ -757,22 +791,14 @@ int orte_output_open(opal_output_stream_t *lds)
|
|||||||
return ORTE_ERROR;
|
return ORTE_ERROR;
|
||||||
}
|
}
|
||||||
|
|
||||||
/* if we are the HNP, this function just acts as
|
/* open a stream
|
||||||
* a wrapper around the corresponding opal_output fn
|
|
||||||
*/
|
|
||||||
if (orte_process_info.hnp) {
|
|
||||||
stream = opal_output_open(lds);
|
|
||||||
OPAL_OUTPUT_VERBOSE((5, orte_debug_output, "HNP opened stream %d", stream));
|
|
||||||
goto track;
|
|
||||||
}
|
|
||||||
|
|
||||||
/* if we not the HNP, then we need to open the stream
|
|
||||||
* and also record whether or not it is sending
|
* and also record whether or not it is sending
|
||||||
* output to stdout/stderr
|
* output to stdout/stderr
|
||||||
*/
|
*/
|
||||||
if (NULL == lds) {
|
if (NULL == lds) {
|
||||||
/* we have to ensure that the opal_output stream
|
/* we have to ensure that the opal_output stream
|
||||||
* doesn't open stdout and stderr, so setup the
|
* doesn't open stdout and stderr unless we are
|
||||||
|
* the HNP, so setup the
|
||||||
* stream here and ensure the settings are
|
* stream here and ensure the settings are
|
||||||
* correct - otherwise, opal_output will default
|
* correct - otherwise, opal_output will default
|
||||||
* the stream to having stderr active!
|
* the stream to having stderr active!
|
||||||
@ -784,6 +810,7 @@ int orte_output_open(opal_output_stream_t *lds)
|
|||||||
if (lds->lds_want_stdout) {
|
if (lds->lds_want_stdout) {
|
||||||
flag |= ORTE_OUTPUT_STDOUT;
|
flag |= ORTE_OUTPUT_STDOUT;
|
||||||
lds->lds_want_stdout = false;
|
lds->lds_want_stdout = false;
|
||||||
|
lds->lds_prefix = NULL; /* turn off the prefix! */
|
||||||
}
|
}
|
||||||
/* does it involve stderr? */
|
/* does it involve stderr? */
|
||||||
if (lds->lds_want_stderr) {
|
if (lds->lds_want_stderr) {
|
||||||
@ -799,7 +826,6 @@ int orte_output_open(opal_output_stream_t *lds)
|
|||||||
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
|
ORTE_NAME_PRINT(ORTE_PROC_MY_NAME),
|
||||||
stream));
|
stream));
|
||||||
|
|
||||||
track:
|
|
||||||
/* track the settings - can't use macro as this may adjust size of array */
|
/* track the settings - can't use macro as this may adjust size of array */
|
||||||
opal_value_array_set_item(&orte_output_streams, stream, (void*)&flag);
|
opal_value_array_set_item(&orte_output_streams, stream, (void*)&flag);
|
||||||
|
|
||||||
@ -836,7 +862,8 @@ void orte_output(int output_id, const char *format, ...)
|
|||||||
|
|
||||||
/* just call output_vverbose with a verbosity of 0 */
|
/* just call output_vverbose with a verbosity of 0 */
|
||||||
va_start(arglist, format);
|
va_start(arglist, format);
|
||||||
output_vverbose(0, output_id, ORTE_PROC_MY_NAME->jobid, ORTE_PROC_MY_NAME->vpid, format, arglist);
|
/* orte_output -always- gets printed, so set verbosity to neg value */
|
||||||
|
output_vverbose(-1, output_id, format, arglist);
|
||||||
va_end(arglist);
|
va_end(arglist);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -872,7 +899,7 @@ void orte_output_verbose(int verbose_level, int output_id, const char *format, .
|
|||||||
|
|
||||||
/* just call output_verbose with the specified verbosity */
|
/* just call output_verbose with the specified verbosity */
|
||||||
va_start(arglist, format);
|
va_start(arglist, format);
|
||||||
output_vverbose(verbose_level, output_id, ORTE_PROC_MY_NAME->jobid, ORTE_PROC_MY_NAME->vpid, format, arglist);
|
output_vverbose(verbose_level, output_id, format, arglist);
|
||||||
va_end(arglist);
|
va_end(arglist);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Загрузка…
Ссылка в новой задаче
Block a user