From f97bf2e2acb9e1bdb84a511836dfb1d45731996e Mon Sep 17 00:00:00 2001 From: Con Kolivas Date: Tue, 28 Aug 2012 20:16:50 +1000 Subject: [PATCH] Keep the local block number in the blocks structs stored and sort them by number to guarantee we delete the oldest when ageing the block struct entries. --- cgminer.c | 10 +++++++++- 1 file changed, 9 insertions(+), 1 deletion(-) diff --git a/cgminer.c b/cgminer.c index f677a60b..89d75ae8 100644 --- a/cgminer.c +++ b/cgminer.c @@ -218,6 +218,7 @@ struct timeval block_timeval; struct block { char hash[37]; UT_hash_handle hh; + int block_no; }; static struct block *blocks = NULL; @@ -2811,6 +2812,11 @@ static inline bool from_existing_block(struct work *work) return ret; } +static int block_sort(struct block *blocka, struct block *blockb) +{ + return blockb->block_no - blocka->block_no; +} + static void test_work_current(struct work *work) { char *hexstr; @@ -2832,6 +2838,7 @@ static void test_work_current(struct work *work) if (unlikely(!s)) quit (1, "test_work_current OOM"); strcpy(s->hash, hexstr); + s->block_no = new_blocks++; wr_lock(&blk_lock); /* Only keep the last 6 blocks in memory since work from blocks * before this is virtually impossible and we want to prevent @@ -2840,6 +2847,7 @@ static void test_work_current(struct work *work) struct block *blocka, *blockb; int count = 0; + HASH_SORT(blocks, block_sort); HASH_ITER(hh, blocks, blocka, blockb) { if (count++ < 6) continue; @@ -2850,7 +2858,7 @@ static void test_work_current(struct work *work) HASH_ADD_STR(blocks, hash, s); wr_unlock(&blk_lock); set_curblock(hexstr, work->data); - if (unlikely(++new_blocks == 1)) + if (unlikely(new_blocks == 1)) goto out_free; work_block++;