From 06fc1da6c192ebced414ceb5d99803ac34d717e4 Mon Sep 17 00:00:00 2001 From: ckolivas Date: Thu, 29 Jan 2015 16:50:57 +1100 Subject: [PATCH] Keep track of the highest client id the stratifier has seen to avoid needing to iterate over all disconnects to see if it exists --- src/stratifier.c | 18 ++++++++++++++---- 1 file changed, 14 insertions(+), 4 deletions(-) diff --git a/src/stratifier.c b/src/stratifier.c index 704cff52..91f7d928 100644 --- a/src/stratifier.c +++ b/src/stratifier.c @@ -320,6 +320,7 @@ struct stratifier_data { ckmsgq_t *stxnq; // Transaction requests int64_t user_instance_id; + int64_t highest_client_id; /* Highest known client id */ /* Stratum_instances hashlist is stored by id, whereas disconnected_instances * is sorted by enonce1_64. */ @@ -1173,17 +1174,24 @@ static stratum_instance_t *ref_instance_by_id(sdata_t *sdata, const int64_t id) static bool __dropped_instance(sdata_t *sdata, const int64_t id) { stratum_instance_t *client, *tmp; - bool ret = true; + bool ret = false; + /* Avoid iterating over all the instances if we haven't seen an id this high + * before as the value only ever increases */ + if (id > sdata->highest_client_id) + goto out; HASH_ITER(hh, sdata->disconnected_instances, client, tmp) { - if (unlikely(client->id == id)) + if (unlikely(client->id == id)) { + ret = true; goto out; + } } DL_FOREACH(sdata->dead_instances, client) { - if (unlikely(client->id == id)) + if (unlikely(client->id == id)) { + ret = true; goto out; + } } - ret = false; out: return ret; } @@ -1264,6 +1272,8 @@ static stratum_instance_t *__stratum_add_instance(ckpool_t *ckp, const int64_t i sdata->stratum_generated++; client->id = id; + if (id > sdata->highest_client_id) + sdata->highest_client_id = id; client->server = server; client->diff = client->old_diff = ckp->startdiff; client->ckp = ckp;