Browse Source

Provide locking around stratum send operations to avoid races.

Con Kolivas 13 years ago
parent
commit
b5617734fa
3 changed files with 16 additions and 9 deletions
  1. 1 1
      cgminer.c
  2. 14 7
      util.c
  3. 1 1
      util.h

+ 1 - 1
cgminer.c

@@ -2759,7 +2759,7 @@ static void *submit_work_thread(void *userdata)
 
 
 		applog(LOG_INFO, "Submitting share %08lx to pool %d", (unsigned long)(hash32[6]), pool->pool_no);
 		applog(LOG_INFO, "Submitting share %08lx to pool %d", (unsigned long)(hash32[6]), pool->pool_no);
 
 
-		sock_send(pool->sock, s, strlen(s));
+		stratum_send(pool, s, strlen(s));
 
 
 		goto out;
 		goto out;
 	}
 	}

+ 14 - 7
util.c

@@ -843,9 +843,11 @@ bool extract_sockaddr(struct pool *pool, char *url)
 }
 }
 
 
 /* Send a single command across a socket, appending \n to it */
 /* Send a single command across a socket, appending \n to it */
-bool sock_send(int sock, char *s, ssize_t len)
+bool stratum_send(struct pool *pool, char *s, ssize_t len)
 {
 {
+	SOCKETTYPE sock = pool->sock;
 	ssize_t sent = 0;
 	ssize_t sent = 0;
+	bool ret = false;
 
 
 	if (opt_protocol)
 	if (opt_protocol)
 		applog(LOG_DEBUG, "SEND: %s", s);
 		applog(LOG_DEBUG, "SEND: %s", s);
@@ -853,15 +855,20 @@ bool sock_send(int sock, char *s, ssize_t len)
 	strcat(s, "\n");
 	strcat(s, "\n");
 	len++;
 	len++;
 
 
+	mutex_lock(&pool->pool_lock);
 	while (len > 0 ) {
 	while (len > 0 ) {
 		sent = send(sock, s + sent, len, 0);
 		sent = send(sock, s + sent, len, 0);
-		if (SOCKETFAIL(sent))
-			return false;
+		if (SOCKETFAIL(sent)) {
+			ret = false;
+			goto out_unlock;
+		}
 		len -= sent;
 		len -= sent;
 	}
 	}
+	ret = true;
 	fsync(sock);
 	fsync(sock);
-
-	return true;
+out_unlock:
+	mutex_unlock(&pool->pool_lock);
+	return ret;;
 }
 }
 
 
 #define RECVSIZE 8192
 #define RECVSIZE 8192
@@ -1129,7 +1136,7 @@ bool auth_stratum(struct pool *pool)
 		free(sret);
 		free(sret);
 	}
 	}
 
 
-	if (!sock_send(pool->sock, s, strlen(s)))
+	if (!stratum_send(pool, s, strlen(s)))
 		goto out;
 		goto out;
 
 
 	sret = recv_line(pool->sock);
 	sret = recv_line(pool->sock);
@@ -1184,7 +1191,7 @@ bool initiate_stratum(struct pool *pool)
 		goto out;
 		goto out;
 	}
 	}
 
 
-	if (!sock_send(pool->sock, s, strlen(s))) {
+	if (!stratum_send(pool, s, strlen(s))) {
 		applog(LOG_DEBUG, "Failed to send s in initiate_stratum");
 		applog(LOG_DEBUG, "Failed to send s in initiate_stratum");
 		goto out;
 		goto out;
 	}
 	}

+ 1 - 1
util.h

@@ -116,7 +116,7 @@
 #endif
 #endif
 
 
 struct pool;
 struct pool;
-bool sock_send(int sock, char *s, ssize_t len);
+bool stratum_send(struct pool *pool, char *s, ssize_t len);
 char *recv_line(SOCKETTYPE sock);
 char *recv_line(SOCKETTYPE sock);
 bool parse_method(struct pool *pool, char *s);
 bool parse_method(struct pool *pool, char *s);
 bool extract_sockaddr(struct pool *pool, char *url);
 bool extract_sockaddr(struct pool *pool, char *url);