Browse Source

Avoid applog under stratum_lock in __stratum_send.

nfactor-troky
Con Kolivas 12 years ago
parent
commit
e4effc372c
  1. 52
      util.c

52
util.c

@ -892,16 +892,20 @@ bool extract_sockaddr(struct pool *pool, char *url) @@ -892,16 +892,20 @@ bool extract_sockaddr(struct pool *pool, char *url)
return true;
}
enum send_ret {
SEND_OK,
SEND_SELECTFAIL,
SEND_SENDFAIL,
SEND_INACTIVE
};
/* Send a single command across a socket, appending \n to it. This should all
* be done under stratum lock except when first establishing the socket */
static bool __stratum_send(struct pool *pool, char *s, ssize_t len)
static enum send_ret __stratum_send(struct pool *pool, char *s, ssize_t len)
{
SOCKETTYPE sock = pool->sock;
ssize_t ssent = 0;
if (opt_protocol)
applog(LOG_DEBUG, "SEND: %s", s);
strcat(s, "\n");
len++;
@ -912,16 +916,12 @@ static bool __stratum_send(struct pool *pool, char *s, ssize_t len) @@ -912,16 +916,12 @@ static bool __stratum_send(struct pool *pool, char *s, ssize_t len)
FD_ZERO(&wd);
FD_SET(sock, &wd);
if (select(sock + 1, NULL, &wd, NULL, &timeout) < 1) {
applog(LOG_DEBUG, "Write select failed on pool %d sock", pool->pool_no);
return false;
}
if (select(sock + 1, NULL, &wd, NULL, &timeout) < 1)
return SEND_SELECTFAIL;
sent = send(pool->sock, s + ssent, len, 0);
if (sent < 0) {
if (errno != EAGAIN && errno != EWOULDBLOCK) {
applog(LOG_DEBUG, "Failed to curl_easy_send in stratum_send");
return false;
}
if (errno != EAGAIN && errno != EWOULDBLOCK)
return SEND_SENDFAIL;
sent = 0;
}
ssent += sent;
@ -931,21 +931,37 @@ static bool __stratum_send(struct pool *pool, char *s, ssize_t len) @@ -931,21 +931,37 @@ static bool __stratum_send(struct pool *pool, char *s, ssize_t len)
pool->cgminer_pool_stats.times_sent++;
pool->cgminer_pool_stats.bytes_sent += ssent;
pool->cgminer_pool_stats.net_bytes_sent += ssent;
return true;
return SEND_OK;
}
bool stratum_send(struct pool *pool, char *s, ssize_t len)
{
bool ret = false;
enum send_ret ret = SEND_INACTIVE;
if (opt_protocol)
applog(LOG_DEBUG, "SEND: %s", s);
mutex_lock(&pool->stratum_lock);
if (pool->stratum_active)
ret = __stratum_send(pool, s, len);
else
applog(LOG_DEBUG, "Stratum send failed due to no pool stratum_active");
mutex_unlock(&pool->stratum_lock);
return ret;
/* This is to avoid doing applog under stratum_lock */
switch (ret) {
default:
case SEND_OK:
break;
case SEND_SELECTFAIL:
applog(LOG_DEBUG, "Write select failed on pool %d sock", pool->pool_no);
break;
case SEND_SENDFAIL:
applog(LOG_DEBUG, "Failed to curl_easy_send in stratum_send");
break;
case SEND_INACTIVE:
applog(LOG_DEBUG, "Stratum send failed due to no pool stratum_active");
break;
}
return (ret == SEND_OK);
}
static bool socket_full(struct pool *pool, bool wait)
@ -1557,7 +1573,7 @@ resend: @@ -1557,7 +1573,7 @@ resend:
sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": [\""PACKAGE"/"VERSION"\"]}", swork_id++);
}
if (!__stratum_send(pool, s, strlen(s))) {
if (__stratum_send(pool, s, strlen(s)) != SEND_OK) {
applog(LOG_DEBUG, "Failed to send s in initiate_stratum");
goto out;
}

Loading…
Cancel
Save