Browse Source

Avoid applog under stratum_lock in recv_line.

nfactor-troky
Con Kolivas 12 years ago
parent
commit
69c203d88a
  1. 23
      util.c

23
util.c

@ -1029,6 +1029,12 @@ static void recalloc_sock(struct pool *pool, size_t len)
pool->sockbuf_size = new; pool->sockbuf_size = new;
} }
enum recv_ret {
RECV_OK,
RECV_CLOSED,
RECV_RECVFAIL
};
/* Peeks at a socket to find the first end of line and then reads just that /* Peeks at a socket to find the first end of line and then reads just that
* from the socket and returns that as a malloced char */ * from the socket and returns that as a malloced char */
char *recv_line(struct pool *pool) char *recv_line(struct pool *pool)
@ -1037,6 +1043,7 @@ char *recv_line(struct pool *pool)
char *tok, *sret = NULL; char *tok, *sret = NULL;
if (!strstr(pool->sockbuf, "\n")) { if (!strstr(pool->sockbuf, "\n")) {
enum recv_ret ret = RECV_OK;
struct timeval rstart, now; struct timeval rstart, now;
gettimeofday(&rstart, NULL); gettimeofday(&rstart, NULL);
@ -1054,11 +1061,11 @@ char *recv_line(struct pool *pool)
memset(s, 0, RBUFSIZE); memset(s, 0, RBUFSIZE);
n = recv(pool->sock, s, RECVSIZE, 0); n = recv(pool->sock, s, RECVSIZE, 0);
if (!n) { if (!n) {
applog(LOG_DEBUG, "Socket closed waiting in recv_line"); ret = RECV_CLOSED;
break; break;
} }
if (n < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { if (n < 0 && errno != EAGAIN && errno != EWOULDBLOCK) {
applog(LOG_DEBUG, "Failed to recv sock in recv_line"); ret = RECV_RECVFAIL;
break; break;
} }
slen = strlen(s); slen = strlen(s);
@ -1067,6 +1074,18 @@ char *recv_line(struct pool *pool)
gettimeofday(&now, NULL); gettimeofday(&now, NULL);
} while (tdiff(&now, &rstart) < 60 && !strstr(pool->sockbuf, "\n")); } while (tdiff(&now, &rstart) < 60 && !strstr(pool->sockbuf, "\n"));
mutex_unlock(&pool->stratum_lock); mutex_unlock(&pool->stratum_lock);
switch (ret) {
default:
case RECV_OK:
break;
case RECV_CLOSED:
applog(LOG_DEBUG, "Socket closed waiting in recv_line");
break;
case RECV_RECVFAIL:
applog(LOG_DEBUG, "Failed to recv sock in recv_line");
break;
}
} }
buflen = strlen(pool->sockbuf); buflen = strlen(pool->sockbuf);

Loading…
Cancel
Save