diff --git a/src/stratifier.c b/src/stratifier.c index 7f8717a2..f473c2a6 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -83,7 +83,12 @@ static pthread_mutex_t stats_lock; /* Serialises sends/receives to ckdb if possible */ 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 { /* Hash table data */ @@ -978,11 +983,12 @@ static stratum_instance_t *__stratum_add_instance(ckpool_t *ckp, int64_t id) return instance; } +/* Only supports a full ckpool instance sessionid with an 8 byte sessionid */ static bool disconnected_sessionid_exists(const char *sessionid, int64_t id) { - bool connected_exists = false, ret = false; stratum_instance_t *instance, *tmp; uint64_t session64; + bool ret = false; if (!sessionid) goto out; @@ -997,12 +1003,9 @@ static bool disconnected_sessionid_exists(const char *sessionid, int64_t id) continue; if (instance->enonce1_64 == session64) { /* Only allow one connected instance per enonce1 */ - connected_exists = true; - break; + goto out_unlock; } } - if (connected_exists) - goto out_unlock; instance = NULL; HASH_FIND(hh, disconnected_instances, &session64, sizeof(uint64_t), instance); if (instance) @@ -1345,10 +1348,6 @@ out: * unused enonce1 value and reject clients instead if there is no space left */ 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; workbase_t *wb; int i; @@ -1357,30 +1356,32 @@ static bool new_enonce1(stratum_instance_t *client) wb = current_workbase; switch(wb->enonce1varlen) { case 8: - enonce1_64++; + enonce1u.u64++; ret = true; break; case 4: - ++(*enonce1_32); + enonce1u.u32++; ret = true; break; case 2: - i = 0; - do { - ++(*enonce1_16); - ret = enonce1_free(enonce1_64); - } while (++i < 65536 && !ret); + for (i = 0; i < 65536; i++) { + enonce1u.u16++; + ret = enonce1_free(enonce1u.u64); + if (ret) + break; + } break; case 1: - i = 0; - do { - ++(*enonce1_8); - ret = enonce1_free(enonce1_64); - } while (++i < 256 && !ret); + for (i = 0; i < 256; i++) { + enonce1u.u8++; + ret = enonce1_free(enonce1u.u64); + if (ret) + break; + } break; } if (ret) - client->enonce1_64 = enonce1_64; + client->enonce1_64 = enonce1u.u64; if (wb->enonce1constlen) memcpy(client->enonce1bin, wb->enonce1constbin, wb->enonce1constlen); memcpy(client->enonce1bin + wb->enonce1constlen, &client->enonce1_64, wb->enonce1varlen);