Browse Source

Use the new hashes directly for counts instead of the fragile counters currently in use.

nfactor-troky
Con Kolivas 13 years ago
parent
commit
dbf0a1366d
  1. 84
      main.c
  2. 28
      miner.h

84
main.c

@ -232,6 +232,7 @@ static pthread_mutex_t hash_lock;
static pthread_mutex_t qd_lock; static pthread_mutex_t qd_lock;
static pthread_mutex_t stgd_lock; static pthread_mutex_t stgd_lock;
static pthread_mutex_t curses_lock; static pthread_mutex_t curses_lock;
static pthread_rwlock_t blk_lock;
static double total_mhashes_done; static double total_mhashes_done;
static struct timeval total_tv_start, total_tv_end; static struct timeval total_tv_start, total_tv_end;
@ -240,7 +241,7 @@ pthread_mutex_t control_lock;
int hw_errors; int hw_errors;
static int total_accepted, total_rejected; static int total_accepted, total_rejected;
static int total_getworks, total_stale, total_discarded; static int total_getworks, total_stale, total_discarded;
static int total_queued, total_staged, lp_staged; static int total_queued;
static unsigned int new_blocks; static unsigned int new_blocks;
enum block_change { enum block_change {
@ -1314,6 +1315,16 @@ static inline void decay_time(double *f, double fadd)
*f = (fadd + *f * 0.9) / 1.9; *f = (fadd + *f * 0.9) / 1.9;
} }
static int requests_staged(void)
{
int ret;
mutex_lock(&stgd_lock);
ret = HASH_COUNT(staged_work);
mutex_unlock(&stgd_lock);
return ret;
}
static WINDOW *mainwin, *statuswin, *logwin; static WINDOW *mainwin, *statuswin, *logwin;
static double total_secs = 0.1; static double total_secs = 0.1;
static char statusline[256]; static char statusline[256];
@ -1348,8 +1359,8 @@ static void curses_print_status(int thr_id)
wprintw(statuswin, " %s", statusline); wprintw(statuswin, " %s", statusline);
wclrtoeol(statuswin); wclrtoeol(statuswin);
wmove(statuswin, 3,0); wmove(statuswin, 3,0);
wprintw(statuswin, " TQ: %d ST: %d LS: %d SS: %d DW: %d NB: %d LW: %d LO: %d RF: %d I: %d", wprintw(statuswin, " TQ: %d ST: %d SS: %d DW: %d NB: %d LW: %d LO: %d RF: %d I: %d",
total_queued, total_staged, lp_staged, total_stale, total_discarded, new_blocks, total_queued, requests_staged(), total_stale, total_discarded, new_blocks,
local_work, total_lo, total_ro, scan_intensity); local_work, total_lo, total_ro, scan_intensity);
wclrtoeol(statuswin); wclrtoeol(statuswin);
wmove(statuswin, 4, 0); wmove(statuswin, 4, 0);
@ -1902,46 +1913,6 @@ static bool workio_submit_work(struct workio_cmd *wc)
return true; return true;
} }
static void inc_staged(struct pool *pool, int inc, bool lp)
{
mutex_lock(&stgd_lock);
if (lp) {
lp_staged += inc;
total_staged += inc;
} else if (lp_staged)
--lp_staged;
else
total_staged += inc;
mutex_unlock(&stgd_lock);
}
static void dec_staged(int inc)
{
mutex_lock(&stgd_lock);
total_staged -= inc;
mutex_unlock(&stgd_lock);
}
static int requests_staged(void)
{
int ret;
mutex_lock(&stgd_lock);
ret = total_staged;
mutex_unlock(&stgd_lock);
return ret;
}
static int real_staged(void)
{
int ret;
mutex_lock(&stgd_lock);
ret = total_staged - lp_staged;
mutex_unlock(&stgd_lock);
return ret;
}
/* Find the pool that currently has the highest priority */ /* Find the pool that currently has the highest priority */
static struct pool *priority_pool(int choice) static struct pool *priority_pool(int choice)
{ {
@ -2029,8 +2000,6 @@ static void switch_pools(struct pool *selected)
mutex_lock(&qd_lock); mutex_lock(&qd_lock);
total_queued = 0; total_queued = 0;
mutex_unlock(&qd_lock); mutex_unlock(&qd_lock);
inc_staged(pool, 1, true);
} }
static void discard_work(struct work *work) static void discard_work(struct work *work)
@ -2061,7 +2030,6 @@ static void dec_queued(void)
if (total_queued > 0) if (total_queued > 0)
total_queued--; total_queued--;
mutex_unlock(&qd_lock); mutex_unlock(&qd_lock);
dec_staged(1);
} }
static int requests_queued(void) static int requests_queued(void)
@ -2079,7 +2047,7 @@ static int discard_stale(void)
struct work *work, *tmp; struct work *work, *tmp;
int i, stale = 0; int i, stale = 0;
mutex_lock(&getq->mutex); mutex_lock(&stgd_lock);
HASH_ITER(hh, staged_work, work, tmp) { HASH_ITER(hh, staged_work, work, tmp) {
if (stale_work(work)) { if (stale_work(work)) {
HASH_DEL(staged_work, work); HASH_DEL(staged_work, work);
@ -2087,7 +2055,7 @@ static int discard_stale(void)
stale++; stale++;
} }
} }
mutex_unlock(&getq->mutex); mutex_unlock(&stgd_lock);
if (opt_debug) if (opt_debug)
applog(LOG_DEBUG, "Discarded %d stales that didn't match current hash", stale); applog(LOG_DEBUG, "Discarded %d stales that didn't match current hash", stale);
@ -2103,7 +2071,6 @@ static bool queue_request(struct thr_info *thr, bool needed);
static void restart_threads(void) static void restart_threads(void)
{ {
struct pool *pool = current_pool();
int i, stale; int i, stale;
block_changed = BLOCK_NONE; block_changed = BLOCK_NONE;
@ -2114,10 +2081,6 @@ static void restart_threads(void)
for (i = 0; i < stale; i++) for (i = 0; i < stale; i++)
queue_request(NULL, true); queue_request(NULL, true);
/* Temporarily increase the staged count so that the pool is not seen
* as lagging when a new block hits */
inc_staged(pool, mining_threads, true);
for (i = 0; i < mining_threads; i++) for (i = 0; i < mining_threads; i++)
work_restart[i].restart = 1; work_restart[i].restart = 1;
} }
@ -2156,17 +2119,17 @@ static void test_work_current(struct work *work)
/* Search to see if this block exists yet and if not, consider it a /* 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 */ * new block and set the current block details to this one */
mutex_lock(&getq->mutex); rd_lock(&blk_lock);
HASH_FIND_STR(blocks, hexstr, s); HASH_FIND_STR(blocks, hexstr, s);
mutex_unlock(&getq->mutex); rd_unlock(&blk_lock);
if (!s) { if (!s) {
s = calloc(sizeof(struct block), 1); s = calloc(sizeof(struct block), 1);
if (unlikely(!s)) if (unlikely(!s))
quit (1, "test_work_current OOM"); quit (1, "test_work_current OOM");
strcpy(s->hash, hexstr); strcpy(s->hash, hexstr);
mutex_lock(&getq->mutex); wr_lock(&blk_lock);
HASH_ADD_STR(blocks, hash, s); HASH_ADD_STR(blocks, hash, s);
mutex_unlock(&getq->mutex); wr_unlock(&blk_lock);
set_curblock(hexstr, work->data); set_curblock(hexstr, work->data);
new_blocks++; new_blocks++;
@ -2233,7 +2196,6 @@ static void *stage_thread(void *userdata)
applog(LOG_WARNING, "Failed to hash_push in stage_thread"); applog(LOG_WARNING, "Failed to hash_push in stage_thread");
continue; continue;
} }
inc_staged(work->pool, 1, false);
} }
tq_freeze(mythr->q); tq_freeze(mythr->q);
@ -2978,7 +2940,7 @@ static bool queue_request(struct thr_info *thr, bool needed)
int rq, rs; int rq, rs;
rq = requests_queued(); rq = requests_queued();
rs = real_staged(); rs = requests_staged();
/* If we've been generating lots of local work we may already have /* If we've been generating lots of local work we may already have
* enough in the queue */ * enough in the queue */
@ -3051,7 +3013,7 @@ static inline bool should_roll(struct work *work)
{ {
int rs; int rs;
rs = real_staged(); rs = requests_staged();
if (rs >= opt_queue + mining_threads) if (rs >= opt_queue + mining_threads)
return false; return false;
if (work->pool == current_pool() || pool_strategy == POOL_LOADBALANCE || !rs) if (work->pool == current_pool() || pool_strategy == POOL_LOADBALANCE || !rs)
@ -4503,6 +4465,8 @@ int main (int argc, char *argv[])
quit(1, "Failed to pthread_mutex_init"); quit(1, "Failed to pthread_mutex_init");
if (unlikely(pthread_mutex_init(&control_lock, NULL))) if (unlikely(pthread_mutex_init(&control_lock, NULL)))
quit(1, "Failed to pthread_mutex_init"); quit(1, "Failed to pthread_mutex_init");
if (unlikely(pthread_rwlock_init(&blk_lock, NULL)))
quit(1, "Failed to pthread_rwlock_init");
init_max_name_len(); init_max_name_len();

28
miner.h

@ -219,6 +219,34 @@ static inline void mutex_unlock(pthread_mutex_t *lock)
quit(1, "WTF MUTEX ERROR ON UNLOCK!"); quit(1, "WTF MUTEX ERROR ON UNLOCK!");
} }
static inline void wr_lock(pthread_rwlock_t *lock)
{
if (unlikely(pthread_rwlock_wrlock(lock)))
quit(1, "WTF WRLOCK ERROR ON LOCK!");
}
static inline void rd_lock(pthread_rwlock_t *lock)
{
if (unlikely(pthread_rwlock_rdlock(lock)))
quit(1, "WTF RDLOCK ERROR ON LOCK!");
}
static inline void rw_unlock(pthread_rwlock_t *lock)
{
if (unlikely(pthread_rwlock_unlock(lock)))
quit(1, "WTF RWLOCK ERROR ON UNLOCK!");
}
static inline void rd_unlock(pthread_rwlock_t *lock)
{
rw_unlock(lock);
}
static inline void wr_unlock(pthread_rwlock_t *lock)
{
rw_unlock(lock);
}
struct pool; struct pool;
extern bool opt_debug; extern bool opt_debug;

Loading…
Cancel
Save