|
|
|
@ -166,7 +166,7 @@ static const char SEPARATOR = '|';
@@ -166,7 +166,7 @@ static const char SEPARATOR = '|';
|
|
|
|
|
#define SEPSTR "|" |
|
|
|
|
static const char GPUSEP = ','; |
|
|
|
|
|
|
|
|
|
static const char *APIVERSION = "1.14"; |
|
|
|
|
static const char *APIVERSION = "1.15"; |
|
|
|
|
static const char *DEAD = "Dead"; |
|
|
|
|
static const char *SICK = "Sick"; |
|
|
|
|
static const char *NOSTART = "NoStart"; |
|
|
|
@ -339,7 +339,6 @@ static const char *JSON_PARAMETER = "parameter";
@@ -339,7 +339,6 @@ static const char *JSON_PARAMETER = "parameter";
|
|
|
|
|
#define MSG_ACCDENY 45 |
|
|
|
|
#define MSG_ACCOK 46 |
|
|
|
|
#define MSG_ENAPOOL 47 |
|
|
|
|
#define MSG_POOLPRIO 73 |
|
|
|
|
#define MSG_DISPOOL 48 |
|
|
|
|
#define MSG_ALRENAP 49 |
|
|
|
|
#define MSG_ALRDISP 50 |
|
|
|
@ -373,6 +372,8 @@ static const char *JSON_PARAMETER = "parameter";
@@ -373,6 +372,8 @@ static const char *JSON_PARAMETER = "parameter";
|
|
|
|
|
#define MSG_MINESTATS 70 |
|
|
|
|
#define MSG_MISCHK 71 |
|
|
|
|
#define MSG_CHECK 72 |
|
|
|
|
#define MSG_POOLPRIO 73 |
|
|
|
|
#define MSG_DUPPID 74 |
|
|
|
|
|
|
|
|
|
enum code_severity { |
|
|
|
|
SEVERITY_ERR, |
|
|
|
@ -386,6 +387,7 @@ enum code_parameters {
@@ -386,6 +387,7 @@ enum code_parameters {
|
|
|
|
|
PARAM_GPU, |
|
|
|
|
PARAM_PGA, |
|
|
|
|
PARAM_CPU, |
|
|
|
|
PARAM_PID, |
|
|
|
|
PARAM_GPUMAX, |
|
|
|
|
PARAM_PGAMAX, |
|
|
|
|
PARAM_CPUMAX, |
|
|
|
@ -503,6 +505,7 @@ struct CODES {
@@ -503,6 +505,7 @@ struct CODES {
|
|
|
|
|
{ SEVERITY_SUCC, MSG_ACCOK, PARAM_NONE, "Privileged access OK" }, |
|
|
|
|
{ SEVERITY_SUCC, MSG_ENAPOOL, PARAM_POOL, "Enabling pool %d:'%s'" }, |
|
|
|
|
{ SEVERITY_SUCC, MSG_POOLPRIO,PARAM_NONE, "Changed pool priorities" }, |
|
|
|
|
{ SEVERITY_ERR, MSG_DUPPID, PARAM_PID, "Duplicate pool specified %d" }, |
|
|
|
|
{ SEVERITY_SUCC, MSG_DISPOOL, PARAM_POOL, "Disabling pool %d:'%s'" }, |
|
|
|
|
{ SEVERITY_INFO, MSG_ALRENAP, PARAM_POOL, "Pool %d:'%s' already enabled" }, |
|
|
|
|
{ SEVERITY_INFO, MSG_ALRDISP, PARAM_POOL, "Pool %d:'%s' already disabled" }, |
|
|
|
@ -1064,6 +1067,7 @@ static char *message(int messageid, int paramid, char *param2, bool isjson)
@@ -1064,6 +1067,7 @@ static char *message(int messageid, int paramid, char *param2, bool isjson)
|
|
|
|
|
case PARAM_GPU: |
|
|
|
|
case PARAM_PGA: |
|
|
|
|
case PARAM_CPU: |
|
|
|
|
case PARAM_PID: |
|
|
|
|
sprintf(buf, codes[i].description, paramid); |
|
|
|
|
break; |
|
|
|
|
case PARAM_POOL: |
|
|
|
@ -2132,46 +2136,62 @@ static void enablepool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __
@@ -2132,46 +2136,62 @@ static void enablepool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __
|
|
|
|
|
|
|
|
|
|
static void poolpriority(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group) |
|
|
|
|
{ |
|
|
|
|
SETUP_STRTOK_TS; |
|
|
|
|
int total_pools_ = total_pools; // Keep a local copy, to be more threadsafe
|
|
|
|
|
char *a; |
|
|
|
|
int i, prio = 0, e = -1; |
|
|
|
|
char *ptr, *next; |
|
|
|
|
int i, pr, prio = 0; |
|
|
|
|
|
|
|
|
|
if (total_pools_ == 0) { |
|
|
|
|
// TODO: all cgminer code needs a mutex added everywhere for change
|
|
|
|
|
// access to total_pools and also parts of the pools[] array,
|
|
|
|
|
// just copying total_pools here wont solve that
|
|
|
|
|
|
|
|
|
|
if (total_pools == 0) { |
|
|
|
|
strcpy(io_buffer, message(MSG_NOPOOL, 0, NULL, isjson)); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool pools_changed[total_pools_]; |
|
|
|
|
for (i = 0; i < total_pools_; ++i) |
|
|
|
|
if (param == NULL || *param == '\0') { |
|
|
|
|
strcpy(io_buffer, message(MSG_MISPID, 0, NULL, isjson)); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
bool pools_changed[total_pools]; |
|
|
|
|
for (i = 0; i < total_pools; ++i) |
|
|
|
|
pools_changed[i] = false; |
|
|
|
|
|
|
|
|
|
a = strtok_ts(param, ","); |
|
|
|
|
do { |
|
|
|
|
i = strtol(a, &a, 10); |
|
|
|
|
if (unlikely(*a > 0x20 || i < 0 || i >= total_pools)) { |
|
|
|
|
e = (*a > 0x20) ? -2 : i; |
|
|
|
|
continue; |
|
|
|
|
next = param; |
|
|
|
|
while (next && *next) { |
|
|
|
|
ptr = next; |
|
|
|
|
next = strchr(ptr, ','); |
|
|
|
|
if (next) |
|
|
|
|
*(next++) = '\0'; |
|
|
|
|
|
|
|
|
|
i = atoi(ptr); |
|
|
|
|
if (i < 0 || i >= total_pools) { |
|
|
|
|
strcpy(io_buffer, message(MSG_INVPID, i, NULL, isjson)); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (pools_changed[i]) { |
|
|
|
|
strcpy(io_buffer, message(MSG_DUPPID, i, NULL, isjson)); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
pools[i]->prio = prio++; |
|
|
|
|
pools_changed[i] = true; |
|
|
|
|
} while ( (a = strtok_ts(NULL, ",")) ); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
for (i = 0; i < total_pools_; ++i) |
|
|
|
|
if (!pools_changed[i]) |
|
|
|
|
pools[i]->prio = prio++; |
|
|
|
|
// In priority order, cycle through the unchanged pools and append them
|
|
|
|
|
for (pr = 0; pr < total_pools; pr++) |
|
|
|
|
for (i = 0; i < total_pools; i++) { |
|
|
|
|
if (!pools_changed[i] && pools[i]->prio == pr) { |
|
|
|
|
pools[i]->prio = prio++; |
|
|
|
|
pools_changed[i] = true; |
|
|
|
|
break; |
|
|
|
|
} |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
if (current_pool()->prio) |
|
|
|
|
switch_pools(NULL); |
|
|
|
|
|
|
|
|
|
if (e != -1) { |
|
|
|
|
if (e == -2) |
|
|
|
|
strcpy(io_buffer, message(MSG_MISPID, 0, NULL, isjson)); |
|
|
|
|
else |
|
|
|
|
strcpy(io_buffer, message(MSG_INVPID, e, NULL, isjson)); |
|
|
|
|
return; |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|
strcpy(io_buffer, message(MSG_POOLPRIO, 0, NULL, isjson)); |
|
|
|
|
} |
|
|
|
|
|
|
|
|
|