Parse anything in the stratum socket if it's full without waiting. Empty the socket even if a connection is not needed in case there are share returns.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47
diff --git a/cgminer.c b/cgminer.c
index 9849820..401de94 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -4643,7 +4643,7 @@ static void *stratum_thread(void *userdata)
/* Check to see whether we need to maintain this connection
* indefinitely or just bring it up when we switch to this
* pool */
- if (!cnx_needed(pool)) {
+ if (!sock_full(pool, false) && !cnx_needed(pool)) {
suspend_stratum(pool);
clear_stratum_shares(pool);
clear_pool_work(pool);
@@ -4668,7 +4668,7 @@ static void *stratum_thread(void *userdata)
* every minute so if we fail to receive any for 90 seconds we
* assume the connection has been dropped and treat this pool
* as dead */
- if (unlikely(select(pool->sock + 1, &rd, NULL, NULL, &timeout) < 1))
+ if (!sock_full(pool, false) && select(pool->sock + 1, &rd, NULL, NULL, &timeout) < 1)
s = NULL;
else
s = recv_line(pool);
diff --git a/util.c b/util.c
index 32d95d2..74270d5 100644
--- a/util.c
+++ b/util.c
@@ -930,7 +930,7 @@ bool stratum_send(struct pool *pool, char *s, ssize_t len)
}
/* Check to see if Santa's been good to you */
-static bool sock_full(struct pool *pool, bool wait)
+bool sock_full(struct pool *pool, bool wait)
{
SOCKETTYPE sock = pool->sock;
struct timeval timeout;
diff --git a/util.h b/util.h
index 253b61d..ed4c9f5 100644
--- a/util.h
+++ b/util.h
@@ -46,6 +46,7 @@ struct pool;
enum dev_reason;
struct cgpu_info;
bool stratum_send(struct pool *pool, char *s, ssize_t len);
+bool sock_full(struct pool *pool, bool wait);
char *recv_line(struct pool *pool);
bool parse_method(struct pool *pool, char *s);
bool extract_sockaddr(struct pool *pool, char *url);