From 0870ab753231c229050d48e6766a27e573061818 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Mon, 4 Feb 2013 11:06:05 +1100 Subject: [PATCH] Cache the header length when generating stratum work to avoid calculating it on every work generation, and to only need one alloc+sprintf, speeding up work generation. --- cgminer.c | 24 +++++++++++++----------- miner.h | 1 + util.c | 9 +++++++++ 3 files changed, 23 insertions(+), 11 deletions(-) diff --git a/cgminer.c b/cgminer.c index 71b663b2..ef7bf3b6 100644 --- a/cgminer.c +++ b/cgminer.c @@ -5085,11 +5085,11 @@ static void set_work_target(struct work *work, double diff) * other means to detect when the pool has died in stratum_thread */ static void gen_stratum_work(struct pool *pool, struct work *work) { - unsigned char *coinbase, merkle_root[32], merkle_sha[64], *merkle_hash; + unsigned char *coinbase, merkle_root[32], merkle_sha[64]; int len, cb1_len, n1_len, cb2_len, i; + char *header, *merkle_hash; uint32_t *data32, *swap32; size_t alloc_len; - char *header; mutex_lock(&pool->pool_lock); @@ -5124,15 +5124,17 @@ static void gen_stratum_work(struct pool *pool, struct work *work) swap32 = (uint32_t *)merkle_root; for (i = 0; i < 32 / 4; i++) swap32[i] = swab32(data32[i]); - merkle_hash = (unsigned char *)bin2hex((const unsigned char *)merkle_root, 32); - - header = strdup(pool->swork.bbversion); - header = realloc_strcat(header, pool->swork.prev_hash); - header = realloc_strcat(header, (char *)merkle_hash); - header = realloc_strcat(header, pool->swork.ntime); - header = realloc_strcat(header, pool->swork.nbit); - header = realloc_strcat(header, "00000000"); /* nonce */ - header = realloc_strcat(header, workpadding); + merkle_hash = bin2hex((const unsigned char *)merkle_root, 32); + + header = calloc(pool->swork.header_len, 1); + sprintf(header, "%s%s%s%s%s%s%s", + pool->swork.bbversion, + pool->swork.prev_hash, + merkle_hash, + pool->swork.ntime, + pool->swork.nbit, + "00000000", /* nonce */ + workpadding); /* Store the stratum work diff to check it still matches the pool's * stratum diff when submitting shares */ diff --git a/miner.h b/miner.h index df2888e9..8dbffa5e 100644 --- a/miner.h +++ b/miner.h @@ -855,6 +855,7 @@ struct stratum_work { char *ntime; bool clean; + size_t header_len; int merkles; double diff; }; diff --git a/util.c b/util.c index 386298a6..dd99e1b1 100644 --- a/util.c +++ b/util.c @@ -1146,6 +1146,15 @@ static bool parse_notify(struct pool *pool, json_t *val) pool->swork.merkles = merkles; if (clean) pool->nonce2 = 0; + pool->swork.header_len = strlen(pool->swork.bbversion) + + strlen(pool->swork.prev_hash) + + strlen(pool->swork.ntime) + + strlen(pool->swork.nbit) + + /* merkle_hash */ 32 + + /* nonce */ 8 + + /* workpadding */ 96; + pool->swork.header_len = pool->swork.header_len * 2 + 1; + align_len(&pool->swork.header_len); mutex_unlock(&pool->pool_lock); if (opt_protocol) {