Browse Source

Merge branch 'rpc_poolpriority' into bfgminer

Conflicts:
	API-README
Luke Dashjr 13 years ago
parent
commit
8084bfe0ca
3 changed files with 72 additions and 3 deletions
  1. 14 2
      API-README
  2. 48 0
      api.c
  3. 10 1
      compat.h

+ 14 - 2
API-README

@@ -177,6 +177,11 @@ The list of requests - a (*) means it requires privileged access - and replies a
                               Use '\\' to get a '\' and '\,' to include a comma
                               Use '\\' to get a '\' and '\,' to include a comma
                               inside URL, USR or PASS
                               inside URL, USR or PASS
 
 
+ poolpriority|N,... (*)
+               none           There is no reply section just the STATUS section
+                              stating the results of changing pool priorities
+                              See usage below
+
  disablepool|N (*)
  disablepool|N (*)
                none           There is no reply section just the STATUS section
                none           There is no reply section just the STATUS section
                               stating the results of disabling pool N
                               stating the results of disabling pool N
@@ -271,8 +276,15 @@ The list of requests - a (*) means it requires privileged access - and replies a
 When you enable, disable or restart a GPU or PGA, you will also get Thread messages
 When you enable, disable or restart a GPU or PGA, you will also get Thread messages
 in the BFGMiner status window
 in the BFGMiner status window
 
 
-When you switch to a different pool to the current one, you will get a
-'Switching to URL' message in the BFGMiner status windows
+The 'poolpriority' command can be used to reset the priority order of pools.
+Each pool should be listed by id number in order of preference (first = most
+preferred). Any pools not listed will be prioritized after the ones that are,
+in an undefined order. If the priority change affects the miner's preference
+for mining, it may switch immediately.
+
+When you switch to a different pool to the current one (including by priority
+change), you will get a 'Switching to URL' message in the BFGMiner status
+windows
 
 
 Obviously, the JSON format is simply just the names as given before the '='
 Obviously, the JSON format is simply just the names as given before the '='
 with the values after the '='
 with the values after the '='

+ 48 - 0
api.c

@@ -340,6 +340,7 @@ static const char *JSON_PARAMETER = "parameter";
 #define MSG_ACCDENY 45
 #define MSG_ACCDENY 45
 #define MSG_ACCOK 46
 #define MSG_ACCOK 46
 #define MSG_ENAPOOL 47
 #define MSG_ENAPOOL 47
+#define MSG_POOLPRIO 73
 #define MSG_DISPOOL 48
 #define MSG_DISPOOL 48
 #define MSG_ALRENAP 49
 #define MSG_ALRENAP 49
 #define MSG_ALRDISP 50
 #define MSG_ALRDISP 50
@@ -502,6 +503,7 @@ struct CODES {
  { SEVERITY_ERR,   MSG_ACCDENY,	PARAM_STR,	"Access denied to '%s' command" },
  { SEVERITY_ERR,   MSG_ACCDENY,	PARAM_STR,	"Access denied to '%s' command" },
  { SEVERITY_SUCC,  MSG_ACCOK,	PARAM_NONE,	"Privileged access OK" },
  { SEVERITY_SUCC,  MSG_ACCOK,	PARAM_NONE,	"Privileged access OK" },
  { SEVERITY_SUCC,  MSG_ENAPOOL,	PARAM_POOL,	"Enabling pool %d:'%s'" },
  { SEVERITY_SUCC,  MSG_ENAPOOL,	PARAM_POOL,	"Enabling pool %d:'%s'" },
+ { SEVERITY_SUCC,  MSG_POOLPRIO,PARAM_NONE,	"Changed pool priorities" },
  { SEVERITY_SUCC,  MSG_DISPOOL,	PARAM_POOL,	"Disabling pool %d:'%s'" },
  { SEVERITY_SUCC,  MSG_DISPOOL,	PARAM_POOL,	"Disabling pool %d:'%s'" },
  { SEVERITY_INFO,  MSG_ALRENAP,	PARAM_POOL,	"Pool %d:'%s' already enabled" },
  { SEVERITY_INFO,  MSG_ALRENAP,	PARAM_POOL,	"Pool %d:'%s' already enabled" },
  { SEVERITY_INFO,  MSG_ALRDISP,	PARAM_POOL,	"Pool %d:'%s' already disabled" },
  { SEVERITY_INFO,  MSG_ALRDISP,	PARAM_POOL,	"Pool %d:'%s' already disabled" },
@@ -2054,6 +2056,51 @@ static void enablepool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __
 	strcpy(io_buffer, message(MSG_ENAPOOL, id, NULL, isjson));
 	strcpy(io_buffer, message(MSG_ENAPOOL, id, NULL, 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;
+
+	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)
+		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;
+		}
+		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++;
+
+	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));
+}
+
 static void disablepool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group)
 static void disablepool(__maybe_unused SOCKETTYPE c, char *param, bool isjson, __maybe_unused char group)
 {
 {
 	struct pool *pool;
 	struct pool *pool;
@@ -2586,6 +2633,7 @@ struct CMDS {
 	{ "cpucount",		cpucount,	false },
 	{ "cpucount",		cpucount,	false },
 	{ "switchpool",		switchpool,	true },
 	{ "switchpool",		switchpool,	true },
 	{ "addpool",		addpool,	true },
 	{ "addpool",		addpool,	true },
+	{ "poolpriority",	poolpriority,	true },
 	{ "enablepool",		enablepool,	true },
 	{ "enablepool",		enablepool,	true },
 	{ "disablepool",	disablepool,	true },
 	{ "disablepool",	disablepool,	true },
 	{ "removepool",		removepool,	true },
 	{ "removepool",		removepool,	true },

+ 10 - 1
compat.h

@@ -9,6 +9,10 @@
 
 
 #include <windows.h>
 #include <windows.h>
 
 
+// NOTE: Windows strtok uses a thread-local static buffer, so this is safe
+#define SETUP_STRTOK_TS  /*nothing needed*/
+#define strtok_ts  strtok
+
 #include "miner.h"  // for timersub
 #include "miner.h"  // for timersub
 
 
 static inline int nanosleep(const struct timespec *req, struct timespec *rem)
 static inline int nanosleep(const struct timespec *req, struct timespec *rem)
@@ -71,8 +75,13 @@ typedef long suseconds_t;
 #endif
 #endif
 
 
 #define PTH(thr) ((thr)->pth.p)
 #define PTH(thr) ((thr)->pth.p)
-#else
+#else /* ! WIN32 */
+
 #define PTH(thr) ((thr)->pth)
 #define PTH(thr) ((thr)->pth)
+
+#define SETUP_STRTOK_TS  char*_strtok_ts_saveptr
+#define strtok_ts(str, delim)  strtok_r(str, delim, &_strtok_ts_saveptr)
+
 #endif /* WIN32 */
 #endif /* WIN32 */
 
 
 #endif /* __COMPAT_H__ */
 #endif /* __COMPAT_H__ */