diff options
Diffstat (limited to 'bench/wtperf/misc.c')
-rw-r--r-- | bench/wtperf/misc.c | 110 |
1 files changed, 110 insertions, 0 deletions
diff --git a/bench/wtperf/misc.c b/bench/wtperf/misc.c new file mode 100644 index 00000000000..2a4b4e31489 --- /dev/null +++ b/bench/wtperf/misc.c @@ -0,0 +1,110 @@ +/*- + * Public Domain 2008-2013 WiredTiger, Inc. + * + * This is free and unencumbered software released into the public domain. + * + * Anyone is free to copy, modify, publish, use, compile, sell, or + * distribute this software, either in source code form or as a compiled + * binary, for any purpose, commercial or non-commercial, and by any + * means. + * + * In jurisdictions that recognize copyright laws, the author or authors + * of this software dedicate any and all copyright interest in the + * software to the public domain. We make this dedication for the benefit + * of the public at large and to the detriment of our heirs and + * successors. We intend this dedication to be an overt act of + * relinquishment in perpetuity of all present and future rights to this + * software under copyright law. + * + * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, + * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF + * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. + * IN NO EVENT SHALL THE AUTHORS BE LIABLE FOR ANY CLAIM, DAMAGES OR + * OTHER LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, + * ARISING FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR + * OTHER DEALINGS IN THE SOFTWARE. + */ + +#include "wtperf.h" + +int +enomem(const CONFIG *cfg) +{ + const char *msg; + + msg = "Unable to allocate memory"; + if (cfg->logf == NULL) + fprintf(stderr, "%s\n", msg); + else + lprintf(cfg, ENOMEM, 0, "%s", msg); + return (ENOMEM); +} + +/* Setup the logging output mechanism. */ +int +setup_log_file(CONFIG *cfg) +{ + char *fname; + int ret; + + ret = 0; + + if (cfg->verbose < 1 && cfg->stat_interval == 0) + return (0); + + if ((fname = calloc(strlen(cfg->home) + + strlen(cfg->table_name) + strlen(".stat") + 2, 1)) == NULL) + return (enomem(cfg)); + + sprintf(fname, "%s/%s.stat", cfg->home, cfg->table_name); + if ((cfg->logf = fopen(fname, "w")) == NULL) { + fprintf(stderr, "Statistics failed to open log file.\n"); + ret = EINVAL; + } else { + /* Use line buffering for the log file. */ + (void)setvbuf(cfg->logf, NULL, _IOLBF, 0); + } + free(fname); + return (ret); +} + +/* + * Log printf - output a log message. + */ +void +lprintf(const CONFIG *cfg, int err, uint32_t level, const char *fmt, ...) +{ + va_list ap; + + if (err == 0 && level <= cfg->verbose) { + va_start(ap, fmt); + vfprintf(cfg->logf, fmt, ap); + va_end(ap); + fprintf(cfg->logf, "\n"); + + if (level < cfg->verbose) { + va_start(ap, fmt); + vprintf(fmt, ap); + va_end(ap); + printf("\n"); + } + } + if (err == 0) + return; + + /* We are dealing with an error. */ + va_start(ap, fmt); + vfprintf(stderr, fmt, ap); + va_end(ap); + fprintf(stderr, " Error: %s\n", wiredtiger_strerror(err)); + if (cfg->logf != NULL) { + va_start(ap, fmt); + vfprintf(cfg->logf, fmt, ap); + va_end(ap); + fprintf(cfg->logf, " Error: %s\n", wiredtiger_strerror(err)); + } + + /* Never attempt to continue if we got a panic from WiredTiger. */ + if (err == WT_PANIC) + exit(1); +} |