From 8dbb3fa2f9530f31285ff1f923c9368fce8552ad Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Wed, 19 Dec 2012 20:51:22 +1100 Subject: [PATCH] Discard all staged work from stratum pools as well as the shares upon disconnection since all the work becomes invalid. --- cgminer.c | 21 +++++++++++++++++++++ 1 file changed, 21 insertions(+) diff --git a/cgminer.c b/cgminer.c index c7736cff..55dce4bd 100644 --- a/cgminer.c +++ b/cgminer.c @@ -4499,6 +4499,23 @@ static void clear_stratum_shares(struct pool *pool) } } +static void clear_pool_work(struct pool *pool) +{ + struct work *work, *tmp; + int cleared = 0; + + mutex_lock(stgd_lock); + HASH_ITER(hh, staged_work, work, tmp) { + if (work->pool == pool) { + HASH_DEL(staged_work, work); + free_work(work); + cleared++; + } + } + mutex_unlock(stgd_lock); + applog(LOG_ERR, "Discarded %d stratum works", cleared); +} + /* We only need to maintain a secondary pool connection when we need the * capacity to get work from the backup pools while still on the primary */ static bool cnx_needed(struct pool *pool) @@ -4554,6 +4571,9 @@ static void *stratum_thread(void *userdata) * pool */ if (!cnx_needed(pool)) { suspend_stratum(pool); + clear_stratum_shares(pool); + clear_pool_work(pool); + wait_lpcurrent(pool); if (!initiate_stratum(pool) || !auth_stratum(pool)) { pool_died(pool); @@ -4587,6 +4607,7 @@ static void *stratum_thread(void *userdata) * tracked submitted shares are lost and we will leak * the memory if we don't discard their records. */ clear_stratum_shares(pool); + clear_pool_work(pool); if (initiate_stratum(pool) && auth_stratum(pool)) continue;