Browse Source

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.

nfactor-troky
Con Kolivas 12 years ago
parent
commit
0870ab7532
  1. 24
      cgminer.c
  2. 1
      miner.h
  3. 9
      util.c

24
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 */ * other means to detect when the pool has died in stratum_thread */
static void gen_stratum_work(struct pool *pool, struct work *work) 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; int len, cb1_len, n1_len, cb2_len, i;
char *header, *merkle_hash;
uint32_t *data32, *swap32; uint32_t *data32, *swap32;
size_t alloc_len; size_t alloc_len;
char *header;
mutex_lock(&pool->pool_lock); 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; swap32 = (uint32_t *)merkle_root;
for (i = 0; i < 32 / 4; i++) for (i = 0; i < 32 / 4; i++)
swap32[i] = swab32(data32[i]); swap32[i] = swab32(data32[i]);
merkle_hash = (unsigned char *)bin2hex((const unsigned char *)merkle_root, 32); merkle_hash = bin2hex((const unsigned char *)merkle_root, 32);
header = strdup(pool->swork.bbversion); header = calloc(pool->swork.header_len, 1);
header = realloc_strcat(header, pool->swork.prev_hash); sprintf(header, "%s%s%s%s%s%s%s",
header = realloc_strcat(header, (char *)merkle_hash); pool->swork.bbversion,
header = realloc_strcat(header, pool->swork.ntime); pool->swork.prev_hash,
header = realloc_strcat(header, pool->swork.nbit); merkle_hash,
header = realloc_strcat(header, "00000000"); /* nonce */ pool->swork.ntime,
header = realloc_strcat(header, workpadding); pool->swork.nbit,
"00000000", /* nonce */
workpadding);
/* Store the stratum work diff to check it still matches the pool's /* Store the stratum work diff to check it still matches the pool's
* stratum diff when submitting shares */ * stratum diff when submitting shares */

1
miner.h

@ -855,6 +855,7 @@ struct stratum_work {
char *ntime; char *ntime;
bool clean; bool clean;
size_t header_len;
int merkles; int merkles;
double diff; double diff;
}; };

9
util.c

@ -1146,6 +1146,15 @@ static bool parse_notify(struct pool *pool, json_t *val)
pool->swork.merkles = merkles; pool->swork.merkles = merkles;
if (clean) if (clean)
pool->nonce2 = 0; 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); mutex_unlock(&pool->pool_lock);
if (opt_protocol) { if (opt_protocol) {

Loading…
Cancel
Save