Browse Source

Set the lp_sent variable under lock since there will almost always be a race on setting this variable, potentially leading to multiple LPs being sent
out.

Con Kolivas 14 years ago
parent
commit
f4284a21a8
3 changed files with 7 additions and 6 deletions
  1. 5 5
      cgminer.c
  2. 1 0
      miner.h
  3. 1 1
      util.c

+ 5 - 5
cgminer.c

@@ -336,7 +336,7 @@ static bool pool_tset(struct pool *pool, bool *var)
 	return ret;
 }
 
-static bool pool_tclear(struct pool *pool, bool *var)
+bool pool_tclear(struct pool *pool, bool *var)
 {
 	bool ret;
 
@@ -1592,10 +1592,10 @@ static bool get_upstream_work(struct work *work, bool lagging)
 
 	/* If this is the current pool and supports longpoll but has not sent
 	 * a longpoll, send one now */
-	if (unlikely(pool == current_pool() && !pool->is_lp && pool->hdr_path && !pool->lp_sent)) {
-		pool->lp_sent = true;
-		req_longpoll = true;
-		url = pool->lp_url;
+	if (unlikely(!pool->is_lp && pool == current_pool() && pool->hdr_path &&
+		!pool_tset(pool, &pool->lp_sent))) {
+			req_longpoll = true;
+			url = pool->lp_url;
 	}
 
 retry:

+ 1 - 0
miner.h

@@ -601,6 +601,7 @@ extern void switch_pools(struct pool *selected);
 extern void write_config(FILE *fcfg);
 extern void log_curses(int prio, const char *f, va_list ap);
 extern void clear_logwin(void);
+extern bool pool_tclear(struct pool *pool, bool *var);
 extern struct thread_q *tq_new(void);
 extern void tq_free(struct thread_q *tq);
 extern bool tq_push(struct thread_q *tq, void *data);

+ 1 - 1
util.c

@@ -351,7 +351,7 @@ json_t *json_rpc_call(CURL *curl, const char *url,
 
 	rc = curl_easy_perform(curl);
 	if (longpoll)
-		pool->lp_sent = false;
+		pool_tclear(pool, &pool->lp_sent);
 	if (rc) {
 		applog(LOG_INFO, "HTTP request failed: %s", curl_err_str);
 		goto err_out;