Rationalise use of current_hash to a single hex string the length of the previous block and display only the first non zero hex chars of the block in the status window.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144
diff --git a/api.c b/api.c
index 65e6682..5a08e85 100644
--- a/api.c
+++ b/api.c
@@ -3665,14 +3665,8 @@ static void minecoin(struct io_data *io_data, __maybe_unused SOCKETTYPE c, __may
root = api_add_const(root, "Hash Method", SHA256STR, false);
cg_rlock(&ch_lock);
- if (current_fullhash && *current_fullhash) {
- root = api_add_timeval(root, "Current Block Time", &block_timeval, true);
- root = api_add_string(root, "Current Block Hash", current_fullhash, true);
- } else {
- struct timeval t = {0,0};
- root = api_add_timeval(root, "Current Block Time", &t, true);
- root = api_add_const(root, "Current Block Hash", BLANK, false);
- }
+ root = api_add_timeval(root, "Current Block Time", &block_timeval, true);
+ root = api_add_string(root, "Current Block Hash", current_hash, true);
cg_runlock(&ch_lock);
root = api_add_bool(root, "LP", &have_longpoll, false);
diff --git a/cgminer.c b/cgminer.c
index a86c753..08168b6 100644
--- a/cgminer.c
+++ b/cgminer.c
@@ -276,11 +276,9 @@ const
#endif
bool curses_active;
-static char current_block[40];
-
/* Protected by ch_lock */
-static char *current_hash;
-char *current_fullhash;
+char current_hash[68];
+static char prev_block[12];
static char datestamp[40];
static char blocktime[32];
@@ -291,7 +289,7 @@ static char block_diff[8];
uint64_t best_diff = 0;
struct block {
- char hash[40];
+ char hash[68];
UT_hash_handle hh;
int block_no;
};
@@ -2302,7 +2300,7 @@ static void curses_print_status(void)
}
wclrtoeol(statuswin);
cg_mvwprintw(statuswin, 5, 0, " Block: %s... Diff:%s Started: %s Best share: %s ",
- current_hash, block_diff, blocktime, best_share);
+ prev_block, block_diff, blocktime, best_share);
mvwhline(statuswin, 6, 0, '-', 80);
mvwhline(statuswin, statusy - 1, 0, '-', 80);
cg_mvwprintw(statuswin, devcursor - 1, 1, "[P]ool management %s[S]ettings [D]isplay options [Q]uit",
@@ -4017,24 +4015,23 @@ static void signal_work_update(void)
rd_unlock(&mining_thr_lock);
}
-static void set_curblock(char *hexstr, unsigned char *hash)
+static void set_curblock(char *hexstr)
{
- unsigned char hash_swap[32];
- unsigned char block_hash_swap[32];
-
- strcpy(current_block, hexstr);
- swap256(hash_swap, hash);
- swap256(block_hash_swap, hash + 4);
+ int ofs;
cg_wlock(&ch_lock);
cgtime(&block_timeval);
- free(current_hash);
- current_hash = bin2hex(hash_swap + 2, 8);
- free(current_fullhash);
- current_fullhash = bin2hex(block_hash_swap, 32);
+ strcpy(current_hash, hexstr);
get_timestamp(blocktime, sizeof(blocktime), &block_timeval);
cg_wunlock(&ch_lock);
+ for (ofs = 0; ofs <= 56; ofs++) {
+ if (memcmp(¤t_hash[ofs], "0", 1))
+ break;
+ }
+ strncpy(prev_block, ¤t_hash[ofs], 8);
+ prev_block[8] = '\0';
+
applog(LOG_INFO, "New block: %s... diff %s", current_hash, block_diff);
}
@@ -4086,16 +4083,15 @@ static void set_blockdiff(const struct work *work)
static bool test_work_current(struct work *work)
{
+ unsigned char bedata[32];
+ char hexstr[68];
bool ret = true;
- char hexstr[40];
if (work->mandatory)
return ret;
- /* Hack to work around dud work sneaking into test */
- __bin2hex(hexstr, work->data + 8, 18);
- if (!strncmp(hexstr, "000000000000000000000000000000000000", 36))
- return ret;
+ swap256(bedata, work->data + 4);
+ __bin2hex(hexstr, bedata, 32);
/* Search to see if this block exists yet and if not, consider it a
* new block and set the current block details to this one */
@@ -4128,7 +4124,7 @@ static bool test_work_current(struct work *work)
if (deleted_block)
applog(LOG_DEBUG, "Deleted block %d from database", deleted_block);
- set_curblock(hexstr, work->data);
+ set_curblock(hexstr);
if (unlikely(new_blocks == 1))
return ret;
@@ -8004,7 +8000,7 @@ int main(int argc, char *argv[])
for (i = 0; i < 36; i++)
strcat(block->hash, "0");
HASH_ADD_STR(blocks, hash, block);
- strcpy(current_block, block->hash);
+ strcpy(current_hash, block->hash);
INIT_LIST_HEAD(&scan_devices);
diff --git a/miner.h b/miner.h
index c5446b5..19156e7 100644
--- a/miner.h
+++ b/miner.h
@@ -1187,7 +1187,7 @@ extern unsigned int total_go, total_ro;
extern const int opt_cutofftemp;
extern int opt_log_interval;
extern unsigned long long global_hashrate;
-extern char *current_fullhash;
+extern char current_hash[68];
extern double current_diff;
extern uint64_t best_diff;
extern struct timeval block_timeval;