From 3f061c9331049bdd81d92218c181cbd8ae48c56f Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Sat, 1 Nov 2014 20:09:05 +1100 Subject: [PATCH] Do the CPU intensive part of a stratum receive outside the main stratum loop --- src/stratifier.c | 47 ++++++++++++++++++----------------------------- 1 file changed, 18 insertions(+), 29 deletions(-) diff --git a/src/stratifier.c b/src/stratifier.c index d9e6c4f1..bf780df2 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -1067,15 +1067,6 @@ out: return ret; } -static void stratum_add_recvd(json_t *val) -{ - smsg_t *msg; - - msg = ckzalloc(sizeof(smsg_t)); - msg->json_msg = val; - ckmsgq_add(srecvs, msg); -} - /* For creating a list of sends without locking that can then be concatenated * to the stratum_sends list. Minimises locking and avoids taking recursive * locks. */ @@ -1404,12 +1395,9 @@ retry: } else if (cmdmatch(buf, "loglevel")) { sscanf(buf, "loglevel=%d", &ckp->loglevel); } else { - json_t *val = json_loads(buf, 0, NULL); - - if (!val) { - LOGWARNING("Received unrecognised message: %s", buf); - } else - stratum_add_recvd(val); + /* The srecv_process frees the buf heap ram */ + ckmsgq_add(srecvs, buf); + buf = NULL; } goto retry; @@ -2833,21 +2821,25 @@ out: free(msg); } -static void srecv_process(ckpool_t *ckp, smsg_t *msg) +static void srecv_process(ckpool_t *ckp, char *buf) { stratum_instance_t *instance; + smsg_t *msg; json_t *val; + val = json_loads(buf, 0, NULL); + if (unlikely(!val)) { + LOGWARNING("Received unrecognised non-json message: %s", buf); + goto out; + } + msg = ckzalloc(sizeof(smsg_t)); + msg->json_msg = val; val = json_object_get(msg->json_msg, "client_id"); if (unlikely(!val)) { - char *s; - - s = json_dumps(msg->json_msg, 0); - LOGWARNING("Failed to extract client_id from connector json smsg %s", s); - free(s); + LOGWARNING("Failed to extract client_id from connector json smsg %s", buf); json_decref(msg->json_msg); free(msg); - return; + goto out; } msg->client_id = json_integer_value(val); @@ -2855,14 +2847,10 @@ static void srecv_process(ckpool_t *ckp, smsg_t *msg) val = json_object_get(msg->json_msg, "address"); if (unlikely(!val)) { - char *s; - - s = json_dumps(msg->json_msg, 0); - LOGWARNING("Failed to extract address from connector json smsg %s", s); - free(s); + LOGWARNING("Failed to extract address from connector json smsg %s", buf); json_decref(msg->json_msg); free(msg); - return; + goto out; } strcpy(msg->address, json_string_value(val)); json_object_clear(val); @@ -2877,7 +2865,8 @@ static void srecv_process(ckpool_t *ckp, smsg_t *msg) ck_wunlock(&instance_lock); parse_instance_msg(msg); - +out: + free(buf); } static void discard_stratum_msg(smsg_t **msg)