From 00fc686bbf30a694a7f1d7e301a3e0a4770b1782 Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Wed, 1 Oct 2014 23:51:15 +1000 Subject: [PATCH 1/2] use a union for the split nonce2 values instead of open coding a pointer version --- src/stratifier.c | 39 +++++++++++++++++++++------------------ 1 file changed, 21 insertions(+), 18 deletions(-) diff --git a/src/stratifier.c b/src/stratifier.c index 7f8717a2..cc08114b 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 */ @@ -1345,10 +1350,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 +1358,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); From 49e465c8d5429e41a8b361e24761c1171a12f91c Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Thu, 2 Oct 2014 02:24:18 +1000 Subject: [PATCH 2/2] Remove unnecessary extra step in disconnected_sessionid_exists --- src/stratifier.c | 8 +++----- 1 file changed, 3 insertions(+), 5 deletions(-) diff --git a/src/stratifier.c b/src/stratifier.c index cc08114b..f473c2a6 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -983,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; @@ -1002,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)