Browse Source

The moment we receive any real data on a long poll link, it ceases to be idle

Luke Dashjr 13 years ago
parent
commit
51b1f24baf
2 changed files with 16 additions and 1 deletions
  1. 1 0
      miner.c
  2. 15 1
      util.c

+ 1 - 0
miner.c

@@ -1476,6 +1476,7 @@ static bool work_decode(const json_t *val, struct work *work)
 			
 			curl_socket_t sock = pool->lp_socket;
 			if (sock != CURL_SOCKET_BAD) {
+				pool->lp_socket = CURL_SOCKET_BAD;
 				applog(LOG_WARNING, "Pool %u long poll request hanging, reconnecting", pool->pool_no);
 				shutdown(sock,
 #ifndef WIN32

+ 15 - 1
util.c

@@ -56,6 +56,7 @@ struct timeval nettime;
 struct data_buffer {
 	void		*buf;
 	size_t		len;
+	curl_socket_t	*idlemarker;
 };
 
 struct upload_buffer {
@@ -96,6 +97,16 @@ static size_t all_data_cb(const void *ptr, size_t size, size_t nmemb,
 	void *newmem;
 	static const unsigned char zero = 0;
 
+	if (db->idlemarker) {
+		const unsigned char *cptr = ptr;
+		for (size_t i = 0; i < len; ++i)
+			if (!(isspace(cptr[i]) || cptr[i] == '{')) {
+				*db->idlemarker = CURL_SOCKET_BAD;
+				db->idlemarker = NULL;
+				break;
+			}
+	}
+
 	oldlen = db->len;
 	newlen = oldlen + len;
 
@@ -273,7 +284,7 @@ json_t *json_rpc_call(CURL *curl, const char *url,
 		      struct pool *pool, bool share)
 {
 	long timeout = longpoll ? (60 * 60) : 60;
-	struct data_buffer all_data = {NULL, 0};
+	struct data_buffer all_data = {NULL, 0, NULL};
 	struct header_info hi = {NULL, 0, NULL, false, false, false};
 	char len_hdr[64], user_agent_hdr[128];
 	char curl_err_str[CURL_ERROR_SIZE];
@@ -286,6 +297,9 @@ json_t *json_rpc_call(CURL *curl, const char *url,
 
 	memset(&err, 0, sizeof(err));
 
+	if (longpoll)
+		all_data.idlemarker = &pool->lp_socket;
+
 	/* it is assumed that 'curl' is freshly [re]initialized at this pt */
 
 	if (probe)