From 69c203d88a8f81a5bd17d4f1a1052a0093e11a57 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Mon, 15 Apr 2013 12:07:52 +1000 Subject: [PATCH] Avoid applog under stratum_lock in recv_line. --- util.c | 23 +++++++++++++++++++++-- 1 file changed, 21 insertions(+), 2 deletions(-) diff --git a/util.c b/util.c index 5e221049..ff423b7a 100644 --- a/util.c +++ b/util.c @@ -1029,6 +1029,12 @@ static void recalloc_sock(struct pool *pool, size_t len) 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 * from the socket and returns that as a malloced char */ char *recv_line(struct pool *pool) @@ -1037,6 +1043,7 @@ char *recv_line(struct pool *pool) char *tok, *sret = NULL; if (!strstr(pool->sockbuf, "\n")) { + enum recv_ret ret = RECV_OK; struct timeval rstart, now; gettimeofday(&rstart, NULL); @@ -1054,11 +1061,11 @@ char *recv_line(struct pool *pool) memset(s, 0, RBUFSIZE); n = recv(pool->sock, s, RECVSIZE, 0); if (!n) { - applog(LOG_DEBUG, "Socket closed waiting in recv_line"); + ret = RECV_CLOSED; break; } if (n < 0 && errno != EAGAIN && errno != EWOULDBLOCK) { - applog(LOG_DEBUG, "Failed to recv sock in recv_line"); + ret = RECV_RECVFAIL; break; } slen = strlen(s); @@ -1067,6 +1074,18 @@ char *recv_line(struct pool *pool) gettimeofday(&now, NULL); } while (tdiff(&now, &rstart) < 60 && !strstr(pool->sockbuf, "\n")); 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);