From 90b189374681f1e77f18e6200229fa012b4df8ae Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Mon, 1 Oct 2012 18:43:24 +1000 Subject: [PATCH] Create a work item from a "clean" request from stratum allowing the new block to be detected and the appropriate block change message to be given. --- cgminer.c | 27 ++++++++++++++++++++------- 1 file changed, 20 insertions(+), 7 deletions(-) diff --git a/cgminer.c b/cgminer.c index cb0ef195..af8c63ac 100644 --- a/cgminer.c +++ b/cgminer.c @@ -3043,17 +3043,18 @@ static int block_sort(struct block *blocka, struct block *blockb) return blocka->block_no - blockb->block_no; } -static void test_work_current(struct work *work) +static bool test_work_current(struct work *work) { + bool ret = true; char *hexstr; if (work->mandatory) - return; + return ret; hexstr = bin2hex(work->data, 18); if (unlikely(!hexstr)) { applog(LOG_ERR, "stage_thread OOM"); - return; + return ret; } /* Search to see if this block exists yet and if not, consider it a @@ -3061,6 +3062,7 @@ static void test_work_current(struct work *work) if (!block_exists(hexstr)) { struct block *s = calloc(sizeof(struct block), 1); int deleted_block = 0; + ret = false; if (unlikely(!s)) quit (1, "test_work_current OOM"); @@ -3098,8 +3100,8 @@ static void test_work_current(struct work *work) applog(LOG_NOTICE, "New block detected on network before longpoll"); else applog(LOG_NOTICE, "New block detected on network"); - restart_threads(); } + restart_threads(); } else if (work->longpoll) { work->longpoll = false; if (work->pool == current_pool()) { @@ -3111,6 +3113,7 @@ static void test_work_current(struct work *work) } out_free: free(hexstr); + return ret; } static int tv_sort(struct work *worka, struct work *workb) @@ -4145,10 +4148,20 @@ static void *stratum_thread(void *userdata) if (!parse_method(pool, s) && !parse_stratum_response(s)) applog(LOG_INFO, "Unknown stratum msg: %s", s); free(s); - if (unlikely(pool->swork.clean)) { + if (pool->swork.clean) { + struct work work; + + /* Generate a single work item to update the current + * block database */ pool->swork.clean = false; - applog(LOG_NOTICE, "Stratum requested work restart for block change"); - restart_threads(); + gen_stratum_work(pool, &work); + if (test_work_current(&work)) { + if (pool == current_pool()) { + restart_threads(); + applog(LOG_NOTICE, "Stratum requested work restart for block change"); + } + } else + applog(LOG_NOTICE, "Stratum from pool %d detected new block", pool->pool_no); } if (unlikely(pool->removed)) {