Browse Source

Sort the blocks database in reverse order, allowing us to remove the first block without iterating over them. Output the block number to debug.

Con Kolivas 13 years ago
parent
commit
57c3b12f64
1 changed files with 13 additions and 13 deletions
  1. 13 13
      cgminer.c

+ 13 - 13
cgminer.c

@@ -2814,7 +2814,7 @@ static inline bool from_existing_block(struct work *work)
 
 static int block_sort(struct block *blocka, struct block *blockb)
 {
-	return blockb->block_no - blocka->block_no;
+	return blocka->block_no - blockb->block_no;
 }
 
 static void test_work_current(struct work *work)
@@ -2834,29 +2834,29 @@ static void test_work_current(struct work *work)
 	 * new block and set the current block details to this one */
 	if (!block_exists(hexstr)) {
 		struct block *s = calloc(sizeof(struct block), 1);
+		int deleted_block = 0;
 
 		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
-		 * memory usage from continually rising */
-		if (HASH_COUNT(blocks) > 5) {
-			struct block *blocka, *blockb;
-			int count = 0;
+		/* Only keep the last hour's worth of blocks in memory since
+		 * work from blocks before this is virtually impossible and we
+		 * want to prevent memory usage from continually rising */
+		if (HASH_COUNT(blocks) > 6) {
+			struct block *oldblock;
 
 			HASH_SORT(blocks, block_sort);
-			HASH_ITER(hh, blocks, blocka, blockb) {
-				if (count++ < 6)
-					continue;
-				HASH_DEL(blocks, blocka);
-				free(blocka);
-			}
+			oldblock = blocks;
+			deleted_block = oldblock->block_no;
+			HASH_DEL(blocks, oldblock);
+			free(oldblock);
 		}
 		HASH_ADD_STR(blocks, hash, s);
 		wr_unlock(&blk_lock);
+		if (deleted_block)
+			applog(LOG_DEBUG, "Deleted block %d from database", deleted_block);
 		set_curblock(hexstr, work->data);
 		if (unlikely(new_blocks == 1))
 			goto out_free;