mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-27 06:54:36 +00:00
modularized logging, support for priority based logging
Functions related to logging are extracted into dedicated source files for better maintainability. The existing low-level logging API is extended with a generalized scheme providing log functions log_{error, warning, notice, info, debug} that log messages based on a global opt_log_level. opt_log_level for now is set to LOG_NOTICE and might be modified via command line options or config files in future releases.
This commit is contained in:
parent
713e8be629
commit
e0fec35751
@ -26,17 +26,14 @@ cgminer_LDADD = $(DLOPEN_FLAGS) @LIBCURL_LIBS@ @JANSSON_LIBS@ @PTHREAD_LIBS@ \
|
|||||||
cgminer_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib @OPENCL_FLAGS@
|
cgminer_CPPFLAGS = -I$(top_builddir)/lib -I$(top_srcdir)/lib @OPENCL_FLAGS@
|
||||||
|
|
||||||
# common sources
|
# common sources
|
||||||
|
|
||||||
# this is the original monolithic main.c, kept as reference
|
|
||||||
# cgminer_SOURCES := main.c
|
|
||||||
|
|
||||||
# this is the original main.c without extracted CPU and GPU code
|
|
||||||
cgminer_SOURCES := cgminer.c
|
cgminer_SOURCES := cgminer.c
|
||||||
|
|
||||||
cgminer_SOURCES += elist.h miner.h compat.h bench_block.h \
|
cgminer_SOURCES += elist.h miner.h compat.h bench_block.h \
|
||||||
util.c uthash.h \
|
util.c uthash.h \
|
||||||
sha2.c sha2.h api.c
|
sha2.c sha2.h api.c
|
||||||
|
|
||||||
|
cgminer_SOURCES += logging.c
|
||||||
|
|
||||||
# GPU sources, TODO: make them selectable
|
# GPU sources, TODO: make them selectable
|
||||||
# the GPU portion extracted from original main.c
|
# the GPU portion extracted from original main.c
|
||||||
cgminer_SOURCES += device-gpu.h device-gpu.c
|
cgminer_SOURCES += device-gpu.h device-gpu.c
|
||||||
|
@ -78,7 +78,6 @@ static char packagename[255];
|
|||||||
|
|
||||||
int gpu_threads;
|
int gpu_threads;
|
||||||
|
|
||||||
bool opt_debug = false;
|
|
||||||
bool opt_protocol = false;
|
bool opt_protocol = false;
|
||||||
static bool want_longpoll = true;
|
static bool want_longpoll = true;
|
||||||
static bool have_longpoll = false;
|
static bool have_longpoll = false;
|
||||||
@ -92,7 +91,6 @@ static int opt_retries = -1;
|
|||||||
static int opt_fail_pause = 5;
|
static int opt_fail_pause = 5;
|
||||||
static int fail_pause = 5;
|
static int fail_pause = 5;
|
||||||
int opt_log_interval = 5;
|
int opt_log_interval = 5;
|
||||||
bool opt_log_output = false;
|
|
||||||
static int opt_queue = 1;
|
static int opt_queue = 1;
|
||||||
int opt_vectors;
|
int opt_vectors;
|
||||||
int opt_worksize;
|
int opt_worksize;
|
||||||
|
162
logging.c
Normal file
162
logging.c
Normal file
@ -0,0 +1,162 @@
|
|||||||
|
#include "logging.h"
|
||||||
|
#include "miner.h"
|
||||||
|
|
||||||
|
bool opt_debug = false;
|
||||||
|
bool opt_log_output = false;
|
||||||
|
|
||||||
|
/* per default priorities higher than LOG_NOTICE are logged */
|
||||||
|
int opt_log_level = LOG_NOTICE;
|
||||||
|
|
||||||
|
void vapplog(int prio, const char *fmt, va_list ap)
|
||||||
|
{
|
||||||
|
extern bool use_curses;
|
||||||
|
if (!opt_debug && prio == LOG_DEBUG)
|
||||||
|
return;
|
||||||
|
|
||||||
|
#ifdef HAVE_SYSLOG_H
|
||||||
|
if (use_syslog) {
|
||||||
|
vsyslog(prio, fmt, ap);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (0) {}
|
||||||
|
#endif
|
||||||
|
else if (opt_log_output || prio <= LOG_NOTICE) {
|
||||||
|
char *f;
|
||||||
|
int len;
|
||||||
|
struct timeval tv = { };
|
||||||
|
struct tm *tm;
|
||||||
|
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
|
||||||
|
tm = localtime(&tv.tv_sec);
|
||||||
|
|
||||||
|
len = 40 + strlen(fmt) + 22;
|
||||||
|
f = alloca(len);
|
||||||
|
sprintf(f, "[%d-%02d-%02d %02d:%02d:%02d] %s\n",
|
||||||
|
tm->tm_year + 1900,
|
||||||
|
tm->tm_mon + 1,
|
||||||
|
tm->tm_mday,
|
||||||
|
tm->tm_hour,
|
||||||
|
tm->tm_min,
|
||||||
|
tm->tm_sec,
|
||||||
|
fmt);
|
||||||
|
/* Only output to stderr if it's not going to the screen as well */
|
||||||
|
if (!isatty(fileno((FILE *)stderr))) {
|
||||||
|
va_list apc;
|
||||||
|
|
||||||
|
va_copy(apc, ap);
|
||||||
|
vfprintf(stderr, f, apc); /* atomic write to stderr */
|
||||||
|
fflush(stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (use_curses)
|
||||||
|
log_curses(prio, f, ap);
|
||||||
|
else {
|
||||||
|
int len = strlen(f);
|
||||||
|
|
||||||
|
strcpy(f + len - 1, " \n");
|
||||||
|
|
||||||
|
log_curses(prio, f, ap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
void applog(int prio, const char *fmt, ...)
|
||||||
|
{
|
||||||
|
va_list ap;
|
||||||
|
|
||||||
|
va_start(ap, fmt);
|
||||||
|
vapplog(prio, fmt, ap);
|
||||||
|
va_end(ap);
|
||||||
|
}
|
||||||
|
|
||||||
|
|
||||||
|
/* high-level logging functions, based on global opt_log_level */
|
||||||
|
|
||||||
|
/*
|
||||||
|
* generic log function used by priority specific ones
|
||||||
|
* equals vapplog() without additional priority checks
|
||||||
|
*/
|
||||||
|
static void log_generic(int prio, const char *fmt, va_list ap)
|
||||||
|
{
|
||||||
|
extern bool use_curses;
|
||||||
|
#ifdef HAVE_SYSLOG_H
|
||||||
|
if (use_syslog) {
|
||||||
|
vsyslog(prio, fmt, ap);
|
||||||
|
}
|
||||||
|
#else
|
||||||
|
if (0) {}
|
||||||
|
#endif
|
||||||
|
else {
|
||||||
|
char *f;
|
||||||
|
int len;
|
||||||
|
struct timeval tv = { };
|
||||||
|
struct tm *tm;
|
||||||
|
|
||||||
|
gettimeofday(&tv, NULL);
|
||||||
|
|
||||||
|
tm = localtime(&tv.tv_sec);
|
||||||
|
|
||||||
|
len = 40 + strlen(fmt) + 22;
|
||||||
|
f = alloca(len);
|
||||||
|
sprintf(f, "[%d-%02d-%02d %02d:%02d:%02d] %s\n",
|
||||||
|
tm->tm_year + 1900,
|
||||||
|
tm->tm_mon + 1,
|
||||||
|
tm->tm_mday,
|
||||||
|
tm->tm_hour,
|
||||||
|
tm->tm_min,
|
||||||
|
tm->tm_sec,
|
||||||
|
fmt);
|
||||||
|
/* Only output to stderr if it's not going to the screen as well */
|
||||||
|
if (!isatty(fileno((FILE *)stderr))) {
|
||||||
|
va_list apc;
|
||||||
|
|
||||||
|
va_copy(apc, ap);
|
||||||
|
vfprintf(stderr, f, apc); /* atomic write to stderr */
|
||||||
|
fflush(stderr);
|
||||||
|
}
|
||||||
|
|
||||||
|
if (use_curses)
|
||||||
|
log_curses(prio, f, ap);
|
||||||
|
else {
|
||||||
|
int len = strlen(f);
|
||||||
|
|
||||||
|
strcpy(f + len - 1, " \n");
|
||||||
|
|
||||||
|
log_curses(prio, f, ap);
|
||||||
|
}
|
||||||
|
}
|
||||||
|
}
|
||||||
|
/* we can not generalize variable argument list */
|
||||||
|
#define LOG_TEMPLATE(PRIO) \
|
||||||
|
if (PRIO <= opt_log_level) { \
|
||||||
|
va_list ap; \
|
||||||
|
va_start(ap, fmt); \
|
||||||
|
vapplog(PRIO, fmt, ap); \
|
||||||
|
va_end(ap); \
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_error(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
LOG_TEMPLATE(LOG_ERR);
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_warning(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
LOG_TEMPLATE(LOG_WARNING);
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_notice(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
LOG_TEMPLATE(LOG_NOTICE);
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_info(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
LOG_TEMPLATE(LOG_INFO);
|
||||||
|
}
|
||||||
|
|
||||||
|
void log_debug(const char *fmt, ...)
|
||||||
|
{
|
||||||
|
LOG_TEMPLATE(LOG_DEBUG);
|
||||||
|
}
|
38
logging.h
Normal file
38
logging.h
Normal file
@ -0,0 +1,38 @@
|
|||||||
|
#ifndef __LOGGING_H__
|
||||||
|
#define __LOGGING_H__
|
||||||
|
|
||||||
|
#include "config.h"
|
||||||
|
#include <stdbool.h>
|
||||||
|
#include <stdarg.h>
|
||||||
|
|
||||||
|
#ifdef HAVE_SYSLOG_H
|
||||||
|
#include <syslog.h>
|
||||||
|
#else
|
||||||
|
enum {
|
||||||
|
LOG_ERR,
|
||||||
|
LOG_WARNING,
|
||||||
|
LOG_NOTICE,
|
||||||
|
LOG_INFO,
|
||||||
|
LOG_DEBUG,
|
||||||
|
};
|
||||||
|
#endif
|
||||||
|
|
||||||
|
/* original / legacy debug flags */
|
||||||
|
extern bool opt_debug;
|
||||||
|
extern bool opt_log_output;
|
||||||
|
|
||||||
|
/* global log_level, messages with lower or equal prio are logged */
|
||||||
|
extern int opt_log_level;
|
||||||
|
|
||||||
|
/* low-level logging functions with priority parameter */
|
||||||
|
extern void vapplog(int prio, const char *fmt, va_list ap);
|
||||||
|
extern void applog(int prio, const char *fmt, ...);
|
||||||
|
|
||||||
|
/* high-level logging functions with implicit priority */
|
||||||
|
extern void log_error(const char *fmt, ...);
|
||||||
|
extern void log_warning(const char *fmt, ...);
|
||||||
|
extern void log_notice(const char *fmt, ...);
|
||||||
|
extern void log_info(const char *fmt, ...);
|
||||||
|
extern void log_debug(const char *fmt, ...);
|
||||||
|
|
||||||
|
#endif /* __LOGGING_H__ */
|
17
miner.h
17
miner.h
@ -11,6 +11,7 @@
|
|||||||
#include <curl/curl.h>
|
#include <curl/curl.h>
|
||||||
#include "elist.h"
|
#include "elist.h"
|
||||||
#include "uthash.h"
|
#include "uthash.h"
|
||||||
|
#include "logging.h"
|
||||||
|
|
||||||
#ifdef HAVE_OPENCL
|
#ifdef HAVE_OPENCL
|
||||||
#ifdef __APPLE_CC__
|
#ifdef __APPLE_CC__
|
||||||
@ -102,18 +103,6 @@ void *alloca (size_t);
|
|||||||
#endif
|
#endif
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
#ifdef HAVE_SYSLOG_H
|
|
||||||
#include <syslog.h>
|
|
||||||
#else
|
|
||||||
enum {
|
|
||||||
LOG_ERR,
|
|
||||||
LOG_WARNING,
|
|
||||||
LOG_NOTICE,
|
|
||||||
LOG_INFO,
|
|
||||||
LOG_DEBUG,
|
|
||||||
};
|
|
||||||
#endif
|
|
||||||
|
|
||||||
#undef unlikely
|
#undef unlikely
|
||||||
#undef likely
|
#undef likely
|
||||||
#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
|
#if defined(__GNUC__) && (__GNUC__ > 2) && defined(__OPTIMIZE__)
|
||||||
@ -403,9 +392,7 @@ static inline void rwlock_init(pthread_rwlock_t *lock)
|
|||||||
|
|
||||||
struct pool;
|
struct pool;
|
||||||
|
|
||||||
extern bool opt_debug;
|
|
||||||
extern bool opt_protocol;
|
extern bool opt_protocol;
|
||||||
extern bool opt_log_output;
|
|
||||||
extern char *opt_kernel_path;
|
extern char *opt_kernel_path;
|
||||||
extern char *opt_socks_proxy;
|
extern char *opt_socks_proxy;
|
||||||
extern char *cgminer_path;
|
extern char *cgminer_path;
|
||||||
@ -609,8 +596,6 @@ extern void switch_pools(struct pool *selected);
|
|||||||
extern void write_config(FILE *fcfg);
|
extern void write_config(FILE *fcfg);
|
||||||
extern void log_curses(int prio, const char *f, va_list ap);
|
extern void log_curses(int prio, const char *f, va_list ap);
|
||||||
extern void clear_logwin(void);
|
extern void clear_logwin(void);
|
||||||
extern void vapplog(int prio, const char *fmt, va_list ap);
|
|
||||||
extern void applog(int prio, const char *fmt, ...);
|
|
||||||
extern struct thread_q *tq_new(void);
|
extern struct thread_q *tq_new(void);
|
||||||
extern void tq_free(struct thread_q *tq);
|
extern void tq_free(struct thread_q *tq);
|
||||||
extern bool tq_push(struct thread_q *tq, void *data);
|
extern bool tq_push(struct thread_q *tq, void *data);
|
||||||
|
63
util.c
63
util.c
@ -65,69 +65,6 @@ struct tq_ent {
|
|||||||
struct list_head q_node;
|
struct list_head q_node;
|
||||||
};
|
};
|
||||||
|
|
||||||
void vapplog(int prio, const char *fmt, va_list ap)
|
|
||||||
{
|
|
||||||
extern bool use_curses;
|
|
||||||
if (!opt_debug && prio == LOG_DEBUG)
|
|
||||||
return;
|
|
||||||
|
|
||||||
#ifdef HAVE_SYSLOG_H
|
|
||||||
if (use_syslog) {
|
|
||||||
vsyslog(prio, fmt, ap);
|
|
||||||
}
|
|
||||||
#else
|
|
||||||
if (0) {}
|
|
||||||
#endif
|
|
||||||
else if (opt_log_output || prio <= LOG_NOTICE) {
|
|
||||||
char *f;
|
|
||||||
int len;
|
|
||||||
struct timeval tv = { };
|
|
||||||
struct tm *tm;
|
|
||||||
|
|
||||||
gettimeofday(&tv, NULL);
|
|
||||||
|
|
||||||
tm = localtime(&tv.tv_sec);
|
|
||||||
|
|
||||||
len = 40 + strlen(fmt) + 22;
|
|
||||||
f = alloca(len);
|
|
||||||
sprintf(f, "[%d-%02d-%02d %02d:%02d:%02d] %s\n",
|
|
||||||
tm->tm_year + 1900,
|
|
||||||
tm->tm_mon + 1,
|
|
||||||
tm->tm_mday,
|
|
||||||
tm->tm_hour,
|
|
||||||
tm->tm_min,
|
|
||||||
tm->tm_sec,
|
|
||||||
fmt);
|
|
||||||
/* Only output to stderr if it's not going to the screen as well */
|
|
||||||
if (!isatty(fileno((FILE *)stderr))) {
|
|
||||||
va_list apc;
|
|
||||||
|
|
||||||
va_copy(apc, ap);
|
|
||||||
vfprintf(stderr, f, apc); /* atomic write to stderr */
|
|
||||||
fflush(stderr);
|
|
||||||
}
|
|
||||||
|
|
||||||
if (use_curses)
|
|
||||||
log_curses(prio, f, ap);
|
|
||||||
else {
|
|
||||||
int len = strlen(f);
|
|
||||||
|
|
||||||
strcpy(f + len - 1, " \n");
|
|
||||||
|
|
||||||
log_curses(prio, f, ap);
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
void applog(int prio, const char *fmt, ...)
|
|
||||||
{
|
|
||||||
va_list ap;
|
|
||||||
|
|
||||||
va_start(ap, fmt);
|
|
||||||
vapplog(prio, fmt, ap);
|
|
||||||
va_end(ap);
|
|
||||||
}
|
|
||||||
|
|
||||||
static void databuf_free(struct data_buffer *db)
|
static void databuf_free(struct data_buffer *db)
|
||||||
{
|
{
|
||||||
if (!db)
|
if (!db)
|
||||||
|
Loading…
x
Reference in New Issue
Block a user