|
|
@ -83,7 +83,12 @@ static pthread_mutex_t stats_lock; |
|
|
|
/* Serialises sends/receives to ckdb if possible */ |
|
|
|
/* Serialises sends/receives to ckdb if possible */ |
|
|
|
static pthread_mutex_t ckdb_lock; |
|
|
|
static pthread_mutex_t ckdb_lock; |
|
|
|
|
|
|
|
|
|
|
|
static uint64_t enonce1_64; |
|
|
|
static union { |
|
|
|
|
|
|
|
uint64_t u64; |
|
|
|
|
|
|
|
uint32_t u32; |
|
|
|
|
|
|
|
uint16_t u16; |
|
|
|
|
|
|
|
uint8_t u8; |
|
|
|
|
|
|
|
} enonce1u; |
|
|
|
|
|
|
|
|
|
|
|
struct workbase { |
|
|
|
struct workbase { |
|
|
|
/* Hash table data */ |
|
|
|
/* Hash table data */ |
|
|
@ -1345,10 +1350,6 @@ out: |
|
|
|
* unused enonce1 value and reject clients instead if there is no space left */ |
|
|
|
* unused enonce1 value and reject clients instead if there is no space left */ |
|
|
|
static bool new_enonce1(stratum_instance_t *client) |
|
|
|
static bool new_enonce1(stratum_instance_t *client) |
|
|
|
{ |
|
|
|
{ |
|
|
|
void *enoncev = &enonce1_64; |
|
|
|
|
|
|
|
uint32_t *enonce1_32 = enoncev; |
|
|
|
|
|
|
|
uint16_t *enonce1_16 = enoncev; |
|
|
|
|
|
|
|
uint8_t *enonce1_8 = enoncev; |
|
|
|
|
|
|
|
bool ret = false; |
|
|
|
bool ret = false; |
|
|
|
workbase_t *wb; |
|
|
|
workbase_t *wb; |
|
|
|
int i; |
|
|
|
int i; |
|
|
@ -1357,30 +1358,32 @@ static bool new_enonce1(stratum_instance_t *client) |
|
|
|
wb = current_workbase; |
|
|
|
wb = current_workbase; |
|
|
|
switch(wb->enonce1varlen) { |
|
|
|
switch(wb->enonce1varlen) { |
|
|
|
case 8: |
|
|
|
case 8: |
|
|
|
enonce1_64++; |
|
|
|
enonce1u.u64++; |
|
|
|
ret = true; |
|
|
|
ret = true; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 4: |
|
|
|
case 4: |
|
|
|
++(*enonce1_32); |
|
|
|
enonce1u.u32++; |
|
|
|
ret = true; |
|
|
|
ret = true; |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 2: |
|
|
|
case 2: |
|
|
|
i = 0; |
|
|
|
for (i = 0; i < 65536; i++) { |
|
|
|
do { |
|
|
|
enonce1u.u16++; |
|
|
|
++(*enonce1_16); |
|
|
|
ret = enonce1_free(enonce1u.u64); |
|
|
|
ret = enonce1_free(enonce1_64); |
|
|
|
if (ret) |
|
|
|
} while (++i < 65536 && !ret); |
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
case 1: |
|
|
|
case 1: |
|
|
|
i = 0; |
|
|
|
for (i = 0; i < 256; i++) { |
|
|
|
do { |
|
|
|
enonce1u.u8++; |
|
|
|
++(*enonce1_8); |
|
|
|
ret = enonce1_free(enonce1u.u64); |
|
|
|
ret = enonce1_free(enonce1_64); |
|
|
|
if (ret) |
|
|
|
} while (++i < 256 && !ret); |
|
|
|
break; |
|
|
|
|
|
|
|
} |
|
|
|
break; |
|
|
|
break; |
|
|
|
} |
|
|
|
} |
|
|
|
if (ret) |
|
|
|
if (ret) |
|
|
|
client->enonce1_64 = enonce1_64; |
|
|
|
client->enonce1_64 = enonce1u.u64; |
|
|
|
if (wb->enonce1constlen) |
|
|
|
if (wb->enonce1constlen) |
|
|
|
memcpy(client->enonce1bin, wb->enonce1constbin, wb->enonce1constlen); |
|
|
|
memcpy(client->enonce1bin, wb->enonce1constbin, wb->enonce1constlen); |
|
|
|
memcpy(client->enonce1bin + wb->enonce1constlen, &client->enonce1_64, wb->enonce1varlen); |
|
|
|
memcpy(client->enonce1bin + wb->enonce1constlen, &client->enonce1_64, wb->enonce1varlen); |
|
|
|