static void log_print_all(void *tinst) { struct statistics_controller *c = tinst; struct log_print_cell_data data; int y, ylimit; top_globalstats_iterate(c->globalstats, log_print_globalstats, NULL); putchar('\n'); log_print_header(tinst); putchar('\n'); data.x = 0; data.xoffset = /*padding*/ 0; data.have_limit = top_prefs_get_ncols(&data.ncols); data.column = 0; data.row = 0; ylimit = log_get_total(tinst); for(y = 0; y < ylimit; ++y) { data.x = 0; data.xoffset = 0; data.column = 0; c->iterate(c, log_print_cell, &data); data.row++; putchar('\n'); } }
static int log_open(LogContext *pContext) { int result; if ((pContext->log_fd = open(pContext->log_filename, O_WRONLY | \ O_CREAT | O_APPEND | pContext->fd_flags, 0644)) < 0) { fprintf(stderr, "open log file \"%s\" to write fail, " \ "errno: %d, error info: %s\n", \ pContext->log_filename, errno, STRERROR(errno)); pContext->log_fd = STDERR_FILENO; return errno != 0 ? errno : EACCES; } if (pContext->use_file_write_lock) { if ((result=file_try_write_lock(pContext->log_fd)) != 0) { close(pContext->log_fd); pContext->log_fd = STDERR_FILENO; return result; } } if (pContext->take_over_stderr) { if (dup2(pContext->log_fd, STDERR_FILENO) < 0) { fprintf(stderr, "file: "__FILE__", line: %d, " "call dup2 fail, errno: %d, error info: %s\n", __LINE__, errno, STRERROR(errno)); } } if (pContext->take_over_stdout) { if (dup2(pContext->log_fd, STDOUT_FILENO) < 0) { fprintf(stderr, "file: "__FILE__", line: %d, " "call dup2 fail, errno: %d, error info: %s\n", __LINE__, errno, STRERROR(errno)); } } pContext->current_size = lseek(pContext->log_fd, 0, SEEK_END); if (pContext->current_size < 0) { fprintf(stderr, "lseek file \"%s\" fail, " \ "errno: %d, error info: %s\n", \ pContext->log_filename, errno, STRERROR(errno)); return errno != 0 ? errno : EACCES; } if (pContext->current_size == 0 && pContext->print_header_callback != NULL) { log_print_header(pContext); } return 0; }
void log_set_header_callback(LogContext *pContext, LogHeaderCallback header_callback) { pContext->print_header_callback = header_callback; if (pContext->print_header_callback != NULL) { int64_t current_size; pthread_mutex_lock(&(pContext->log_thread_lock)); current_size = pContext->current_size; pthread_mutex_unlock(&(pContext->log_thread_lock)); if (current_size == 0) { log_print_header(pContext); } } }