2004-01-14 09:42:24 +03:00
/*
2004-11-22 04:38:40 +03:00
* Copyright ( c ) 2004 - 2005 The Trustees of Indiana University .
* All rights reserved .
* Copyright ( c ) 2004 - 2005 The Trustees of the University of Tennessee .
* All rights reserved .
2004-11-28 23:09:25 +03:00
* Copyright ( c ) 2004 - 2005 High Performance Computing Center Stuttgart ,
* University of Stuttgart . All rights reserved .
2005-03-24 15:43:37 +03:00
* Copyright ( c ) 2004 - 2005 The Regents of the University of California .
* All rights reserved .
2004-11-22 04:38:40 +03:00
* $ COPYRIGHT $
*
* Additional copyrights may follow
*
2004-01-14 09:42:24 +03:00
* $ HEADER $
*/
2004-06-07 19:33:53 +04:00
# include "ompi_config.h"
2004-01-14 09:42:24 +03:00
# include <stdio.h>
# include <stdarg.h>
# include <stdlib.h>
2004-10-20 05:03:09 +04:00
# ifdef HAVE_SYSLOG_H
2004-01-14 09:42:24 +03:00
# include <syslog.h>
2004-10-20 05:03:09 +04:00
# endif
2004-01-14 09:42:24 +03:00
# include <string.h>
# include <fcntl.h>
2004-10-20 05:03:09 +04:00
# ifdef HAVE_UNISTD_H
2004-01-14 09:42:24 +03:00
# include <unistd.h>
2004-10-20 05:03:09 +04:00
# endif
# ifdef HAVE_SYS_PARAM_H
2004-09-14 00:19:01 +04:00
# include <sys/param.h>
2004-10-20 05:03:09 +04:00
# endif
2004-01-14 09:42:24 +03:00
2004-03-19 00:35:28 +03:00
# include "include/constants.h"
2005-07-04 03:31:27 +04:00
# include "opal/util/output.h"
2005-07-04 02:45:48 +04:00
# include "opal/threads/mutex.h"
2004-01-14 09:42:24 +03:00
/*
* Private data
*/
2004-01-21 02:20:59 +03:00
static int verbose_stream = - 1 ;
2005-07-04 03:31:27 +04:00
static opal_output_stream_t verbose = {
2004-01-14 09:42:24 +03:00
/* debugging */
false ,
/* verbose level */
0 ,
/* syslog */
false , 0 , NULL , NULL ,
/* stdout */
false ,
/* stderr */
true ,
/* file */
false , false , NULL
} ;
/*
* Private functions
*/
2005-07-04 03:31:27 +04:00
static int do_open ( int output_id , opal_output_stream_t * lds ) ;
2004-09-14 00:19:01 +04:00
static int open_file ( int i ) ;
2004-01-16 04:33:43 +03:00
static void free_descriptor ( int output_id ) ;
2005-03-28 18:49:06 +04:00
static void output ( int output_id , const char * format , va_list arglist ) ;
2004-01-14 09:42:24 +03:00
/*
* Internal data structures and helpers for the generalized output
* stream mechanism .
*/
struct output_desc_t {
bool ldi_used ;
bool ldi_enabled ;
int ldi_verbose_level ;
bool ldi_syslog ;
int ldi_syslog_priority ;
2004-10-22 20:06:05 +04:00
# ifndef WIN32
2004-01-14 09:42:24 +03:00
char * ldi_syslog_ident ;
2004-10-22 20:06:05 +04:00
# else
HANDLE ldi_syslog_ident ;
# endif
2004-01-14 09:42:24 +03:00
char * ldi_prefix ;
int ldi_prefix_len ;
bool ldi_stdout ;
bool ldi_stderr ;
2004-09-14 00:19:01 +04:00
bool ldi_file ;
bool ldi_file_want_append ;
2004-01-14 09:42:24 +03:00
char * ldi_file_suffix ;
2004-09-14 00:19:01 +04:00
int ldi_fd ;
int ldi_file_num_lines_lost ;
2004-01-14 09:42:24 +03:00
} ;
typedef struct output_desc_t output_desc_t ;
2005-07-04 03:31:27 +04:00
# define OPAL_OUTPUT_MAX_STREAMS 32
2004-01-14 09:42:24 +03:00
/*
* Local state
*/
static bool initialized = false ;
2005-07-04 03:31:27 +04:00
static output_desc_t info [ OPAL_OUTPUT_MAX_STREAMS ] ;
2004-01-14 09:42:24 +03:00
static char * temp_str = 0 ;
2004-10-26 14:56:08 +04:00
static size_t temp_str_len = 0 ;
2005-07-04 02:45:48 +04:00
static opal_mutex_t mutex ;
2004-10-14 22:01:18 +04:00
static bool syslog_opened = false ;
2004-01-14 09:42:24 +03:00
2004-03-27 05:48:04 +03:00
/*
* Setup the output stream infrastructure
2004-01-14 09:42:24 +03:00
*/
2005-07-04 03:31:27 +04:00
bool opal_output_init ( void )
2004-01-14 09:42:24 +03:00
{
int i ;
2005-07-04 03:31:27 +04:00
for ( i = 0 ; i < OPAL_OUTPUT_MAX_STREAMS ; + + i ) {
2004-01-14 09:42:24 +03:00
info [ i ] . ldi_used = false ;
info [ i ] . ldi_enabled = false ;
info [ i ] . ldi_syslog = false ;
2004-09-14 00:19:01 +04:00
info [ i ] . ldi_file = false ;
info [ i ] . ldi_file_suffix = NULL ;
info [ i ] . ldi_file_want_append = false ;
2004-01-14 09:42:24 +03:00
info [ i ] . ldi_fd = - 1 ;
2004-09-14 00:19:01 +04:00
info [ i ] . ldi_file_num_lines_lost = 0 ;
2004-01-14 09:42:24 +03:00
}
/* Initialize the mutex that protects the output */
2005-07-04 02:45:48 +04:00
OBJ_CONSTRUCT ( & mutex , opal_mutex_t ) ;
2004-01-14 09:42:24 +03:00
initialized = true ;
/* Open the default verbose stream */
2005-07-04 03:31:27 +04:00
verbose_stream = opal_output_open ( & verbose ) ;
2004-01-14 09:42:24 +03:00
return true ;
}
2004-03-27 05:48:04 +03:00
/*
* Open a stream
2004-01-14 09:42:24 +03:00
*/
2005-07-04 03:31:27 +04:00
int opal_output_open ( opal_output_stream_t * lds )
2004-01-14 09:42:24 +03:00
{
2004-01-16 04:33:43 +03:00
return do_open ( - 1 , lds ) ;
}
2004-01-14 09:42:24 +03:00
2004-03-27 05:48:04 +03:00
/*
* Reset the parameters on a stream
2004-01-16 04:33:43 +03:00
*/
2005-07-04 03:31:27 +04:00
int opal_output_reopen ( int output_id , opal_output_stream_t * lds )
2004-01-16 04:33:43 +03:00
{
return do_open ( output_id , lds ) ;
2004-01-14 09:42:24 +03:00
}
2004-03-27 05:48:04 +03:00
/*
* Enable and disable outptu streams
2004-01-14 09:42:24 +03:00
*/
2005-07-04 03:31:27 +04:00
bool opal_output_switch ( int output_id , bool enable )
2004-01-14 09:42:24 +03:00
{
bool ret = false ;
/* Setup */
if ( ! initialized )
2005-07-04 03:31:27 +04:00
opal_output_init ( ) ;
2004-01-14 09:42:24 +03:00
2005-07-04 03:31:27 +04:00
if ( output_id > = 0 & & output_id < OPAL_OUTPUT_MAX_STREAMS ) {
2004-01-14 09:42:24 +03:00
ret = info [ output_id ] . ldi_enabled ;
info [ output_id ] . ldi_enabled = enable ;
}
return ret ;
}
2004-03-27 05:48:04 +03:00
/*
* Reopen all the streams ; used during checkpoint / restart .
2004-01-14 09:42:24 +03:00
*/
2005-07-04 03:31:27 +04:00
void opal_output_reopen_all ( void )
2004-01-14 09:42:24 +03:00
{
int i ;
2005-07-04 03:31:27 +04:00
opal_output_stream_t lds ;
2004-01-14 09:42:24 +03:00
2005-07-04 03:31:27 +04:00
for ( i = 0 ; i < OPAL_OUTPUT_MAX_STREAMS ; + + i ) {
2004-01-14 09:42:24 +03:00
/* scan till we find ldi_used == 0, which is the end-marker */
2004-06-29 04:02:25 +04:00
if ( ! info [ i ] . ldi_used ) {
2004-01-14 09:42:24 +03:00
break ;
2004-06-29 04:02:25 +04:00
}
2004-01-14 09:42:24 +03:00
/*
2005-07-04 03:31:27 +04:00
* set this to zero to ensure that opal_output_open will return this same
2004-01-14 09:42:24 +03:00
* index as the output stream id
*/
info [ i ] . ldi_used = false ;
lds . lds_want_syslog = info [ i ] . ldi_syslog ;
lds . lds_syslog_priority = info [ i ] . ldi_syslog_priority ;
lds . lds_syslog_ident = info [ i ] . ldi_syslog_ident ;
lds . lds_prefix = info [ i ] . ldi_prefix ;
lds . lds_want_stdout = info [ i ] . ldi_stdout ;
lds . lds_want_stderr = info [ i ] . ldi_stderr ;
2004-09-14 00:19:01 +04:00
lds . lds_want_file = ( - 1 = = info [ i ] . ldi_fd ) ? false : true ;
2004-01-14 09:42:24 +03:00
/* open all streams in append mode */
lds . lds_want_file_append = true ;
lds . lds_file_suffix = info [ i ] . ldi_file_suffix ;
/*
2005-07-04 03:31:27 +04:00
* call opal_output_open to open the stream . The return value is
2004-01-14 09:42:24 +03:00
* guaranteed to be i . So we can ignore it .
*/
2005-07-04 03:31:27 +04:00
opal_output_open ( & lds ) ;
2004-01-14 09:42:24 +03:00
}
}
2004-03-27 05:48:04 +03:00
/*
* Close a stream
2004-01-14 09:42:24 +03:00
*/
2005-07-04 03:31:27 +04:00
void opal_output_close ( int output_id )
2004-01-14 09:42:24 +03:00
{
int i ;
/* Setup */
2004-06-29 04:02:25 +04:00
if ( ! initialized ) {
2005-07-04 03:31:27 +04:00
opal_output_init ( ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-14 09:42:24 +03:00
/* If it's valid, used, enabled, and has an open file descriptor,
2004-01-16 04:33:43 +03:00
free the resources associated with the descriptor */
2004-01-14 09:42:24 +03:00
2005-07-04 03:31:27 +04:00
if ( output_id > = 0 & & output_id < OPAL_OUTPUT_MAX_STREAMS & &
2004-01-14 09:42:24 +03:00
info [ output_id ] . ldi_used & &
info [ output_id ] . ldi_enabled ) {
2004-01-16 04:33:43 +03:00
free_descriptor ( output_id ) ;
}
2004-01-14 09:42:24 +03:00
/* If no one has the syslog open, we should close it */
2005-07-04 02:45:48 +04:00
OPAL_THREAD_LOCK ( & mutex ) ;
2005-07-04 03:31:27 +04:00
for ( i = 0 ; i < OPAL_OUTPUT_MAX_STREAMS ; + + i ) {
2004-06-29 04:02:25 +04:00
if ( info [ i ] . ldi_used & & info [ i ] . ldi_syslog ) {
2004-01-14 09:42:24 +03:00
break ;
2004-06-29 04:02:25 +04:00
}
}
2004-10-22 20:06:05 +04:00
# ifndef WIN32
2005-07-04 03:31:27 +04:00
if ( i > = OPAL_OUTPUT_MAX_STREAMS & & syslog_opened ) {
2004-01-14 09:42:24 +03:00
closelog ( ) ;
2004-06-29 04:02:25 +04:00
}
2004-10-22 20:06:05 +04:00
# else
DeregisterEventSource ( info [ output_id ] . ldi_syslog_ident ) ;
# endif
2004-01-14 09:42:24 +03:00
/* Somewhat of a hack to free up the temp_str */
if ( NULL ! = temp_str ) {
2004-02-10 03:09:36 +03:00
free ( temp_str ) ;
2004-01-14 09:42:24 +03:00
temp_str = NULL ;
temp_str_len = 0 ;
}
2005-07-04 02:45:48 +04:00
OPAL_THREAD_UNLOCK ( & mutex ) ;
2004-01-14 09:42:24 +03:00
}
2004-03-27 05:48:04 +03:00
/*
* Main function to send output to a stream
2004-01-14 09:42:24 +03:00
*/
2005-07-04 03:31:27 +04:00
void opal_output ( int output_id , const char * format , . . . )
2004-01-14 09:42:24 +03:00
{
va_list arglist ;
va_start ( arglist , format ) ;
output ( output_id , format , arglist ) ;
va_end ( arglist ) ;
}
2004-03-27 05:48:04 +03:00
/*
* Send a message to a stream if the verbose level is high enough
2004-01-14 09:42:24 +03:00
*/
2005-07-04 03:31:27 +04:00
void opal_output_verbose ( int level , int output_id , const char * format , . . . )
2004-01-14 09:42:24 +03:00
{
if ( info [ output_id ] . ldi_verbose_level > = level ) {
va_list arglist ;
va_start ( arglist , format ) ;
output ( output_id , format , arglist ) ;
va_end ( arglist ) ;
}
}
2004-03-27 05:48:04 +03:00
/*
* Set the verbosity level of a stream
2004-01-14 09:42:24 +03:00
*/
2005-07-04 03:31:27 +04:00
void opal_output_set_verbosity ( int output_id , int level )
2004-01-14 09:42:24 +03:00
{
info [ output_id ] . ldi_verbose_level = level ;
}
2004-03-27 05:48:04 +03:00
/*
* Shut down the output stream system
2004-01-14 09:42:24 +03:00
*/
2005-07-04 03:31:27 +04:00
void opal_output_finalize ( void )
2004-01-14 09:42:24 +03:00
{
if ( initialized ) {
2004-06-29 04:02:25 +04:00
if ( verbose_stream ! = - 1 ) {
2005-07-04 03:31:27 +04:00
opal_output_close ( verbose_stream ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-14 09:42:24 +03:00
verbose_stream = - 1 ;
}
2004-08-27 20:43:35 +04:00
OBJ_DESTRUCT ( & mutex ) ;
2004-01-14 09:42:24 +03:00
}
2004-03-27 05:48:04 +03:00
/************************************************************************/
2004-01-16 04:33:43 +03:00
/*
* Back - end of open ( ) and reopen ( ) . Necessary to have it as a
* back - end function so that we can do the thread locking properly
* ( especially upon reopen ) .
*/
2005-07-04 03:31:27 +04:00
static int do_open ( int output_id , opal_output_stream_t * lds )
2004-09-14 00:19:01 +04:00
{
2004-12-14 05:13:29 +03:00
int i ;
2004-01-16 04:33:43 +03:00
/* Setup */
2004-06-29 04:02:25 +04:00
if ( ! initialized ) {
2005-07-04 03:31:27 +04:00
opal_output_init ( ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-16 04:33:43 +03:00
/* If output_id == -1, find an available stream, or return
2004-06-07 19:33:53 +04:00
OMPI_ERROR */
2004-01-16 04:33:43 +03:00
if ( - 1 = = output_id ) {
2005-07-04 02:45:48 +04:00
OPAL_THREAD_LOCK ( & mutex ) ;
2005-07-04 03:31:27 +04:00
for ( i = 0 ; i < OPAL_OUTPUT_MAX_STREAMS ; + + i ) {
2004-06-29 04:02:25 +04:00
if ( ! info [ i ] . ldi_used ) {
2004-01-16 04:33:43 +03:00
break ;
2004-06-29 04:02:25 +04:00
}
}
2005-07-04 03:31:27 +04:00
if ( i > = OPAL_OUTPUT_MAX_STREAMS ) {
2005-07-04 02:45:48 +04:00
OPAL_THREAD_UNLOCK ( & mutex ) ;
2004-06-07 19:33:53 +04:00
return OMPI_ERR_OUT_OF_RESOURCE ;
2004-01-16 04:33:43 +03:00
}
}
/* Otherwise, we're reopening, so we need to free all previous
resources , close files , etc . */
else {
free_descriptor ( output_id ) ;
i = output_id ;
}
2004-05-19 23:52:24 +04:00
/* Special case: if we got NULL for lds, then just use the default
verbose */
if ( NULL = = lds ) {
lds = & verbose ;
}
2004-01-16 04:33:43 +03:00
/* Got a stream -- now initialize it and open relevant outputs */
info [ i ] . ldi_used = true ;
2004-08-29 11:50:07 +04:00
if ( - 1 = = output_id ) {
2005-07-04 02:45:48 +04:00
OPAL_THREAD_UNLOCK ( & mutex ) ;
2004-08-29 11:50:07 +04:00
}
2004-06-29 04:02:25 +04:00
info [ i ] . ldi_enabled = lds - > lds_is_debugging ?
( bool ) OMPI_ENABLE_DEBUG : true ;
2004-08-07 23:54:15 +04:00
info [ i ] . ldi_verbose_level = lds - > lds_verbose_level ;
2004-01-16 04:33:43 +03:00
info [ i ] . ldi_syslog = lds - > lds_want_syslog ;
if ( lds - > lds_want_syslog ) {
2004-10-28 22:13:43 +04:00
# ifndef WIN32
2004-01-16 04:33:43 +03:00
if ( NULL ! = lds - > lds_syslog_ident ) {
info [ i ] . ldi_syslog_ident = strdup ( lds - > lds_syslog_ident ) ;
2004-10-22 20:06:05 +04:00
openlog ( lds - > lds_syslog_ident , LOG_PID , LOG_USER ) ;
2004-01-16 04:33:43 +03:00
} else {
info [ i ] . ldi_syslog_ident = NULL ;
2005-07-04 03:31:27 +04:00
openlog ( " opal " , LOG_PID , LOG_USER ) ;
2004-01-16 04:33:43 +03:00
}
2004-10-22 20:06:05 +04:00
# else
2004-10-28 22:13:43 +04:00
if ( NULL = = ( info [ i ] . ldi_syslog_ident =
2005-07-04 03:31:27 +04:00
RegisterEventSource ( NULL , TEXT ( " opal: " ) ) ) ) {
2004-10-22 20:06:05 +04:00
/* handle the error */
return OMPI_ERROR ;
}
# endif
2004-10-14 22:01:18 +04:00
syslog_opened = true ;
2004-01-16 04:33:43 +03:00
info [ i ] . ldi_syslog_priority = lds - > lds_syslog_priority ;
}
if ( NULL ! = lds - > lds_prefix ) {
info [ i ] . ldi_prefix = strdup ( lds - > lds_prefix ) ;
info [ i ] . ldi_prefix_len = strlen ( lds - > lds_prefix ) ;
} else {
info [ i ] . ldi_prefix = NULL ;
info [ i ] . ldi_prefix_len = 0 ;
}
info [ i ] . ldi_stdout = lds - > lds_want_stdout ;
info [ i ] . ldi_stderr = lds - > lds_want_stderr ;
info [ i ] . ldi_fd = - 1 ;
2004-09-14 00:19:01 +04:00
info [ i ] . ldi_file = lds - > lds_want_file ;
info [ i ] . ldi_file_suffix = ( NULL = = lds - > lds_file_suffix ) ? NULL :
strdup ( lds - > lds_file_suffix ) ;
info [ i ] . ldi_file_want_append = lds - > lds_want_file_append ;
info [ i ] . ldi_file_num_lines_lost = 0 ;
2004-12-14 01:39:09 +03:00
/* 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 */
2004-01-16 04:33:43 +03:00
2004-09-14 00:19:01 +04:00
return i ;
}
2004-01-16 04:33:43 +03:00
2004-09-14 00:19:01 +04:00
static int open_file ( int i )
{
int flags ;
char * dir , * filename ;
/* Setup the filename and open flags */
2004-01-16 04:33:43 +03:00
2005-07-03 05:01:55 +04:00
/* BWB - fix me! - used to look at orte_process_info */
dir = NULL ;
2004-09-14 00:19:01 +04:00
if ( NULL ! = dir ) {
2004-10-18 19:38:19 +04:00
filename = ( char * ) malloc ( MAXPATHLEN ) ;
2004-09-14 00:19:01 +04:00
if ( NULL = = filename ) {
return OMPI_ERR_OUT_OF_RESOURCE ;
}
strcpy ( filename , dir ) ;
strcat ( filename , " /output- " ) ;
if ( info [ i ] . ldi_file_suffix ! = NULL ) {
strcat ( filename , info [ i ] . ldi_file_suffix ) ;
} else {
info [ i ] . ldi_file_suffix = NULL ;
strcat ( filename , " output.txt " ) ;
}
flags = O_CREAT | O_RDWR ;
if ( ! info [ i ] . ldi_file_want_append ) {
flags | = O_TRUNC ;
}
/* Actually open the file */
info [ i ] . ldi_fd = open ( filename , flags , 0644 ) ;
if ( - 1 = = info [ i ] . ldi_fd ) {
info [ i ] . ldi_used = false ;
return OMPI_ERR_IN_ERRNO ;
}
/* Make the file be close-on-exec to prevent child inheritance
problems */
2004-10-22 20:06:05 +04:00
# ifndef WIN32
2004-10-28 22:13:43 +04:00
/* TODO: Need to find out the equivalent in windows */
2004-09-14 00:19:01 +04:00
fcntl ( info [ i ] . ldi_fd , F_SETFD , 1 ) ;
2004-10-22 20:06:05 +04:00
# endif
2004-09-14 00:19:01 +04:00
free ( filename ) ;
2004-01-16 04:33:43 +03:00
}
2004-09-14 00:19:01 +04:00
/* Return successfully even if the session dir did not exist yet;
we ' ll try opening it later */
2004-01-16 04:33:43 +03:00
2004-09-14 00:19:01 +04:00
return OMPI_SUCCESS ;
2004-01-16 04:33:43 +03:00
}
/*
* Free all the resources associated with a descriptor .
*/
static void free_descriptor ( int output_id )
{
output_desc_t * ldi ;
2005-07-04 03:31:27 +04:00
if ( output_id > = 0 & & output_id < OPAL_OUTPUT_MAX_STREAMS & &
2004-01-16 04:33:43 +03:00
info [ output_id ] . ldi_used & &
info [ output_id ] . ldi_enabled ) {
ldi = & info [ output_id ] ;
2004-06-29 04:02:25 +04:00
if ( - 1 ! = ldi - > ldi_fd ) {
2004-01-16 04:33:43 +03:00
close ( ldi - > ldi_fd ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-16 04:33:43 +03:00
ldi - > ldi_used = false ;
/* If we strduped a prefix, suffix, or syslog ident, free it */
2004-06-29 04:02:25 +04:00
if ( NULL ! = ldi - > ldi_prefix ) {
2004-02-10 03:09:36 +03:00
free ( ldi - > ldi_prefix ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-16 04:33:43 +03:00
ldi - > ldi_prefix = NULL ;
2004-06-29 04:02:25 +04:00
if ( NULL ! = ldi - > ldi_file_suffix ) {
2004-02-10 03:09:36 +03:00
free ( ldi - > ldi_file_suffix ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-16 04:33:43 +03:00
ldi - > ldi_file_suffix = NULL ;
2004-10-22 20:06:05 +04:00
# ifndef WIN32
2004-06-29 04:02:25 +04:00
if ( NULL ! = ldi - > ldi_syslog_ident ) {
2004-02-10 03:09:36 +03:00
free ( ldi - > ldi_syslog_ident ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-16 04:33:43 +03:00
ldi - > ldi_syslog_ident = NULL ;
2004-10-22 20:06:05 +04:00
# endif
2004-01-16 04:33:43 +03:00
}
}
2004-01-14 09:42:24 +03:00
/*
* Do the actual output . Take a va_list so that we can be called from
* multiple different places , even functions that took " ... " as input
* arguments .
*/
2005-03-28 18:49:06 +04:00
static void output ( int output_id , const char * format , va_list arglist )
2004-01-14 09:42:24 +03:00
{
2004-10-26 14:56:08 +04:00
size_t len , total_len ;
2004-01-14 09:42:24 +03:00
bool want_newline = false ;
char * str ;
output_desc_t * ldi ;
/* Setup */
2004-06-29 04:02:25 +04:00
if ( ! initialized ) {
2005-07-04 03:31:27 +04:00
opal_output_init ( ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-14 09:42:24 +03:00
/* If it's valid, used, and enabled, output */
2005-07-04 03:31:27 +04:00
if ( output_id > = 0 & & output_id < OPAL_OUTPUT_MAX_STREAMS & &
2004-01-14 09:42:24 +03:00
info [ output_id ] . ldi_used & &
info [ output_id ] . ldi_enabled ) {
ldi = & info [ output_id ] ;
/* Make the formatted string */
2005-07-04 02:45:48 +04:00
OPAL_THREAD_LOCK ( & mutex ) ;
2004-08-19 03:15:48 +04:00
vasprintf ( & str , format , arglist ) ;
2004-01-14 09:42:24 +03:00
total_len = len = strlen ( str ) ;
if ( ' \n ' ! = str [ len - 1 ] ) {
want_newline = true ;
+ + total_len ;
}
2004-06-29 04:02:25 +04:00
if ( NULL ! = ldi - > ldi_prefix ) {
2004-01-14 09:42:24 +03:00
total_len + = strlen ( ldi - > ldi_prefix ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-14 09:42:24 +03:00
if ( temp_str_len < total_len + want_newline ) {
2004-06-29 04:02:25 +04:00
if ( NULL ! = temp_str ) {
2004-02-10 03:09:36 +03:00
free ( temp_str ) ;
2004-06-29 04:02:25 +04:00
}
2004-10-18 19:38:19 +04:00
temp_str = ( char * ) malloc ( total_len * 2 ) ;
2004-01-14 09:42:24 +03:00
temp_str_len = total_len * 2 ;
}
if ( NULL ! = ldi - > ldi_prefix ) {
2004-06-29 04:02:25 +04:00
if ( want_newline ) {
2004-01-14 09:42:24 +03:00
snprintf ( temp_str , temp_str_len , " %s%s \n " , ldi - > ldi_prefix , str ) ;
2004-06-29 04:02:25 +04:00
} else {
2004-01-14 09:42:24 +03:00
snprintf ( temp_str , temp_str_len , " %s%s " , ldi - > ldi_prefix , str ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-14 09:42:24 +03:00
} else {
2004-06-29 04:02:25 +04:00
if ( want_newline ) {
2004-01-14 09:42:24 +03:00
snprintf ( temp_str , temp_str_len , " %s \n " , str ) ;
2004-06-29 04:02:25 +04:00
} else {
2004-01-14 09:42:24 +03:00
snprintf ( temp_str , temp_str_len , " %s " , str ) ;
2004-06-29 04:02:25 +04:00
}
2004-01-14 09:42:24 +03:00
}
/* Syslog output */
2004-06-29 04:02:25 +04:00
if ( ldi - > ldi_syslog ) {
2004-10-22 20:06:05 +04:00
# ifndef WIN32
2004-01-14 09:42:24 +03:00
syslog ( ldi - > ldi_syslog_priority , str ) ;
2004-10-22 20:06:05 +04:00
# endif
2004-06-29 04:02:25 +04:00
}
2004-01-14 09:42:24 +03:00
/* stdout output */
if ( ldi - > ldi_stdout ) {
printf ( temp_str ) ;
fflush ( stdout ) ;
}
/* stderr output */
if ( ldi - > ldi_stderr ) {
fprintf ( stderr , temp_str ) ;
fflush ( stderr ) ;
}
2004-09-14 00:19:01 +04:00
/* File output -- first check to see if the file opening was
delayed . If so , try to open it . If we failed to open it , then
2005-07-04 03:31:27 +04:00
just discard ( there are big warnings in the opal_output . h docs
2004-09-14 00:19:01 +04:00
about this ! ) . */
if ( ldi - > ldi_file ) {
if ( ldi - > ldi_fd = = - 1 ) {
if ( OMPI_SUCCESS ! = open_file ( output_id ) ) {
+ + ldi - > ldi_file_num_lines_lost ;
} else if ( ldi - > ldi_file_num_lines_lost > 0 ) {
char buffer [ BUFSIZ ] ;
memset ( buffer , 0 , BUFSIZ ) ;
2005-07-04 03:31:27 +04:00
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 " , ldi - > ldi_file_num_lines_lost ) ;
2004-09-14 00:19:01 +04:00
write ( ldi - > ldi_fd , buffer , strlen ( buffer ) ) ;
ldi - > ldi_file_num_lines_lost = 0 ;
}
}
if ( ldi - > ldi_fd ! = - 1 ) {
write ( ldi - > ldi_fd , temp_str , total_len ) ;
}
2004-06-29 04:02:25 +04:00
}
2005-07-04 02:45:48 +04:00
OPAL_THREAD_UNLOCK ( & mutex ) ;
2004-01-14 09:42:24 +03:00
2004-02-10 03:09:36 +03:00
free ( str ) ;
2004-01-14 09:42:24 +03:00
}
}