mirror of
https://github.com/GOSTSec/sgminer
synced 2025-01-10 23:08:07 +00:00
Avoid applog under stratum_lock in __stratum_send.
This commit is contained in:
parent
d248e7aafa
commit
e4effc372c
52
util.c
52
util.c
@ -892,16 +892,20 @@ bool extract_sockaddr(struct pool *pool, char *url)
|
|||||||
return true;
|
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
|
/* 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 */
|
* 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;
|
SOCKETTYPE sock = pool->sock;
|
||||||
ssize_t ssent = 0;
|
ssize_t ssent = 0;
|
||||||
|
|
||||||
if (opt_protocol)
|
|
||||||
applog(LOG_DEBUG, "SEND: %s", s);
|
|
||||||
|
|
||||||
strcat(s, "\n");
|
strcat(s, "\n");
|
||||||
len++;
|
len++;
|
||||||
|
|
||||||
@ -912,16 +916,12 @@ static bool __stratum_send(struct pool *pool, char *s, ssize_t len)
|
|||||||
|
|
||||||
FD_ZERO(&wd);
|
FD_ZERO(&wd);
|
||||||
FD_SET(sock, &wd);
|
FD_SET(sock, &wd);
|
||||||
if (select(sock + 1, NULL, &wd, NULL, &timeout) < 1) {
|
if (select(sock + 1, NULL, &wd, NULL, &timeout) < 1)
|
||||||
applog(LOG_DEBUG, "Write select failed on pool %d sock", pool->pool_no);
|
return SEND_SELECTFAIL;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
sent = send(pool->sock, s + ssent, len, 0);
|
sent = send(pool->sock, s + ssent, len, 0);
|
||||||
if (sent < 0) {
|
if (sent < 0) {
|
||||||
if (errno != EAGAIN && errno != EWOULDBLOCK) {
|
if (errno != EAGAIN && errno != EWOULDBLOCK)
|
||||||
applog(LOG_DEBUG, "Failed to curl_easy_send in stratum_send");
|
return SEND_SENDFAIL;
|
||||||
return false;
|
|
||||||
}
|
|
||||||
sent = 0;
|
sent = 0;
|
||||||
}
|
}
|
||||||
ssent += sent;
|
ssent += sent;
|
||||||
@ -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.times_sent++;
|
||||||
pool->cgminer_pool_stats.bytes_sent += ssent;
|
pool->cgminer_pool_stats.bytes_sent += ssent;
|
||||||
pool->cgminer_pool_stats.net_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 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);
|
mutex_lock(&pool->stratum_lock);
|
||||||
if (pool->stratum_active)
|
if (pool->stratum_active)
|
||||||
ret = __stratum_send(pool, s, len);
|
ret = __stratum_send(pool, s, len);
|
||||||
else
|
|
||||||
applog(LOG_DEBUG, "Stratum send failed due to no pool stratum_active");
|
|
||||||
mutex_unlock(&pool->stratum_lock);
|
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)
|
static bool socket_full(struct pool *pool, bool wait)
|
||||||
@ -1557,7 +1573,7 @@ resend:
|
|||||||
sprintf(s, "{\"id\": %d, \"method\": \"mining.subscribe\", \"params\": [\""PACKAGE"/"VERSION"\"]}", swork_id++);
|
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");
|
applog(LOG_DEBUG, "Failed to send s in initiate_stratum");
|
||||||
goto out;
|
goto out;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user