From ed8382c88dc986225fadd4099bd0625cbe5b47f1 Mon Sep 17 00:00:00 2001 From: Luke Dashjr Date: Mon, 12 Mar 2012 14:56:05 -0400 Subject: [PATCH] Make curses TUI support optional at compile-time. --- adl.c | 9 ++++++- cgminer.c | 71 +++++++++++++++++++++++++++++++++++++++++++++++++--- configure.ac | 31 ++++++++++++++++++++--- device-gpu.c | 10 ++++++++ logging.c | 43 ++++++++++++++++--------------- util.c | 1 - 6 files changed, 136 insertions(+), 29 deletions(-) diff --git a/adl.c b/adl.c index 7a4707e0..e561fa28 100644 --- a/adl.c +++ b/adl.c @@ -12,9 +12,12 @@ #if defined(HAVE_ADL) && (defined(__linux) || defined (WIN32)) #include -#include #include +#ifdef HAVE_CURSES +#include +#endif + #include "miner.h" #include "ADL_SDK/adl_sdk.h" #include "compat.h" @@ -850,6 +853,7 @@ static void get_vddcrange(int gpu, float *imin, float *imax) *imax = (float)ga->lpOdParameters.sVddc.iMax / 1000; } +#ifdef HAVE_CURSES static float curses_float(const char *query) { float ret; @@ -860,6 +864,7 @@ static float curses_float(const char *query) free(cvar); return ret; } +#endif int set_vddc(int gpu, float fVddc) { @@ -1138,6 +1143,7 @@ void set_defaultengine(int gpu) unlock_adl(); } +#ifdef HAVE_CURSES void change_autosettings(int gpu) { struct gpu_adl *ga = &gpus[gpu].adl; @@ -1294,6 +1300,7 @@ updated: sleep(1); goto updated; } +#endif void clear_adl(int nDevs) { diff --git a/cgminer.c b/cgminer.c index c336f8b4..217e7599 100644 --- a/cgminer.c +++ b/cgminer.c @@ -11,7 +11,9 @@ #include "config.h" +#ifdef HAVE_CURSES #include +#endif #include #include @@ -116,7 +118,13 @@ int gpu_threads; int opt_n_threads = -1; int mining_threads; int num_processors; -bool use_curses = true; +bool use_curses = +#ifdef HAVE_CURSES + true +#else + false +#endif +; static bool opt_submit_stale; static int opt_shares; static bool opt_fail_only; @@ -141,7 +149,9 @@ int longpoll_thr_id; static int stage_thr_id; static int watchpool_thr_id; static int watchdog_thr_id; +#ifdef HAVE_CURSES static int input_thr_id; +#endif int gpur_thr_id; static int api_thr_id; static int total_threads; @@ -151,7 +161,9 @@ struct work_restart *work_restart = NULL; static pthread_mutex_t hash_lock; static pthread_mutex_t qd_lock; static pthread_mutex_t *stgd_lock; +#ifdef HAVE_CURSES static pthread_mutex_t curses_lock; +#endif static pthread_rwlock_t blk_lock; pthread_rwlock_t netacc_lock; @@ -179,6 +191,9 @@ enum pool_strategy pool_strategy = POOL_FAILOVER; int opt_rotate_period; static int total_urls, total_users, total_passes, total_userpasses; +#ifndef HAVE_CURSES +const +#endif static bool curses_active = false; static char current_block[37]; @@ -828,7 +843,12 @@ static struct opt_table opt_config_table[] = { #endif OPT_WITHOUT_ARG("--text-only|-T", opt_set_invbool, &use_curses, - "Disable ncurses formatted screen output"), +#ifdef HAVE_CURSES + "Disable ncurses formatted screen output" +#else + opt_hidden +#endif + ), OPT_WITH_ARG("--url|-o", set_url, NULL, NULL, "URL for bitcoin JSON-RPC server"), @@ -1127,13 +1147,16 @@ static int requests_staged(void) return ret; } +#ifdef HAVE_CURSES WINDOW *mainwin, *statuswin, *logwin; +#endif double total_secs = 0.1; static char statusline[256]; static int devcursor, logstart, logcursor; struct cgpu_info gpus[MAX_GPUDEVICES]; /* Maximum number apparently possible */ struct cgpu_info *cpus; +#ifdef HAVE_CURSES static inline void unlock_curses(void) { mutex_unlock(&curses_lock); @@ -1154,6 +1177,7 @@ static bool curses_active_locked(void) unlock_curses(); return ret; } +#endif void tailsprintf(char *f, const char *fmt, ...) { @@ -1192,6 +1216,7 @@ static void text_print_status(int thr_id) } } +#ifdef HAVE_CURSES /* Must be called with curses mutex lock held and curses_active */ static void curses_print_status(void) { @@ -1274,6 +1299,7 @@ static void curses_print_devstatus(int thr_id) wclrtoeol(statuswin); } +#endif static void print_status(int thr_id) { @@ -1281,6 +1307,7 @@ static void print_status(int thr_id) text_print_status(thr_id); } +#ifdef HAVE_CURSES /* Check for window resize. Called with curses mutex locked */ static inline bool change_logwinsize(void) { @@ -1336,7 +1363,9 @@ void wlogprint(const char *f, ...) unlock_curses(); } } +#endif +#ifdef HAVE_CURSES void log_curses(int prio, const char *f, va_list ap) { bool high_prio; @@ -1366,6 +1395,7 @@ void clear_logwin(void) unlock_curses(); } } +#endif /* regenerate the full work->hash value and also return true if it's a block */ bool regeneratehash(const struct work *work) @@ -1700,6 +1730,7 @@ static void workio_cmd_free(struct workio_cmd *wc) free(wc); } +#ifdef HAVE_CURSES static void disable_curses(void) { if (curses_active_locked()) { @@ -1728,6 +1759,7 @@ static void disable_curses(void) unlock_curses(); } } +#endif static void print_summary(void); @@ -2259,6 +2291,7 @@ static bool stage_work(struct work *work) return true; } +#ifdef HAVE_CURSES int curses_int(const char *query) { int ret; @@ -2269,8 +2302,11 @@ int curses_int(const char *query) free(cvar); return ret; } +#endif +#ifdef HAVE_CURSES static bool input_pool(bool live); +#endif int active_pools(void) { @@ -2284,6 +2320,7 @@ int active_pools(void) return ret; } +#ifdef HAVE_CURSES static void display_pool_summary(struct pool *pool) { double efficiency = 0.0; @@ -2331,6 +2368,7 @@ static void remove_pool(struct pool *pool) pool->pool_no = total_pools; total_pools--; } +#endif void write_config(FILE *fcfg) { @@ -2481,6 +2519,7 @@ void write_config(FILE *fcfg) fputs("\n}", fcfg); } +#ifdef HAVE_CURSES static void display_pools(void) { struct pool *pool; @@ -2685,10 +2724,12 @@ retry: immedok(logwin, false); opt_loginput = false; } +#endif static void start_longpoll(void); static void stop_longpoll(void); +#ifdef HAVE_CURSES static void set_options(void) { int selected; @@ -2829,6 +2870,7 @@ static void *input_thread(void __maybe_unused *userdata) return NULL; } +#endif /* This thread should not be shut down unless a problem occurs */ static void *workio_thread(void *userdata) @@ -3709,6 +3751,7 @@ out: return NULL; } +__maybe_unused static void stop_longpoll(void) { struct thr_info *thr = &thr_info[longpoll_thr_id]; @@ -3795,6 +3838,7 @@ static void *watchdog_thread(void __maybe_unused *userdata) hashmeter(-1, &zero_tv, 0); +#ifdef HAVE_CURSES if (curses_active_locked()) { change_logwinsize(); curses_print_status(); @@ -3806,6 +3850,7 @@ static void *watchdog_thread(void __maybe_unused *userdata) wrefresh(logwin); unlock_curses(); } +#endif gettimeofday(&now, NULL); @@ -4010,7 +4055,9 @@ static void clean_up(void) #endif gettimeofday(&total_tv_end, NULL); +#ifdef HAVE_CURSES disable_curses(); +#endif if (!opt_realquiet && successful_connect) print_summary(); @@ -4037,6 +4084,7 @@ void quit(int status, const char *format, ...) exit(status); } +#ifdef HAVE_CURSES char *curses_input(const char *query) { char *input; @@ -4054,6 +4102,7 @@ char *curses_input(const char *query) noecho(); return input; } +#endif int add_pool_details(bool live, char *url, char *user, char *pass) { @@ -4089,6 +4138,7 @@ int add_pool_details(bool live, char *url, char *user, char *pass) return ADD_POOL_OK; } +#ifdef HAVE_CURSES static bool input_pool(bool live) { char *url = NULL, *user = NULL, *pass = NULL; @@ -4140,6 +4190,7 @@ out: } return ret; } +#endif #if defined(unix) static void fork_monitor() @@ -4209,6 +4260,7 @@ out: } #endif // defined(unix) +#ifdef HAVE_CURSES void enable_curses(void) { int x,y; @@ -4231,6 +4283,7 @@ void enable_curses(void) { curses_active = true; unlock_curses(); } +#endif /* TODO: fix need a dummy CPU device_api even if no support for CPU mining */ #ifndef WANT_CPUMINE @@ -4280,7 +4333,9 @@ int main (int argc, char *argv[]) mutex_init(&hash_lock); mutex_init(&qd_lock); +#ifdef HAVE_CURSES mutex_init(&curses_lock); +#endif mutex_init(&control_lock); rwlock_init(&blk_lock); rwlock_init(&netacc_lock); @@ -4362,8 +4417,10 @@ int main (int argc, char *argv[]) successful_connect = true; } +#ifdef HAVE_CURSES if (use_curses) enable_curses(); +#endif applog(LOG_WARNING, "Started %s", packagename); @@ -4467,14 +4524,18 @@ int main (int argc, char *argv[]) logstart += total_devices; logcursor = logstart + 1; +#ifdef HAVE_CURSES check_winsizes(); if (opt_realquiet) use_curses = false; +#endif if (!total_pools) { applog(LOG_WARNING, "Need to specify at least one pool server."); - if (!use_curses || (use_curses && !input_pool(false))) +#ifdef HAVE_CURSES + if (!use_curses || !input_pool(false)) +#endif quit(1, "Pool setup failed"); } @@ -4596,6 +4657,7 @@ int main (int argc, char *argv[]) applog(LOG_WARNING, "Pool: %d URL: %s User: %s Password: %s", i, pool->rpc_url, pool->rpc_user, pool->rpc_pass); } +#ifdef HAVE_CURSES if (use_curses) { halfdelay(150); applog(LOG_ERR, "Press any key to exit, or cgminer will try again in 15s."); @@ -4603,6 +4665,7 @@ int main (int argc, char *argv[]) quit(0, "No servers could be used! Exiting."); nocbreak(); } else +#endif quit(0, "No servers could be used! Exiting."); } } while (!pools_active); @@ -4707,6 +4770,7 @@ begin_bench: quit(1, "API thread create failed"); pthread_detach(thr->pth); +#ifdef HAVE_CURSES /* Create curses input thread for keyboard input. Create this last so * that we know all threads are created since this can call kill_work * to try and shut down ll previous threads. */ @@ -4715,6 +4779,7 @@ begin_bench: if (thr_info_create(thr, NULL, input_thread, thr)) quit(1, "input thread create failed"); pthread_detach(thr->pth); +#endif /* main loop - simply wait for workio thread to exit. This is not the * normal exit path and only occurs should the workio_thread die diff --git a/configure.ac b/configure.ac index f505383a..a6a97d84 100644 --- a/configure.ac +++ b/configure.ac @@ -207,12 +207,33 @@ if test "x$icarus" = xyes; then fi AM_CONDITIONAL([HAS_ICARUS], [test x$icarus = xyes]) -AC_SEARCH_LIBS(addstr, ncurses pdcurses, , - AC_MSG_ERROR([Could not find curses library - please install libncurses-dev or pdcurses-dev])) -AC_CHECK_LIB(ncurses, addstr, NCURSES_LIBS=-lncurses) -AC_CHECK_LIB(pdcurses, addstr, PDCURSES_LIBS=-lpdcurses) +curses="auto" +AC_ARG_WITH([curses], + [AC_HELP_STRING([--without-curses],[Compile support for curses TUI (default enabled)])], + [curses=$withval] + ) +if test "x$curses" = "xno"; then + cursesmsg='User specified --without-curses. TUI support DISABLED' +else + AC_SEARCH_LIBS(addstr, ncurses pdcurses, [ + curses=yes + cursesmsg="FOUND: ${ac_cv_search_addstr:2}" + AC_DEFINE([HAVE_CURSES], [1], [Defined to 1 if curses TUI support is wanted]) + ], [ + if test "x$curses" = "xyes"; then + AC_MSG_ERROR([Could not find curses library - please install libncurses-dev or pdcurses-dev (or configure --without-curses)]) + else + AC_MSG_WARN([Could not find curses library - if you want a TUI, install libncurses-dev or pdcurses-dev]) + curses=no + cursesmsg='NOT FOUND. TUI support DISABLED' + fi + ]) +fi + + +AM_CONDITIONAL([HAVE_CURSES], [test x$curses = xyes]) AM_CONDITIONAL([WANT_JANSSON], [test x$request_jansson = xtrue]) AM_CONDITIONAL([HAVE_WINDOWS], [test x$have_win32 = xtrue]) AM_CONDITIONAL([HAVE_x86_64], [test x$have_x86_64 = xtrue]) @@ -365,6 +386,8 @@ echo echo "Configuration Options Summary:" echo +echo " curses.TUI...........: $cursesmsg" + if test "x$opencl" != xno; then if test $found_opencl = 1; then echo " OpenCL...............: FOUND. GPU mining support enabled" diff --git a/device-gpu.c b/device-gpu.c index 70dea39f..1a3e35d9 100644 --- a/device-gpu.c +++ b/device-gpu.c @@ -11,7 +11,10 @@ #include "config.h" +#ifdef HAVE_CURSES #include +#endif + #include #include #include @@ -32,8 +35,10 @@ /* TODO: cleanup externals ********************/ +#ifdef HAVE_CURSES extern WINDOW *mainwin, *statuswin, *logwin; extern void enable_curses(void); +#endif extern int mining_threads; extern double total_secs; @@ -526,6 +531,9 @@ void pause_dynamic_threads(int gpu) struct device_api opencl_api; +#endif /* HAVE_OPENCL */ + +#if defined(HAVE_OPENCL) && defined(HAVE_CURSES) void manage_gpu(void) { struct thr_info *thr; @@ -1177,11 +1185,13 @@ static bool opencl_thread_prepare(struct thr_info *thr) applog(LOG_ERR, "Restarting the GPU from the menu will not fix this."); applog(LOG_ERR, "Try restarting cgminer."); failmessage = true; +#ifdef HAVE_CURSES if (use_curses) { buf = curses_input("Press enter to continue"); if (buf) free(buf); } +#endif } cgpu->deven = DEV_DISABLED; cgpu->status = LIFE_NOSTART; diff --git a/logging.c b/logging.c index a73db086..cf5e4030 100644 --- a/logging.c +++ b/logging.c @@ -18,9 +18,29 @@ 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) +static void my_log_curses(int prio, char *f, va_list ap) { +#ifdef HAVE_CURSES extern bool use_curses; + if (use_curses) + log_curses(prio, f, ap); + else +#endif + { + int len = strlen(f); + + strcpy(f + len - 1, " \n"); + +#ifdef HAVE_CURSES + log_curses(prio, f, ap); +#else + vprintf(f, ap); +#endif + } +} + +void vapplog(int prio, const char *fmt, va_list ap) +{ if (!opt_debug && prio == LOG_DEBUG) return; @@ -60,15 +80,7 @@ void vapplog(int prio, const char *fmt, va_list ap) 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); - } + my_log_curses(prio, f, ap); } } @@ -90,7 +102,6 @@ void applog(int prio, const char *fmt, ...) */ static void __maybe_unused 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); @@ -127,15 +138,7 @@ static void __maybe_unused log_generic(int prio, const char *fmt, va_list ap) 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); - } + my_log_curses(prio, f, ap); } } /* we can not generalize variable argument list */ diff --git a/util.c b/util.c index 3dff4ee1..6a5dcd84 100644 --- a/util.c +++ b/util.c @@ -19,7 +19,6 @@ #include #include #include -#include #include #include #include