1
0
mirror of https://github.com/GOSTSec/sgminer synced 2025-09-11 13:42:17 +00:00

Config writer fix

Reworked how the config writer works to properly save the config file.
Sometimes settings would get lost in profiles.

Also changed algorithm switch to only perform a soft reset and lowered
the verbosity of the algorithm switcher.
This commit is contained in:
ystarnaud 2014-07-09 14:22:38 -04:00
parent 8b44007901
commit f8fcbbcd0a
5 changed files with 453 additions and 724 deletions

2
api.c
View File

@ -1370,10 +1370,12 @@ static void minerconfig(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __
root = api_add_const(root, "ADL", (char *)adl, false);
root = api_add_string(root, "ADL in use", adlinuse, false);
root = api_add_const(root, "Strategy", strategies[pool_strategy].s, false);
root = api_add_int(root, "Rotate Period", &opt_rotate_period, false);
root = api_add_int(root, "Log Interval", &opt_log_interval, false);
root = api_add_const(root, "Device Code", DEVICECODE, false);
root = api_add_const(root, "OS", OSINFO, false);
root = api_add_bool(root, "Failover-Only", &opt_fail_only, false);
root = api_add_int(root, "Failover Switch Delay", &opt_fail_switch_delay, false);
root = api_add_int(root, "ScanTime", &opt_scantime, false);
root = api_add_int(root, "Queue", &opt_queue, false);
root = api_add_int(root, "Expiry", &opt_expiry, false);

View File

@ -732,6 +732,10 @@ char *load_config(const char *arg, const char *parentkey, void __maybe_unused *u
return JSON_MAX_DEPTH_ERR;
*/
//check if the file exists
if(access(arg, F_OK) == -1)
quit(1, "%s: file not found.", arg);
#if JANSSON_MAJOR_VERSION > 1
config = json_load_file(arg, 0, &err);
#else
@ -901,10 +905,8 @@ void apply_pool_profiles()
int i;
for (i=total_pools; i--;)
{
apply_pool_profile(pools[i]);
}
}
void apply_pool_profile(struct pool *pool)
{
@ -1073,26 +1075,69 @@ void apply_pool_profile(struct pool *pool)
applog(LOG_DEBUG, "Pool %i Worksize set to \"%s\"", pool->pool_no, pool->worksize);
}
//helper function to add json values to pool object
static bool build_pool_json_add(json_t *object, const char *key, const char *val, const char *str_compare, int id)
{
if(!empty_string(val))
{
if(safe_cmp(str_compare, val))
{
if(json_object_set(object, key, json_string(val)) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):%s", id, key);
return false;
}
}
}
/***************************************
* Config Writer Functions
****************************************/
return true;
/*******************************
* Helper macros
*******************************/
#define JSON_POOL_ERR "json_object_set() failed on pool(%d):%s"
#define JSON_PROFILE_ERR "json_object_set() failed on profile(%d):%s"
#define JSON_ROOT_ERR "Error: config_parser::write_config():\n json_object_set() failed on %s"
#ifndef json_pool_add
#define json_pool_add(obj, key, val, id) \
if(json_object_set(obj, key, val) == -1) { \
set_last_json_error(JSON_POOL_ERR, id, key); \
return NULL; \
}
#endif
#ifndef json_profile_add
#define json_profile_add(obj, key, val, parentkey, id) \
if(json_object_set(obj, key, val) == -1) { \
if(!empty_string(parentkey)) { \
set_last_json_error(JSON_PROFILE_ERR, id, key); \
return NULL; \
} else { \
applog(LOG_ERR, JSON_ROOT_ERR, key); \
return NULL; \
} \
}
#endif
#ifndef json_add
#define json_add(obj, key, val) \
if(json_object_set(obj, key, val) == -1) { \
applog(LOG_ERR, JSON_ROOT_ERR, key); \
return; \
}
#endif
// helper function to add json values to pool object
static json_t *build_pool_json_add(json_t *object, const char *key, const char *val, const char *str_compare, const char *default_compare, int id)
{
// if pool value is empty, abort
if (empty_string(val))
return object;
// check to see if its the same value as profile, abort if it is
if(safe_cmp(str_compare, val) == 0)
return object;
// check to see if it's the same value as default profile, abort if it is
if(safe_cmp(default_compare, val) == 0)
return object;
// not same value, add value to JSON
json_pool_add(object, key, json_string(val), id);
return object;
}
//builds the "pools" json array for config file
json_t *build_pool_json()
static json_t *build_pool_json()
{
json_t *pool_array, *obj;
struct pool *pool;
@ -1120,82 +1165,42 @@ json_t *build_pool_json()
// pool name
if(!empty_string(pool->name))
{
if(json_object_set(obj, "name", json_string(pool->name)) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):name", pool->pool_no);
return NULL;
}
}
json_pool_add(obj, "name", json_string(pool->name), pool->pool_no);
// add quota/url
if(pool->quota != 1)
{
if(json_object_set(obj, "quota", json_sprintf("%s%s%s%d;%s",
json_pool_add(obj, "quota", json_sprintf("%s%s%s%d;%s",
((pool->rpc_proxy)?(char *)proxytype(pool->rpc_proxytype):""),
((pool->rpc_proxy)?pool->rpc_proxy:""),
((pool->rpc_proxy)?"|":""),
pool->quota,
pool->rpc_url)) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):quota", pool->pool_no);
return NULL;
}
pool->rpc_url), pool->pool_no);
}
else
{
if(json_object_set(obj, "url", json_sprintf("%s%s%s%s",
json_pool_add(obj, "url", json_sprintf("%s%s%s%s",
((pool->rpc_proxy)?(char *)proxytype(pool->rpc_proxytype):""),
((pool->rpc_proxy)?pool->rpc_proxy:""),
((pool->rpc_proxy)?"|":""),
pool->rpc_url)) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):url", pool->pool_no);
return NULL;
}
pool->rpc_url), pool->pool_no);
}
// user
if(json_object_set(obj, "user", json_string(pool->rpc_user)) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):user", pool->pool_no);
return NULL;
}
json_pool_add(obj, "user", json_string(pool->rpc_user), pool->pool_no);
// pass
if(json_object_set(obj, "pass", json_string(pool->rpc_pass)) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):pass", pool->pool_no);
return NULL;
}
json_pool_add(obj, "pass", json_string(pool->rpc_pass), pool->pool_no);
if (!pool->extranonce_subscribe)
{
if(json_object_set(obj, "no-extranonce", json_true()) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):no-extranonce", pool->pool_no);
return NULL;
}
}
json_pool_add(obj, "no-extranonce", json_true(), pool->pool_no);
if (!empty_string(pool->description))
{
if(json_object_set(obj, "description", json_string(pool->description)) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):description", pool->pool_no);
return NULL;
}
}
json_pool_add(obj, "no-description", json_string(pool->description), pool->pool_no);
// if priority isnt the same as array index, specify it
if (pool->prio != i)
{
if(json_object_set(obj, "priority", json_sprintf("%d", pool->prio)) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):description", pool->pool_no);
return NULL;
}
}
json_pool_add(obj, "priority", json_sprintf("%d", pool->prio), pool->pool_no);
// if a profile was specified, add it then compare pool/profile settings to see what we write
if (!empty_string(pool->profile))
@ -1203,11 +1208,7 @@ json_t *build_pool_json()
if ((profile = get_profile(pool->profile)))
{
// save profile name
if(json_object_set(obj, "profile", json_string(pool->profile)) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):profile", pool->pool_no);
return NULL;
}
json_pool_add(obj, "profile", json_string(pool->profile), pool->pool_no);
}
// profile not found use default profile
else
@ -1221,71 +1222,70 @@ json_t *build_pool_json()
if (!cmp_algorithm(&pool->algorithm, &profile->algorithm))
{
// save algorithm name
if(json_object_set(obj, "algorithm", json_string(pool->algorithm.name)) == -1)
{
set_last_json_error("json_object_set() failed on pool(%d):algorithm", pool->pool_no);
return NULL;
}
json_pool_add(obj, "algorithm", json_string(pool->algorithm.name), pool->pool_no);
//TODO: add other options like nfactor etc...
// save nfactor also
if (pool->algorithm.type == ALGO_NSCRYPT)
json_pool_add(obj, "nfactor", json_sprintf("%d", profile->algorithm.nfactor), pool->pool_no);
}
// if pool and profile value doesn't match below, add it
// devices
if(!build_pool_json_add(obj, "device", pool->devices, profile->devices, pool->pool_no))
if (!build_pool_json_add(obj, "device", pool->devices, profile->devices, default_profile.devices, pool->pool_no))
return NULL;
// lookup-gap
if(!build_pool_json_add(obj, "lookup-gap", pool->lookup_gap, profile->lookup_gap, pool->pool_no))
return NULL;
//intensity
if(!build_pool_json_add(obj, "intensity", pool->intensity, profile->intensity, pool->pool_no))
return NULL;
//xintensity
if(!build_pool_json_add(obj, "xintensity", pool->xintensity, profile->xintensity, pool->pool_no))
if (!build_pool_json_add(obj, "lookup-gap", pool->lookup_gap, profile->lookup_gap, default_profile.lookup_gap, pool->pool_no))
return NULL;
// rawintensity
if(!build_pool_json_add(obj, "rawintensity", pool->rawintensity, profile->rawintensity, pool->pool_no))
if (!empty_string(pool->rawintensity))
if (!build_pool_json_add(obj, "rawintensity", pool->rawintensity, profile->rawintensity, default_profile.rawintensity, pool->pool_no))
return NULL;
// xintensity
else if (!empty_string(pool->xintensity))
if (!build_pool_json_add(obj, "xintensity", pool->xintensity, profile->xintensity, default_profile.xintensity, pool->pool_no))
return NULL;
// intensity
else
if (!build_pool_json_add(obj, "intensity", pool->intensity, profile->intensity, default_profile.intensity, pool->pool_no))
return NULL;
// shaders
if(!build_pool_json_add(obj, "shaders", pool->shaders, profile->shaders, pool->pool_no))
if (!build_pool_json_add(obj, "shaders", pool->shaders, profile->shaders, default_profile.shaders, pool->pool_no))
return NULL;
// thread_concurrency
if(!build_pool_json_add(obj, "thread-concurrency", pool->thread_concurrency, profile->thread_concurrency, pool->pool_no))
if (!build_pool_json_add(obj, "thread-concurrency", pool->thread_concurrency, profile->thread_concurrency, default_profile.thread_concurrency, pool->pool_no))
return NULL;
// worksize
if(!build_pool_json_add(obj, "worksize", pool->worksize, profile->worksize, pool->pool_no))
if (!build_pool_json_add(obj, "worksize", pool->worksize, profile->worksize, default_profile.worksize, pool->pool_no))
return NULL;
#ifdef HAVE_ADL
// gpu_engine
if(!build_pool_json_add(obj, "gpu-engine", pool->gpu_engine, profile->gpu_engine, pool->pool_no))
if (!build_pool_json_add(obj, "gpu-engine", pool->gpu_engine, profile->gpu_engine, default_profile.gpu_engine, pool->pool_no))
return NULL;
// gpu_memclock
if(!build_pool_json_add(obj, "gpu-memclock", pool->gpu_memclock, profile->gpu_memclock, pool->pool_no))
if (!build_pool_json_add(obj, "gpu-memclock", pool->gpu_memclock, profile->gpu_memclock, default_profile.gpu_memclock, pool->pool_no))
return NULL;
// gpu_threads
if(!build_pool_json_add(obj, "gpu-threads", pool->gpu_threads, profile->gpu_threads, pool->pool_no))
if (!build_pool_json_add(obj, "gpu-threads", pool->gpu_threads, profile->gpu_threads, default_profile.gpu_threads, pool->pool_no))
return NULL;
// gpu_fan
if(!build_pool_json_add(obj, "gpu-fan", pool->gpu_fan, profile->gpu_fan, pool->pool_no))
if (!build_pool_json_add(obj, "gpu-fan", pool->gpu_fan, profile->gpu_fan, default_profile.gpu_fan, pool->pool_no))
return NULL;
// gpu-powertune
if(!build_pool_json_add(obj, "gpu-powertune", pool->gpu_powertune, profile->gpu_powertune, pool->pool_no))
if (!build_pool_json_add(obj, "gpu-powertune", pool->gpu_powertune, profile->gpu_powertune, default_profile.gpu_powertune, pool->pool_no))
return NULL;
// gpu-vddc
if(!build_pool_json_add(obj, "gpu-vddc", pool->gpu_vddc, profile->gpu_vddc, pool->pool_no))
if (!build_pool_json_add(obj, "gpu-vddc", pool->gpu_vddc, profile->gpu_vddc, default_profile.gpu_vddc, pool->pool_no))
return NULL;
#endif
@ -1300,24 +1300,100 @@ json_t *build_pool_json()
return pool_array;
}
//helper function to add json values to profile object
static bool build_profile_json_add(json_t *object, const char *key, const char *val, const char *str_compare, bool isdefault, int id)
static json_t *build_profile_json_add(json_t *object, const char *key, const char *val, const char *str_compare, const bool isdefault, const char *parentkey, int id)
{
if(!empty_string(val))
{
//always add if default profile is this profile
if(safe_cmp(str_compare, val) || isdefault)
{
if(json_object_set(object, key, json_string(val)) == -1)
{
set_last_json_error("json_object_set() failed on profile(%d):%s", id, key);
return false;
}
}
//if default profile, make sure we sync profile and default_profile values...
if(isdefault)
val = str_compare;
// no value, return...
if(empty_string(val))
return object;
//if the value is the same as default profile and, the current profile is not default profile, return...
if((safe_cmp(str_compare, val) == 0) && isdefault == false)
return object;
json_profile_add(object, key, json_string(val), parentkey, id);
return object;
}
return true;
// helper function to write all the profile settings
static json_t *build_profile_settings_json(json_t *object, struct profile *profile, const bool isdefault, const char *parentkey)
{
// if algorithm is different than default profile or profile is default profile, add it
if (!cmp_algorithm(&default_profile.algorithm, &profile->algorithm) || isdefault)
{
// save algorithm name
json_profile_add(object, "algorithm", json_string(profile->algorithm.name), parentkey, profile->profile_no);
// save nfactor also
if (profile->algorithm.type == ALGO_NSCRYPT)
json_profile_add(object, "nfactor", json_sprintf("%u", profile->algorithm.nfactor), parentkey, profile->profile_no);
}
// devices
if (!build_profile_json_add(object, "device", profile->devices, default_profile.devices, isdefault, parentkey, profile->profile_no))
return NULL;
// lookup-gap
if (!build_profile_json_add(object, "lookup-gap", profile->lookup_gap, default_profile.lookup_gap, isdefault, parentkey, profile->profile_no))
return NULL;
// rawintensity
if (!empty_string(profile->rawintensity))
if(!build_profile_json_add(object, "rawintensity", profile->rawintensity, default_profile.rawintensity, isdefault, parentkey, profile->profile_no))
return NULL;
// xintensity
else if (!empty_string(profile->xintensity))
if(!build_profile_json_add(object, "xintensity", profile->xintensity, default_profile.xintensity, isdefault, parentkey, profile->profile_no))
return NULL;
// intensity
else if (!empty_string(profile->intensity))
if(!build_profile_json_add(object, "intensity", profile->intensity, default_profile.intensity, isdefault, parentkey, profile->profile_no))
return NULL;
//shaders
if (!build_profile_json_add(object, "shaders", profile->shaders, default_profile.shaders, isdefault, parentkey, profile->profile_no))
return NULL;
// thread_concurrency
if (!build_profile_json_add(object, "thread-concurrency", profile->thread_concurrency, default_profile.thread_concurrency, isdefault, parentkey, profile->profile_no))
return NULL;
// worksize
if (!build_profile_json_add(object, "worksize", profile->worksize, default_profile.worksize, isdefault, parentkey, profile->profile_no))
return NULL;
#ifdef HAVE_ADL
// gpu_engine
if (!build_profile_json_add(object, "gpu-engine", profile->gpu_engine, default_profile.gpu_engine, isdefault, parentkey, profile->profile_no))
return NULL;
// gpu_memclock
if (!build_profile_json_add(object, "gpu-memclock", profile->gpu_memclock, default_profile.gpu_memclock, isdefault, parentkey, profile->profile_no))
return NULL;
// gpu_threads
if (!build_profile_json_add(object, "gpu-threads", profile->gpu_threads, default_profile.gpu_threads, isdefault, parentkey, profile->profile_no))
return NULL;
// gpu_fan
if (!build_profile_json_add(object, "gpu-fan", profile->gpu_fan, default_profile.gpu_fan, isdefault, parentkey, profile->profile_no))
return NULL;
// gpu-powertune
if (!build_profile_json_add(object, "gpu-powertune", profile->gpu_powertune, default_profile.gpu_powertune, isdefault, parentkey, profile->profile_no))
return NULL;
// gpu-vddc
if (!build_profile_json_add(object, "gpu-vddc", profile->gpu_vddc, default_profile.gpu_vddc, isdefault, parentkey, profile->profile_no))
return NULL;
#endif
return object;
}
// builds the "profiles" json array for config file
@ -1328,7 +1404,7 @@ json_t *build_profile_json()
bool isdefault;
int i;
//create the "pools" array
// create the "profiles" array
if (!(profile_array = json_array()))
{
set_last_json_error("json_array() failed on profiles");
@ -1343,7 +1419,7 @@ json_t *build_profile_json()
if (!empty_string(default_profile.name))
{
if(!strcmp(profile->name, default_profile.name))
if (!strcasecmp(profile->name, default_profile.name))
isdefault = true;
}
@ -1356,85 +1432,11 @@ json_t *build_profile_json()
// profile name
if (!empty_string(profile->name))
{
if(json_object_set(obj, "name", json_string(profile->name)) == -1)
{
set_last_json_error("json_object_set() failed on profile(%d):name", profile->profile_no);
return NULL;
}
}
json_profile_add(obj, "name", json_string(profile->name), "profile", profile->profile_no);
//if algorithm is different than profile, add it - if default profile is the current profile, always add
if(!cmp_algorithm(&default_profile.algorithm, &profile->algorithm) || !strcasecmp(default_profile.name, profile->name))
{
//save algorithm name
if(json_object_set(obj, "algorithm", json_string(profile->algorithm.name)) == -1)
{
set_last_json_error("json_object_set() failed on profile(%d):algorithm", profile->profile_no);
// save profile settings
if(!build_profile_settings_json(obj, profile, isdefault, "profile"))
return NULL;
}
//TODO: add other options like nfactor etc...
}
//if pool and profile value doesn't match below, add it
//devices
if(!build_profile_json_add(obj, "device", profile->devices, default_profile.devices, isdefault, profile->profile_no))
return NULL;
//lookup-gap
if(!build_profile_json_add(obj, "lookup-gap", profile->lookup_gap, default_profile.lookup_gap, isdefault, profile->profile_no))
return NULL;
//intensity
if(!build_profile_json_add(obj, "intensity", profile->intensity, default_profile.intensity, isdefault, profile->profile_no))
return NULL;
//xintensity
if(!build_profile_json_add(obj, "xintensity", profile->xintensity, default_profile.xintensity, isdefault, profile->profile_no))
return NULL;
//rawintensity
if(!build_profile_json_add(obj, "rawintensity", profile->rawintensity, default_profile.rawintensity, isdefault, profile->profile_no))
return NULL;
//shaders
if(!build_profile_json_add(obj, "shaders", profile->shaders, default_profile.shaders, isdefault, profile->profile_no))
return NULL;
//thread_concurrency
if(!build_profile_json_add(obj, "thread-concurrency", profile->thread_concurrency, default_profile.thread_concurrency, isdefault, profile->profile_no))
return NULL;
//worksize
if(!build_profile_json_add(obj, "worksize", profile->worksize, default_profile.worksize, isdefault, profile->profile_no))
return NULL;
#ifdef HAVE_ADL
//gpu_engine
if(!build_profile_json_add(obj, "gpu-engine", profile->gpu_engine, default_profile.gpu_engine, isdefault, profile->profile_no))
return NULL;
//gpu_memclock
if(!build_profile_json_add(obj, "gpu-memclock", profile->gpu_memclock, default_profile.gpu_memclock, isdefault, profile->profile_no))
return NULL;
//gpu_threads
if(!build_profile_json_add(obj, "gpu-threads", profile->gpu_threads, default_profile.gpu_threads, isdefault, profile->profile_no))
return NULL;
//gpu_fan
if(!build_profile_json_add(obj, "gpu-fan", profile->gpu_fan, default_profile.gpu_fan, isdefault, profile->profile_no))
return NULL;
//gpu-powertune
if(!build_profile_json_add(obj, "gpu-powertune", profile->gpu_powertune, default_profile.gpu_powertune, isdefault, profile->profile_no))
return NULL;
//gpu-vddc
if(!build_profile_json_add(obj, "gpu-vddc", profile->gpu_vddc, default_profile.gpu_vddc, isdefault, profile->profile_no))
return NULL;
#endif
// all done, add pool to array...
if(json_array_append_new(profile_array, obj) == -1)
@ -1454,6 +1456,7 @@ void write_config(const char *filename)
char *p, *optname;
int i;
// json root
if (!(config = json_object()))
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object() failed on root.");
@ -1492,205 +1495,33 @@ void write_config(const char *filename)
switch (pool_strategy)
{
case POOL_BALANCE:
if(json_object_set(config, "balance", json_true()) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on balance");
return;
}
json_add(config, "balance", json_true());
break;
case POOL_LOADBALANCE:
if(json_object_set(config, "load-balance", json_true()) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on load-balance");
return;
}
json_add(config, "load-balance", json_true());
break;
case POOL_ROUNDROBIN:
if(json_object_set(config, "round-robin", json_true()) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on round-robin");
return;
}
json_add(config, "round-robin", json_true());
break;
case POOL_ROTATE:
if(json_object_set(config, "rotate", json_sprintf("%d", opt_rotate_period)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on rotate");
return;
}
json_add(config, "rotate", json_sprintf("%d", opt_rotate_period));
break;
//default failover only
default:
if(json_object_set(config, "failover-only", json_true()) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on failover-only");
return;
}
json_add(config, "failover-only", json_true());
break;
}
//if using a specific profile as default, set it
if (!empty_string(default_profile.name))
{
if(json_object_set(config, "default-profile", json_string(default_profile.name)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on default_profile");
return;
}
json_add(config, "default-profile", json_string(default_profile.name));
}
//otherwise save default profile values
else
{
//save algorithm name
if(json_object_set(config, "algorithm", json_string(default_profile.algorithm.name)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on algorithm");
// save default profile settings
if(!build_profile_settings_json(config, &default_profile, true, ""))
return;
}
//TODO: add other options like nfactor etc...
//devices
if(!empty_string(default_profile.devices))
{
if(json_object_set(config, "devices", json_string(default_profile.devices)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on devices");
return;
}
}
//lookup-gap
if(!empty_string(default_profile.lookup_gap))
{
if(json_object_set(config, "lookup-gap", json_string(default_profile.lookup_gap)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on lookup-gap");
return;
}
}
//intensity
if(!empty_string(default_profile.intensity))
{
if(json_object_set(config, "intensity", json_string(default_profile.intensity)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on intensity");
return;
}
}
//xintensity
if(!empty_string(default_profile.xintensity))
{
if(json_object_set(config, "xintensity", json_string(default_profile.xintensity)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on xintensity");
return;
}
}
//rawintensity
if(!empty_string(default_profile.rawintensity))
{
if(json_object_set(config, "rawintensity", json_string(default_profile.rawintensity)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on rawintensity");
return;
}
}
//shaders
if(!empty_string(default_profile.shaders))
{
if(json_object_set(config, "shaders", json_string(default_profile.shaders)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on shaders");
return;
}
}
//thread_concurrency
if(!empty_string(default_profile.thread_concurrency))
{
if(json_object_set(config, "thread-concurrency", json_string(default_profile.thread_concurrency)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on thread_concurrency");
return;
}
}
//worksize
if(!empty_string(default_profile.worksize))
{
if(json_object_set(config, "worksize", json_string(default_profile.worksize)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on worksize");
return;
}
}
#ifdef HAVE_ADL
//gpu_engine
if(!empty_string(default_profile.gpu_engine))
{
if(json_object_set(config, "gpu-engine", json_string(default_profile.gpu_engine)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on gpu-engine");
return;
}
}
//gpu_memclock
if(!empty_string(default_profile.gpu_memclock))
{
if(json_object_set(config, "gpu-memclock", json_string(default_profile.gpu_memclock)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on gpu-memclock");
return;
}
}
//gpu_threads
if(!empty_string(default_profile.gpu_threads))
{
if(json_object_set(config, "gpu-threads", json_string(default_profile.gpu_threads)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on gpu-threads");
return;
}
}
//gpu_fan
if(!empty_string(default_profile.gpu_fan))
{
if(json_object_set(config, "gpu-fan", json_string(default_profile.gpu_fan)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on gpu-fan");
return;
}
}
//gpu-powertune
if(!empty_string(default_profile.gpu_powertune))
{
if(json_object_set(config, "gpu-powertune", json_string(default_profile.gpu_powertune)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on gpu-powertune");
return;
}
}
//gpu-vddc
if(!empty_string(default_profile.gpu_vddc))
{
if(json_object_set(config, "gpu-vddc", json_string(default_profile.gpu_vddc)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on gpu-vddc");
return;
}
}
#endif
}
//devices
/*if(opt_devs_enabled)
@ -1725,90 +1556,50 @@ void write_config(const char *filename)
//remove-disabled
if(opt_removedisabled)
{
if(json_object_set(config, "remove-disabled", json_true()) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on remove-disabled");
return;
}
}
json_add(config, "remove-disabled", json_true());
//write gpu settings that aren't part of profiles -- only write if gpus are available
if(nDevs)
{
#ifdef HAVE_ADL
//temp-cutoff
for(i = 0;i < nDevs; i++)
obj = json_sprintf("%s%s%d", ((i > 0)?json_string_value(obj):""), ((i > 0)?",":""), gpus[i].cutofftemp);
if(json_object_set(config, "temp-cutoff", obj) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on temp-cutoff");
return;
}
json_add(config, "temp-cutoff", obj);
//temp-overheat
for(i = 0;i < nDevs; i++)
obj = json_sprintf("%s%s%d", ((i > 0)?json_string_value(obj):""), ((i > 0)?",":""), gpus[i].adl.overtemp);
if(json_object_set(config, "temp-overheat", obj) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on temp-overheat");
return;
}
json_add(config, "temp-overheat", obj);
//temp-target
for(i = 0;i < nDevs; i++)
obj = json_sprintf("%s%s%d", ((i > 0)?json_string_value(obj):""), ((i > 0)?",":""), gpus[i].adl.targettemp);
if(json_object_set(config, "temp-target", obj) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on temp-target");
return;
}
json_add(config, "temp-target", obj);
//reorder gpus
if(opt_reorder)
{
if(json_object_set(config, "gpu-reorder", json_true()) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on gpu-reorder");
return;
}
}
json_add(config, "gpu-reorder", json_true());
//gpu-memdiff
//gpu-memdiff - FIXME: should be moved to pool/profile options
for(i = 0;i < nDevs; i++)
obj = json_sprintf("%s%s%d", ((i > 0)?json_string_value(obj):""), ((i > 0)?",":""), (int)gpus[i].gpu_memdiff);
if(json_object_set(config, "gpu-memdiff", obj) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on gpu-memdiff");
return;
}
json_add(config, "gpu-memdiff", obj);
#endif
}
//add other misc options
//shares
if(json_object_set(config, "shares", json_sprintf("%d", opt_shares)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on shares");
return;
}
json_add(config, "shares", json_sprintf("%d", opt_shares));
#if defined(unix) || defined(__APPLE__)
//monitor
if(opt_stderr_cmd && *opt_stderr_cmd)
{
if(json_object_set(config, "monitor", json_string(opt_stderr_cmd)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on monitor");
return;
}
}
json_add(config, "monitor", json_string(opt_stderr_cmd));
#endif // defined(unix)
//kernel path
@ -1819,104 +1610,45 @@ void write_config(const char *filename)
if(kpath[strlen(kpath)-1] == '/')
kpath[strlen(kpath)-1] = 0;
if(json_object_set(config, "kernel-path", json_string(kpath)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on kernel-path");
return;
}
json_add(config, "kernel-path", json_string(kpath));
}
//sched-time
if(schedstart.enable)
{
if(json_object_set(config, "sched-time", json_sprintf("%d:%d", schedstart.tm.tm_hour, schedstart.tm.tm_min)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on sched-time");
return;
}
}
json_add(config, "sched-time", json_sprintf("%d:%d", schedstart.tm.tm_hour, schedstart.tm.tm_min));
//stop-time
if(schedstop.enable)
{
if(json_object_set(config, "stop-time", json_sprintf("%d:%d", schedstop.tm.tm_hour, schedstop.tm.tm_min)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on stop-time");
return;
}
}
json_add(config, "stop-time", json_sprintf("%d:%d", schedstop.tm.tm_hour, schedstop.tm.tm_min));
//socks-proxy
if(opt_socks_proxy && *opt_socks_proxy)
{
if(json_object_set(config, "socks-proxy", json_string(opt_socks_proxy)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on socks-proxy");
return;
}
}
json_add(config, "socks-proxy", json_string(opt_socks_proxy));
//api stuff
//api-allow
if(opt_api_allow)
{
if(json_object_set(config, "api-allow", json_string(opt_api_allow)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on api-allow");
return;
}
}
json_add(config, "api-allow", json_string(opt_api_allow));
//api-mcast-addr
if(strcmp(opt_api_mcast_addr, API_MCAST_ADDR) != 0)
{
if(json_object_set(config, "api-mcast-addr", json_string(opt_api_mcast_addr)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on api-mcast-addr");
return;
}
}
json_add(config, "api-mcast-addr", json_string(opt_api_mcast_addr));
//api-mcast-code
if(strcmp(opt_api_mcast_code, API_MCAST_CODE) != 0)
{
if(json_object_set(config, "api-mcast-code", json_string(opt_api_mcast_code)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on api-mcast-code");
return;
}
}
json_add(config, "api-mcast-code", json_string(opt_api_mcast_code));
//api-mcast-des
if(*opt_api_mcast_des)
{
if(json_object_set(config, "api-mcast-des", json_string(opt_api_mcast_des)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on api-mcast-des");
return;
}
}
json_add(config, "api-mcast-des", json_string(opt_api_mcast_des));
//api-description
if(strcmp(opt_api_description, PACKAGE_STRING) != 0)
{
if(json_object_set(config, "api-description", json_string(opt_api_description)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on api-description");
return;
}
}
json_add(config, "api-description", json_string(opt_api_description));
//api-groups
if(opt_api_groups)
{
if(json_object_set(config, "api-groups", json_string(opt_api_groups)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on api-groups");
return;
}
}
json_add(config, "api-groups", json_string(opt_api_groups));
//add other misc bool/int options
for(opt = opt_config_table; opt->type != OPT_END; opt++)
@ -1938,11 +1670,7 @@ void write_config(const char *filename)
((void *)opt->cb == (void *)opt_set_bool || (void *)opt->cb == (void *)opt_set_invbool) &&
(*(bool *)opt->u.arg == ((void *)opt->cb == (void *)opt_set_bool)))
{
if(json_object_set(config, p+2, json_true()) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on %s.", p+2);
return;
}
json_add(config, p+2, json_true());
break; //exit for loop... so we don't enter a duplicate value if an option has multiple names
}
//numeric types
@ -1952,11 +1680,7 @@ void write_config(const char *filename)
(void *)opt->cb_arg == (void *)set_int_0_to_10 ||
(void *)opt->cb_arg == (void *)set_int_1_to_10) && opt->desc != opt_hidden)
{
if(json_object_set(config, p+2, json_sprintf("%d", *(int *)opt->u.arg)) == -1)
{
applog(LOG_ERR, "Error: config_parser::write_config():\n json_object_set() failed on %s.", p+2);
return;
}
json_add(config, p+2, json_sprintf("%d", *(int *)opt->u.arg));
break; //exit for loop... so we don't enter a duplicate value if an option has multiple names
}
}

View File

@ -7,25 +7,6 @@
#include "api.h"
#include "algorithm.h"
//helper to check for empty or NULL strings
#ifndef empty_string
#define empty_string(str) ((str && str[0] != '\0')?0:1)
#endif
#ifndef safe_cmp
#define safe_cmp(val1, val2) (((val1 && strcasecmp(val1, val2) != 0) || empty_string(val1))?1:0)
#endif
#ifndef pool_cmp
#define pool_cmp(val1, val2) (((val1 && val2 && strcasecmp(val1, val2) == 0) || empty_string(val1))?1:0)
#endif
#ifndef isnull
#define isnull(str, default_str) ((str == NULL)?default_str:str)
#endif
//helper function to get a gpu option value
#ifndef gpu_opt
#define gpu_opt(i,optname) gpus[i].optname
#endif
//profile structure
struct profile {
int profile_no;

22
miner.h
View File

@ -245,6 +245,27 @@ enum drv_driver {
DRIVER_PARSE_COMMANDS(DRIVER_PROTOTYPE)
#endif
// helper to check for empty or NULL strings
#ifndef empty_string
#define empty_string(str) ((str && str[0] != '\0')?0:1)
#endif
// helper to safely compare strings: 0 = equal, 1 = not equal
#ifndef safe_cmp
#define safe_cmp(val1, val2) ((!empty_string(val1) && !empty_string(val2))?((strcasecmp(val1, val2) == 0)?0:1):((empty_string(val1) && empty_string(val2))?0:1))
#endif
// helper to pick pool settings or default profile settings
#ifndef pool_cmp
#define pool_cmp(val1, val2) (((val1 && val2 && strcasecmp(val1, val2) == 0) || empty_string(val1))?1:0)
#endif
// helper safely output a string
#ifndef isnull
#define isnull(str, default_str) ((str == NULL)?default_str:str)
#endif
// helper to get boolean value out of string
#ifndef strtobool
#define strtobool(str) ((str && (!strcasecmp(str, "true") || !strcasecmp(str, "yes") || !strcasecmp(str, "1")))?true:false)
#endif
enum alive {
LIFE_WELL,
LIFE_SICK,
@ -1003,6 +1024,7 @@ extern struct schedtime schedstop;
extern char *sgminer_path;
extern int opt_shares;
extern bool opt_fail_only;
extern int opt_fail_switch_delay;
extern bool opt_autofan;
extern bool opt_autoengine;
extern bool use_curses;

View File

@ -6084,10 +6084,6 @@ static unsigned long compare_pool_settings(struct pool *pool1, struct pool *pool
if(!pool1 || !pool2)
return 0;
//compare algorithm
if(!cmp_algorithm(&pool1->algorithm, &pool2->algorithm))
options |= (SWITCHER_APPLY_ALGO | SWITCHER_HARD_RESET);
//compare pool devices
opt1 = get_pool_setting(pool1->devices, ((!empty_string(default_profile.devices))?default_profile.devices:"all"));
opt2 = get_pool_setting(pool2->devices, ((!empty_string(default_profile.devices))?default_profile.devices:"all"));
@ -6104,6 +6100,10 @@ static unsigned long compare_pool_settings(struct pool *pool1, struct pool *pool
if(strcasecmp(opt1, opt2) != 0)
options |= (SWITCHER_APPLY_GT | SWITCHER_HARD_RESET);
//compare algorithm
if(!cmp_algorithm(&pool1->algorithm, &pool2->algorithm))
options |= (SWITCHER_APPLY_ALGO | ((!opt_isset(options, SWITCHER_HARD_RESET))?SWITCHER_SOFT_RESET:0));
//lookup gap
opt1 = get_pool_setting(pool1->lookup_gap, default_profile.lookup_gap);
opt2 = get_pool_setting(pool2->lookup_gap, default_profile.lookup_gap);
@ -6258,7 +6258,7 @@ static void get_work_prepare_thread(struct thr_info *mythr, struct work *work)
{
if((pool_switch_options = compare_pool_settings(pools[mythr->pool_no], work->pool)) == 0)
{
applog(LOG_NOTICE, "No settings change from pool %s...", isnull(get_pool_name(work->pool), ""));
applog(LOG_DEBUG, "No settings change from pool %s...", isnull(get_pool_name(work->pool), ""));
rd_lock(&mining_thr_lock);
@ -6305,7 +6305,7 @@ static void get_work_prepare_thread(struct thr_info *mythr, struct work *work)
{
const char *opt;
applog(LOG_NOTICE, "Applying pool settings for %s...", isnull(get_pool_name(work->pool), ""));
applog(LOG_DEBUG, "Applying pool settings for %s...", isnull(get_pool_name(work->pool), ""));
rd_lock(&mining_thr_lock);
// Shutdown all threads first (necessary)