1 /* 2 * Copyright (c) 2004-2005 The Trustees of Indiana University and Indiana 3 * University Research and Technology 4 * Corporation. All rights reserved. 5 * Copyright (c) 2004-2006 The University of Tennessee and The University 6 * of Tennessee Research Foundation. All rights 7 * reserved. 8 * Copyright (c) 2004-2005 High Performance Computing Center Stuttgart, 9 * University of Stuttgart. All rights reserved. 10 * Copyright (c) 2004-2005 The Regents of the University of California. 11 * All rights reserved. 12 * Copyright (c) 2007-2011 Cisco Systems, Inc. All rights reserved. 13 * Copyright (c) 2010 Oracle and/or its affiliates. All rights reserved. 14 * Copyright (c) 2015-2017 Intel, Inc. All rights reserved. 15 * Copyright (c) 2016 Research Organization for Information Science 16 * and Technology (RIST). All rights reserved. 17 * $COPYRIGHT$ 18 * 19 * Additional copyrights may follow 20 * 21 * $HEADER$ 22 */ 23 24 /** @file 25 * PMIX output stream facility. 26 * 27 * The PMIX output stream facility is used to send output from the PMIX 28 * libraries to output devices. It is meant to fully replace all 29 * forms of printf() (and friends). Output streams are opened via the 30 * pmix_output_open() function call, and then sent output via 31 * pmix_output_verbose(), PMIX_OUTPUT(), and pmix_output(). Streams are 32 * closed with pmix_output_close(). 33 * 34 * Streams can multiplex output to several kinds of outputs (one of 35 * each): 36 * 37 * - the syslog (if available) 38 * - standard output 39 * - standard error 40 * - file 41 * 42 * Which outputs to use are specified during pmix_output_open(). 43 * 44 * WARNING: When using "file" as an output destination, be aware that 45 * the file may not exist until the session directory for the process 46 * exists. This is at least part of the way through MPI_INIT (for 47 * example). Most MCA components and internals of PMIx won't be 48 * affected by this, but some RTE / startup aspects of PMIx will 49 * not be able to write to a file for output. See pmix_output() for 50 * details on what happens in these cases. 51 * 52 * pmix_output_open() returns an integer handle that is used in 53 * successive calls to PMIX_OUTPUT() and pmix_output() to send output to 54 * the stream. 55 * 56 * The default "verbose" stream is opened after invoking 57 * pmix_output_init() (and closed after invoking 58 * pmix_output_finalize()). This stream outputs to stderr only, and 59 * has a stream handle ID of 0. 60 * 61 * It is erroneous to have one thread close a stream and have another 62 * try to write to it. Multiple threads writing to a single stream 63 * will be serialized in an unspecified order. 64 */ 65 66 #ifndef PMIX_OUTPUT_H_ 67 #define PMIX_OUTPUT_H_ 68 69 #include <src/include/pmix_config.h> 70 71 72 #ifdef HAVE_STDARG_H 73 #include <stdarg.h> 74 #endif 75 76 #include "pmix_rename.h" 77 #include "src/class/pmix_object.h" 78 79 BEGIN_C_DECLS 80 81 /* There are systems where all output needs to be redirected to syslog 82 * and away from stdout/stderr or files - e.g., embedded systems whose 83 * sole file system is in flash. To support such systems, we provide 84 * the following environmental variables that support redirecting -all- 85 * output (both from pmix_output and stdout/stderr of processes) to 86 * syslog: 87 * 88 * PMIX_OUTPUT_REDIRECT - set to "syslog" to redirect to syslog. Other 89 * options may someday be supported 90 * PMIX_OUTPUT_SYSLOG_PRI - set to "info", "error", or "warn" to have 91 * output sent to syslog at that priority 92 * PMIX_OUTPUT_SYSLOG_IDENT - a string identifier for the log 93 * 94 * We also define two global variables that notify all other 95 * layers that output is being redirected to syslog at the given 96 * priority. These are used, for example, by the IO forwarding 97 * subsystem to tell it to dump any collected output directly to 98 * syslog instead of forwarding it to another location. 99 */ 100 extern bool pmix_output_redirected_to_syslog; 101 extern int pmix_output_redirected_syslog_pri; 102 103 /** 104 * \class pmix_output_stream_t 105 * 106 * Structure used to request the opening of a PMIX output stream. A 107 * pointer to this structure is passed to pmix_output_open() to tell 108 * the pmix_output subsystem where to send output for a given stream. 109 * It is valid to specify multiple destinations of output for a stream 110 * -- output streams can be multiplexed to multiple different 111 * destinations through the pmix_output facility. 112 * 113 * Note that all strings in this struct are cached on the stream by 114 * value; there is no need to keep them allocated after the return 115 * from pmix_output_open(). 116 */ 117 struct pmix_output_stream_t { 118 /** Class parent */ 119 pmix_object_t super; 120 121 /** 122 * Indicate the starting verbosity level of the stream. 123 * 124 * Verbose levels are a convenience mechanisms, and are only 125 * consulted when output is sent to a stream through the 126 * pmix_output_verbose() function. Verbose levels are ignored in 127 * PMIX_OUTPUT() and pmix_output(). 128 * 129 * Valid verbose levels typically start at 0 (meaning "minimal 130 * information"). Higher verbosity levels generally indicate that 131 * more output and diagnostics should be displayed. 132 */ 133 int lds_verbose_level; 134 135 /** 136 * When pmix_output_stream_t::lds_want_syslog is true, this field is 137 * examined to see what priority output from the stream should be 138 * sent to the syslog. 139 * 140 * This value should be set as per the syslog(3) man page. It is 141 * typically the OR value of "facilty" and "level" values described 142 * in the man page. 143 */ 144 int lds_syslog_priority; 145 /** 146 * When pmix_output_stream_t::lds_want_syslog is true, this field is 147 * examined to see what ident value should be passed to openlog(3). 148 * 149 * If a NULL value is given, the string "pmix" is used. 150 */ 151 #if !defined(__WINDOWS__) 152 char *lds_syslog_ident; 153 #elif !defined(_MSC_VER) 154 char *lds_syslog_ident; 155 #else 156 HANDLE lds_syslog_ident; 157 #endif /* !defined(__WINDOWS__) */ 158 159 /** 160 * String prefix added to all output on the stream. 161 * 162 * When this field is non-NULL, it is prefixed to all lines of 163 * output on the stream. When this field is NULL, no prefix is 164 * added to each line of output in the stream. The prefix is copied 165 * to an internal structure in the call to pmix_output_open()! 166 */ 167 char *lds_prefix; 168 169 /** 170 * String suffix added to all output on the stream. 171 * 172 * When this field is non-NULL, it is appended to all lines of 173 * output on the stream. When this field is NULL, no suffix is 174 * added to each line of output in the stream. The suffix is copied 175 * to an internal structure in the call to pmix_output_open()! 176 */ 177 char *lds_suffix; 178 179 /** 180 * Indicates whether the output of the stream is 181 * debugging/developer-only output or not. 182 * 183 * This field should be "true" if the output is for debugging 184 * purposes only. In that case, the output will never be sent to 185 * the stream unless PMIX was configured with --enable-debug. 186 */ 187 bool lds_is_debugging; 188 189 /** 190 * Indicates whether output of the stream should be sent to the 191 * syslog or not. 192 * 193 * If this field is true, output from this stream is sent to the 194 * syslog, and the following fields are also examined: 195 * 196 * - lds_syslog_priority 197 * - lds_syslog_ident 198 * - lds_prefix 199 * 200 * If this field is false, the above three fields are ignored. 201 */ 202 bool lds_want_syslog; 203 204 /** 205 * Whether to send stream output to stdout or not. 206 * 207 * If this field is true, stream output is sent to stdout. 208 */ 209 bool lds_want_stdout; 210 /** 211 * Whether to send stream output to stderr or not. 212 * 213 * If this field is true, stream output is sent to stderr. 214 */ 215 bool lds_want_stderr; 216 217 /** 218 * Whether to send stream output to a file or not. 219 * 220 * When this field is true, stream output is sent to a file, and the 221 * following fields are also examined: 222 * 223 * - lds_want_file_append 224 * - lda_file_suffix 225 */ 226 bool lds_want_file; 227 /** 228 * When pmix_output_stream_t::lds_want_file is true, this field 229 * indicates whether to append the file (if it exists) or overwrite 230 * it. 231 * 232 * If false, the file is opened with the O_TRUNC flag. 233 */ 234 bool lds_want_file_append; 235 /** 236 * When pmix_output_stream_t::lds_want_file is true, this field 237 * indicates the string suffix to add to the filename. 238 * 239 * The output file will be in the directory and begin with the 240 * prefix set by pmix_output_set_output_file_info() (e.g., 241 * "$dir/$prefix$suffix"). If this field is NULL and 242 * lds_want_file is true, then the suffix "output.txt" is used. 243 * 244 * Note that it is possible that the output directory may not 245 * exist when pmix_output_open() is invoked. See pmix_output() 246 * for details on what happens in this situation. 247 */ 248 char *lds_file_suffix; 249 250 }; 251 252 /** 253 * Convenience typedef 254 */ 255 typedef struct pmix_output_stream_t pmix_output_stream_t; 256 257 /** 258 * Initializes the output stream system and opens a default 259 * "verbose" stream. 260 * 261 * @retval true Upon success. 262 * @retval false Upon failure. 263 * 264 * This should be the first function invoked in the output 265 * subsystem. After this call, the default "verbose" stream is open 266 * and can be written to via calls to pmix_output_verbose() and 267 * pmix_output_error(). 268 * 269 * By definition, the default verbose stream has a handle ID of 0, 270 * and has a verbose level of 0. 271 */ 272 PMIX_EXPORT bool pmix_output_init(void); 273 274 /** 275 * Shut down the output stream system. 276 * 277 * Shut down the output stream system, including the default verbose 278 * stream. 279 */ 280 PMIX_EXPORT void pmix_output_finalize(void); 281 282 /** 283 * Opens an output stream. 284 * 285 * @param lds A pointer to pmix_output_stream_t describing what the 286 * characteristics of the output stream should be. 287 * 288 * This function opens an output stream and returns an integer 289 * handle. The caller is responsible for maintaining the handle and 290 * using it in successive calls to PMIX_OUTPUT(), pmix_output(), 291 * pmix_output_switch(), and pmix_output_close(). 292 * 293 * If lds is NULL, the default descriptions will be used, meaning 294 * that output will only be sent to stderr. 295 * 296 * It is safe to have multiple threads invoke this function 297 * simultaneously; their execution will be serialized in an 298 * unspecified manner. 299 * 300 * Be sure to see pmix_output() for a description of what happens 301 * when open_open() / pmix_output() is directed to send output to a 302 * file but the process session directory does not yet exist. 303 */ 304 PMIX_EXPORT int pmix_output_open(pmix_output_stream_t *lds); 305 306 /** 307 * Re-opens / redirects an output stream. 308 * 309 * @param output_id Stream handle to reopen 310 * @param lds A pointer to pmix_output_stream_t describing what the 311 * characteristics of the reopened output stream should be. 312 * 313 * This function redirects an existing stream into a new [set of] 314 * location[s], as specified by the lds parameter. If the output_id 315 * passed is invalid, this call is effectively the same as opening a 316 * new stream with a specific stream handle. 317 */ 318 PMIX_EXPORT int pmix_output_reopen(int output_id, pmix_output_stream_t *lds); 319 320 /** 321 * Enables and disables output streams. 322 * 323 * @param output_id Stream handle to switch 324 * @param enable Boolean indicating whether to enable the stream 325 * output or not. 326 * 327 * @returns The previous enable state of the stream (true == enabled, 328 * false == disabled). 329 * 330 * The output of a stream can be temporarily disabled by passing an 331 * enable value to false, and later resumed by passing an enable 332 * value of true. This does not close the stream -- it simply tells 333 * the pmix_output subsystem to intercept and discard any output sent 334 * to the stream via PMIX_OUTPUT() or pmix_output() until the output 335 * is re-enabled. 336 */ 337 PMIX_EXPORT bool pmix_output_switch(int output_id, bool enable); 338 339 /** 340 * \internal 341 * 342 * Reopens all existing output streams. 343 * 344 * This function should never be called by user applications; it is 345 * typically only invoked after a restart (i.e., in a new process) 346 * where output streams need to be re-initialized. 347 */ 348 PMIX_EXPORT void pmix_output_reopen_all(void); 349 350 /** 351 * Close an output stream. 352 * 353 * @param output_id Handle of the stream to close. 354 * 355 * Close an output stream. No output will be sent to the stream 356 * after it is closed. Be aware that output handles tend to be 357 * re-used; it is possible that after a stream is closed, if another 358 * stream is opened, it will get the same handle value. 359 */ 360 PMIX_EXPORT void pmix_output_close(int output_id); 361 362 /** 363 * Main function to send output to a stream. 364 * 365 * @param output_id Stream id returned from pmix_output_open(). 366 * @param format printf-style format string. 367 * @param varargs printf-style varargs list to fill the string 368 * specified by the format parameter. 369 * 370 * This is the main function to send output to custom streams (note 371 * that output to the default "verbose" stream is handled through 372 * pmix_output_verbose() and pmix_output_error()). 373 * 374 * It is never necessary to send a trailing "\n" in the strings to 375 * this function; some streams requires newlines, others do not -- 376 * this function will append newlines as necessary. 377 * 378 * Verbosity levels are ignored in this function. 379 * 380 * Note that for output streams that are directed to files, the 381 * files are stored under the process' session directory. If the 382 * session directory does not exist when pmix_output() is invoked, 383 * the output will be discarded! Once the session directory is 384 * created, pmix_output() will automatically create the file and 385 * writing to it. 386 */ 387 PMIX_EXPORT void pmix_output(int output_id, const char *format, ...) __pmix_attribute_format__(__printf__, 2, 3); 388 389 /** 390 * Send output to a stream only if the passed verbosity level is 391 * high enough. 392 * 393 * @param output_id Stream id returned from pmix_output_open(). 394 * @param level Target verbosity level. 395 * @param format printf-style format string. 396 * @param varargs printf-style varargs list to fill the string 397 * specified by the format parameter. 398 * 399 * Output is only sent to the stream if the current verbosity level 400 * is greater than or equal to the level parameter. This mechanism 401 * can be used to send "information" kinds of output to user 402 * applications, but only when the user has asked for a high enough 403 * verbosity level. 404 * 405 * It is never necessary to send a trailing "\n" in the strings to 406 * this function; some streams requires newlines, others do not -- 407 * this function will append newlines as necessary. 408 * 409 * This function is really a convenience wrapper around checking the 410 * current verbosity level set on the stream, and if the passed 411 * level is less than or equal to the stream's verbosity level, this 412 * function will effectively invoke pmix_output to send the output to 413 * the stream. 414 * 415 * @see pmix_output_set_verbosity() 416 */ 417 PMIX_EXPORT void pmix_output_verbose(int verbose_level, int output_id, 418 const char *format, ...) __pmix_attribute_format__(__printf__, 3, 4); 419 420 /** 421 * Same as pmix_output_verbose(), but takes a va_list form of varargs. 422 */ 423 PMIX_EXPORT void pmix_output_vverbose(int verbose_level, int output_id, 424 const char *format, va_list ap) __pmix_attribute_format__(__printf__, 3, 0); 425 426 /** 427 * Set the verbosity level for a stream. 428 * 429 * @param output_id Stream id returned from pmix_output_open(). 430 * @param level New verbosity level 431 * 432 * This function sets the verbosity level on a given stream. It 433 * will be used for all future invocations of pmix_output_verbose(). 434 */ 435 PMIX_EXPORT void pmix_output_set_verbosity(int output_id, int level); 436 437 /** 438 * Get the verbosity level for a stream 439 * 440 * @param output_id Stream id returned from pmix_output_open() 441 * @returns Verbosity of stream 442 */ 443 PMIX_EXPORT int pmix_output_get_verbosity(int output_id); 444 445 /** 446 * Set characteristics for output files. 447 * 448 * @param dir Directory where output files will go 449 * @param olddir If non-NULL, the directory where output files 450 * were previously opened 451 * @param prefix Prefix of files in the output directory 452 * @param oldprefix If non-NULL, the old prefix 453 * 454 * This function controls the final filename used for all new 455 * output streams that request output files. Specifically, when 456 * pmix_output_stream_t::lds_want_file is true, the output 457 * filename will be of the form $dir/$prefix$suffix. 458 * 459 * The default value for the output directory is whatever is 460 * specified in the TMPDIR environment variable if it exists, or 461 * $HOME if it does not. The default value for the prefix is 462 * "output-pid<pid>-" (where "<pid>" is replaced by the PID of the 463 * current process). 464 * 465 * If dir or prefix are NULL, new values are not set. The strings 466 * represented by dir and prefix are copied into internal storage; 467 * it is safe to pass string constants or free() these values 468 * after pmix_output_set_output_file_info() returns. 469 * 470 * If olddir or oldprefix are not NULL, copies of the old 471 * directory and prefix (respectively) are returned in these 472 * parameters. The caller is responsible for calling (free) on 473 * these values. This allows one to get the old values, output an 474 * output file in a specific directory and/or with a specific 475 * prefix, and then restore the old values. 476 * 477 * Note that this function only affects the creation of \em new 478 * streams -- streams that have already started writing to output 479 * files are not affected (i.e., their output files are not moved 480 * to the new directory). More specifically, the pmix_output 481 * system only opens/creates output files lazily -- so calling 482 * this function affects both new streams \em and any stream that 483 * was previously opened but had not yet output anything. 484 */ 485 PMIX_EXPORT void pmix_output_set_output_file_info(const char *dir, 486 const char *prefix, 487 char **olddir, 488 char **oldprefix); 489 490 /** 491 * Same as pmix_output_verbose(), but pointer to buffer and size. 492 */ 493 PMIX_EXPORT void pmix_output_hexdump(int verbose_level, int output_id, 494 void *ptr, int buflen); 495 496 #if PMIX_ENABLE_DEBUG 497 /** 498 * Main macro for use in sending debugging output to output streams; 499 * will be "compiled out" when PMIX is configured without 500 * --enable-debug. 501 * 502 * @see pmix_output() 503 */ 504 #define PMIX_OUTPUT(a) pmix_output a 505 506 /** 507 * Macro for use in sending debugging output to the output 508 * streams. Will be "compiled out" when PMIX is configured 509 * without --enable-debug. 510 * 511 * @see pmix_output_verbose() 512 */ 513 #define PMIX_OUTPUT_VERBOSE(a) pmix_output_verbose a 514 #else 515 /** 516 * Main macro for use in sending debugging output to output streams; 517 * will be "compiled out" when PMIX is configured without 518 * --enable-debug. 519 * 520 * @see pmix_output() 521 */ 522 #define PMIX_OUTPUT(a) 523 524 /** 525 * Macro for use in sending debugging output to the output 526 * streams. Will be "compiled out" when PMIX is configured 527 * without --enable-debug. 528 * 529 * @see pmix_output_verbose() 530 */ 531 #define PMIX_OUTPUT_VERBOSE(a) 532 #endif 533 534 /** 535 * Declare the class of this type. Note that the constructor for 536 * this class is for convenience only -- it is \em not necessary 537 * to be invoked. If the constructor it used, it sets all values 538 * in the struct to be false / 0 (i.e., turning off all output). 539 * The intended usage is to invoke the constructor and then enable 540 * the output fields that you want. 541 */ 542 PMIX_CLASS_DECLARATION(pmix_output_stream_t); 543 544 END_C_DECLS 545 546 #endif /* PMIX_OUTPUT_H_ */