diff --git a/cgminer.c b/cgminer.c index dc22703f..f8c17a97 100644 --- a/cgminer.c +++ b/cgminer.c @@ -161,8 +161,6 @@ int gpur_thr_id; static int api_thr_id; static int total_threads; -struct work_restart *work_restart = NULL; - static pthread_mutex_t hash_lock; static pthread_mutex_t qd_lock; static pthread_mutex_t *stgd_lock; @@ -2529,7 +2527,7 @@ static void restart_threads(void) queue_request(NULL, true); for (i = 0; i < mining_threads; i++) - work_restart[i].restart = 1; + thr_info[i].work_restart = true; mutex_lock(&restart_lock); pthread_cond_broadcast(&restart_cond); @@ -4034,7 +4032,7 @@ void *miner_thread(void *userdata) gettimeofday(&tv_lastupdate, NULL); while (1) { - work_restart[thr_id].restart = 0; + mythr->work_restart = false; if (api->free_work && likely(work->pool)) api->free_work(mythr, work); if (unlikely(!get_work(work, requested, mythr, thr_id))) { @@ -4089,7 +4087,7 @@ void *miner_thread(void *userdata) gettimeofday(&getwork_start, NULL); - if (unlikely(work_restart[thr_id].restart)) { + if (unlikely(mythr->work_restart)) { /* Apart from device_thread 0, we stagger the * starting of every next thread to try and get @@ -5336,10 +5334,6 @@ int main(int argc, char *argv[]) #endif // defined(unix) total_threads = mining_threads + 7; - work_restart = calloc(total_threads, sizeof(*work_restart)); - if (!work_restart) - quit(1, "Failed to calloc work_restart"); - thr_info = calloc(total_threads, sizeof(*thr)); if (!thr_info) quit(1, "Failed to calloc thr_info"); diff --git a/driver-bitforce.c b/driver-bitforce.c index 6432d59a..276ffcf7 100644 --- a/driver-bitforce.c +++ b/driver-bitforce.c @@ -349,7 +349,7 @@ static uint64_t bitforce_get_result(struct thr_info *thr, struct work *work) return 0; while (bitforce->wait_ms < BITFORCE_LONG_TIMEOUT_MS) { - if (unlikely(work_restart[thr->id].restart)) + if (unlikely(thr->work_restart)) return 1; mutex_lock(&bitforce->device_mutex); diff --git a/driver-cpu.c b/driver-cpu.c index 1f8ac892..fb41669c 100644 --- a/driver-cpu.c +++ b/driver-cpu.c @@ -81,51 +81,51 @@ extern int dev_from_id(int thr_id); /* chipset-optimized hash functions */ -extern bool ScanHash_4WaySSE2(int, const unsigned char *pmidstate, +extern bool ScanHash_4WaySSE2(struct thr_info*, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, uint32_t max_nonce, uint32_t *last_nonce, uint32_t nonce); -extern bool ScanHash_altivec_4way(int thr_id, const unsigned char *pmidstate, +extern bool ScanHash_altivec_4way(struct thr_info*, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, uint32_t max_nonce, uint32_t *last_nonce, uint32_t nonce); -extern bool scanhash_via(int, const unsigned char *pmidstate, +extern bool scanhash_via(struct thr_info*, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *target, uint32_t max_nonce, uint32_t *last_nonce, uint32_t n); -extern bool scanhash_c(int, const unsigned char *midstate, unsigned char *data, +extern bool scanhash_c(struct thr_info*, const unsigned char *midstate, unsigned char *data, unsigned char *hash1, unsigned char *hash, const unsigned char *target, uint32_t max_nonce, uint32_t *last_nonce, uint32_t n); -extern bool scanhash_cryptopp(int, const unsigned char *midstate,unsigned char *data, +extern bool scanhash_cryptopp(struct thr_info*, const unsigned char *midstate,unsigned char *data, unsigned char *hash1, unsigned char *hash, const unsigned char *target, uint32_t max_nonce, uint32_t *last_nonce, uint32_t n); -extern bool scanhash_asm32(int, const unsigned char *midstate,unsigned char *data, +extern bool scanhash_asm32(struct thr_info*, const unsigned char *midstate,unsigned char *data, unsigned char *hash1, unsigned char *hash, const unsigned char *target, uint32_t max_nonce, uint32_t *last_nonce, uint32_t nonce); -extern bool scanhash_sse2_64(int, const unsigned char *pmidstate, unsigned char *pdata, +extern bool scanhash_sse2_64(struct thr_info*, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, uint32_t max_nonce, uint32_t *last_nonce, uint32_t nonce); -extern bool scanhash_sse4_64(int, const unsigned char *pmidstate, unsigned char *pdata, +extern bool scanhash_sse4_64(struct thr_info*, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, uint32_t max_nonce, uint32_t *last_nonce, uint32_t nonce); -extern bool scanhash_sse2_32(int, const unsigned char *pmidstate, unsigned char *pdata, +extern bool scanhash_sse2_32(struct thr_info*, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, uint32_t max_nonce, uint32_t *last_nonce, @@ -224,8 +224,7 @@ double bench_algo_stage3( memset(&work, 0, sizeof(work)); memcpy(&work, &bench_block, min_size); - struct work_restart dummy; - work_restart = &dummy; + struct thr_info dummy = {0}; struct timeval end; struct timeval start; @@ -236,7 +235,7 @@ double bench_algo_stage3( { sha256_func func = sha256_funcs[algo]; (*func)( - 0, + &dummy, work.midstate, work.data, work.hash1, @@ -248,7 +247,6 @@ double bench_algo_stage3( ); } gettimeofday(&end, 0); - work_restart = NULL; uint64_t usec_end = ((uint64_t)end.tv_sec)*1000*1000 + end.tv_usec; uint64_t usec_start = ((uint64_t)start.tv_sec)*1000*1000 + start.tv_usec; @@ -795,7 +793,7 @@ CPUSearch: { sha256_func func = sha256_funcs[opt_algo]; rc = (*func)( - thr_id, + thr, work->midstate, work->data, work->hash1, diff --git a/driver-cpu.h b/driver-cpu.h index 59d75573..ced400a5 100644 --- a/driver-cpu.h +++ b/driver-cpu.h @@ -1,7 +1,7 @@ #ifndef __DEVICE_CPU_H__ #define __DEVICE_CPU_H__ -#include "miner.h" /* for work_restart, TODO: re-factor dependency */ +#include "miner.h" #include "config.h" #include diff --git a/driver-icarus.c b/driver-icarus.c index 2fe561eb..bcb7d180 100644 --- a/driver-icarus.c +++ b/driver-icarus.c @@ -198,7 +198,7 @@ static void rev(unsigned char *s, size_t l) #define icarus_open2(devpath, purge) serial_open(devpath, 115200, ICARUS_READ_FAULT_DECISECONDS, purge) #define icarus_open(devpath) icarus_open2(devpath, false) -static int icarus_gets(unsigned char *buf, int fd, struct timeval *tv_finish, int thr_id, int read_count) +static int icarus_gets(unsigned char *buf, int fd, struct timeval *tv_finish, struct thr_info *thr, int read_count) { ssize_t ret = 0; int rc = 0; @@ -232,7 +232,7 @@ static int icarus_gets(unsigned char *buf, int fd, struct timeval *tv_finish, in return 1; } - if (thr_id >= 0 && work_restart[thr_id].restart) { + if (thr->work_restart) { if (opt_debug) { applog(LOG_DEBUG, "Icarus Read: Work restart at %.2f seconds", @@ -392,7 +392,10 @@ static bool icarus_detect_one(const char *devpath) gettimeofday(&tv_start, NULL); memset(nonce_bin, 0, sizeof(nonce_bin)); - icarus_gets(nonce_bin, fd, &tv_finish, -1, 1); + struct thr_info dummy = { + .work_restart = false, + }; + icarus_gets(nonce_bin, fd, &tv_finish, &dummy, 1); icarus_close(fd); @@ -474,7 +477,6 @@ static bool icarus_prepare(struct thr_info *thr) static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work, __maybe_unused uint64_t max_nonce) { - const int thr_id = thr->id; struct cgpu_info *icarus; int fd; int ret; @@ -529,7 +531,7 @@ static uint64_t icarus_scanhash(struct thr_info *thr, struct work *work, /* Icarus will return 4 bytes (ICARUS_READ_SIZE) nonces or nothing */ memset(nonce_bin, 0, sizeof(nonce_bin)); info = icarus_info[icarus->device_id]; - ret = icarus_gets(nonce_bin, fd, &tv_finish, thr_id, info->read_count); + ret = icarus_gets(nonce_bin, fd, &tv_finish, thr, info->read_count); work->blk.nonce = 0xffffffff; memcpy((char *)&nonce, nonce_bin, sizeof(nonce_bin)); diff --git a/driver-modminer.c b/driver-modminer.c index 5b00aace..88bc3f27 100644 --- a/driver-modminer.c +++ b/driver-modminer.c @@ -390,7 +390,7 @@ fd_set fds; return true; } -#define work_restart(thr) work_restart[thr->id].restart +#define work_restart(thr) thr->work_restart static uint64_t modminer_process_results(struct thr_info*thr) diff --git a/driver-ztex.c b/driver-ztex.c index db223927..e2b37553 100644 --- a/driver-ztex.c +++ b/driver-ztex.c @@ -240,9 +240,9 @@ static uint64_t ztex_scanhash(struct thr_info *thr, struct work *work, overflow = false; applog(LOG_DEBUG, "%s: entering poll loop", ztex->repr); - while (!(overflow || work_restart[thr->id].restart)) { + while (!(overflow || thr->work_restart)) { usleep(250000); - if (work_restart[thr->id].restart) { + if (thr->work_restart) { applog(LOG_DEBUG, "%s: New work detected", ztex->repr); break; } @@ -265,7 +265,7 @@ static uint64_t ztex_scanhash(struct thr_info *thr, struct work *work, } ztex_releaseFpga(ztex); - if (work_restart[thr->id].restart) { + if (thr->work_restart) { applog(LOG_DEBUG, "%s: New work detected", ztex->repr); break; } diff --git a/fpgautils.c b/fpgautils.c index 12e3847d..0ebee7f6 100644 --- a/fpgautils.c +++ b/fpgautils.c @@ -211,8 +211,8 @@ serial_open(const char*devpath, unsigned long baud, signed short timeout, bool p case 0: break; case 115200: - my_termios.c_cflag &= ~CBAUD; - my_termios.c_cflag |= B115200; + cfsetispeed( &my_termios, B115200 ); + cfsetospeed( &my_termios, B115200 ); break; // TODO: try some higher speeds with the Icarus and BFL to see // if they support them and if setting them makes any difference diff --git a/miner.h b/miner.h index 21d5f6a7..50a1ca2a 100644 --- a/miner.h +++ b/miner.h @@ -421,6 +421,8 @@ struct thr_info { bool pause; bool getwork; double rolling; + + bool work_restart; }; extern int thr_info_create(struct thr_info *thr, pthread_attr_t *attr, void *(*start) (void *), void *arg); @@ -558,7 +560,7 @@ extern json_t *json_rpc_call(CURL *curl, const char *url, const char *userpass, extern char *bin2hex(const unsigned char *p, size_t len); extern bool hex2bin(unsigned char *p, const char *hexstr, size_t len); -typedef bool (*sha256_func)(int thr_id, const unsigned char *pmidstate, +typedef bool (*sha256_func)(struct thr_info*, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, @@ -570,11 +572,6 @@ extern bool fulltest(const unsigned char *hash, const unsigned char *target); extern int opt_scantime; -struct work_restart { - volatile unsigned long restart; - char padding[128 - sizeof(unsigned long)]; -}; - extern pthread_mutex_t restart_lock; extern pthread_cond_t restart_cond; @@ -614,7 +611,6 @@ extern int num_processors; extern int hw_errors; extern bool use_syslog; extern struct thr_info *thr_info; -extern struct work_restart *work_restart; extern struct cgpu_info gpus[MAX_GPUDEVICES]; extern int gpu_threads; extern double total_secs; diff --git a/miner.php b/miner.php index b9caa36f..424108b2 100644 --- a/miner.php +++ b/miner.php @@ -166,7 +166,7 @@ function getcss($cssname, $dom = false) $css = ''; foreach ($colourtable as $cssdata => $value) { - $cssobj = split(' ', $cssdata, 2); + $cssobj = explode(' ', $cssdata, 2); if ($cssobj[0] == $cssname) { if (isset($colouroverride[$cssdata])) diff --git a/sha256_4way.c b/sha256_4way.c index 35116a68..d7d03acd 100644 --- a/sha256_4way.c +++ b/sha256_4way.c @@ -100,7 +100,7 @@ static const unsigned int pSHA256InitState[8] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; -bool ScanHash_4WaySSE2(int thr_id, const unsigned char *pmidstate, +bool ScanHash_4WaySSE2(struct thr_info*thr, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, @@ -139,7 +139,7 @@ bool ScanHash_4WaySSE2(int thr_id, const unsigned char *pmidstate, } } - if ((nonce >= max_nonce) || work_restart[thr_id].restart) + if ((nonce >= max_nonce) || thr->work_restart) { *last_nonce = nonce; return false; diff --git a/sha256_altivec_4way.c b/sha256_altivec_4way.c index cb3351c7..f9d8429c 100644 --- a/sha256_altivec_4way.c +++ b/sha256_altivec_4way.c @@ -73,7 +73,7 @@ static const unsigned int pSHA256InitState[8] = {0x6a09e667, 0xbb67ae85, 0x3c6ef372, 0xa54ff53a, 0x510e527f, 0x9b05688c, 0x1f83d9ab, 0x5be0cd19}; -bool ScanHash_altivec_4way(int thr_id, const unsigned char *pmidstate, +bool ScanHash_altivec_4way(struct thr_info*thr, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, @@ -111,7 +111,7 @@ bool ScanHash_altivec_4way(int thr_id, const unsigned char *pmidstate, } } - if ((nonce >= max_nonce) || work_restart[thr_id].restart) + if ((nonce >= max_nonce) || thr->work_restart) { *last_nonce = nonce; return false; diff --git a/sha256_cryptopp.c b/sha256_cryptopp.c index aab8bba8..607f0c46 100644 --- a/sha256_cryptopp.c +++ b/sha256_cryptopp.c @@ -93,7 +93,7 @@ static void runhash(void *state, const void *input, const void *init) } /* suspiciously similar to ScanHash* from bitcoin */ -bool scanhash_cryptopp(int thr_id, const unsigned char *midstate, +bool scanhash_cryptopp(struct thr_info*thr, const unsigned char *midstate, unsigned char *data, unsigned char *hash1, unsigned char *hash, const unsigned char *target, @@ -105,8 +105,6 @@ bool scanhash_cryptopp(int thr_id, const unsigned char *midstate, data += 64; - work_restart[thr_id].restart = 0; - while (1) { n++; *nonce = n; @@ -119,7 +117,7 @@ bool scanhash_cryptopp(int thr_id, const unsigned char *midstate, return true; } - if ((n >= max_nonce) || work_restart[thr_id].restart) { + if ((n >= max_nonce) || thr->work_restart) { *last_nonce = n; return false; } @@ -577,7 +575,7 @@ static void runhash32(void *state, const void *input, const void *init) } /* suspiciously similar to ScanHash* from bitcoin */ -bool scanhash_asm32(int thr_id, const unsigned char *midstate, +bool scanhash_asm32(struct thr_info*thr, const unsigned char *midstate, unsigned char *data, unsigned char *hash1, unsigned char *hash, const unsigned char *target, @@ -601,7 +599,7 @@ bool scanhash_asm32(int thr_id, const unsigned char *midstate, return true; } - if ((n >= max_nonce) || work_restart[thr_id].restart) { + if ((n >= max_nonce) || thr->work_restart) { *last_nonce = n; return false; } diff --git a/sha256_generic.c b/sha256_generic.c index 95591fe4..8badf294 100644 --- a/sha256_generic.c +++ b/sha256_generic.c @@ -239,7 +239,7 @@ const uint32_t sha256_init_state[8] = { }; /* suspiciously similar to ScanHash* from bitcoin */ -bool scanhash_c(int thr_id, const unsigned char *midstate, unsigned char *data, +bool scanhash_c(struct thr_info*thr, const unsigned char *midstate, unsigned char *data, unsigned char *hash1, unsigned char *hash, const unsigned char *target, uint32_t max_nonce, uint32_t *last_nonce, @@ -265,7 +265,7 @@ bool scanhash_c(int thr_id, const unsigned char *midstate, unsigned char *data, return true; } - if ((n >= max_nonce) || work_restart[thr_id].restart) { + if ((n >= max_nonce) || thr->work_restart) { *last_nonce = n; return false; } diff --git a/sha256_sse2_amd64.c b/sha256_sse2_amd64.c index a109e8a6..65a9390c 100644 --- a/sha256_sse2_amd64.c +++ b/sha256_sse2_amd64.c @@ -48,7 +48,7 @@ const uint32_t sha256_init[8]__attribute__((aligned(0x100))) = __m128i g_4sha256_k[64]; __m128i sha256_consts_m128i[64]__attribute__((aligned(0x1000))); -bool scanhash_sse2_64(int thr_id, const unsigned char *pmidstate, +bool scanhash_sse2_64(struct thr_info*thr, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, @@ -119,7 +119,7 @@ bool scanhash_sse2_64(int thr_id, const unsigned char *pmidstate, } } - if (unlikely((nonce >= max_nonce) || work_restart[thr_id].restart)) + if (unlikely((nonce >= max_nonce) || thr->work_restart)) { *last_nonce = nonce; return false; diff --git a/sha256_sse2_i386.c b/sha256_sse2_i386.c index 669781ad..30d9ef17 100644 --- a/sha256_sse2_i386.c +++ b/sha256_sse2_i386.c @@ -48,7 +48,7 @@ const uint32_t sha256_32init[8]__attribute__((aligned(0x100))) = __m128i g_4sha256_k[64]; __m128i sha256_consts_m128i[64]__attribute__((aligned(0x1000))); -bool scanhash_sse2_32(int thr_id, const unsigned char *pmidstate, +bool scanhash_sse2_32(struct thr_info*thr, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, @@ -111,7 +111,7 @@ bool scanhash_sse2_32(int thr_id, const unsigned char *pmidstate, } } - if (unlikely((nonce >= max_nonce) || work_restart[thr_id].restart)) { + if (unlikely((nonce >= max_nonce) || thr->work_restart)) { *last_nonce = nonce; return false; } diff --git a/sha256_sse4_amd64.c b/sha256_sse4_amd64.c index a9cd685d..78d74904 100644 --- a/sha256_sse4_amd64.c +++ b/sha256_sse4_amd64.c @@ -47,7 +47,7 @@ static uint32_t g_sha256_hinit[8] = __m128i g_4sha256_k[64]; -bool scanhash_sse4_64(int thr_id, const unsigned char *pmidstate, +bool scanhash_sse4_64(struct thr_info*thr, const unsigned char *pmidstate, unsigned char *pdata, unsigned char *phash1, unsigned char *phash, const unsigned char *ptarget, @@ -118,7 +118,7 @@ bool scanhash_sse4_64(int thr_id, const unsigned char *pmidstate, } } - if (unlikely((nonce >= max_nonce) || work_restart[thr_id].restart)) + if (unlikely((nonce >= max_nonce) || thr->work_restart)) { *last_nonce = nonce; return false; diff --git a/sha256_via.c b/sha256_via.c index 35f42620..05fdb3ef 100644 --- a/sha256_via.c +++ b/sha256_via.c @@ -19,7 +19,7 @@ static void via_sha256(void *hash, void *buf, unsigned len) :"memory"); } -bool scanhash_via(int thr_id, const unsigned char *pmidstate, +bool scanhash_via(struct thr_info*thr, const unsigned char *pmidstate, unsigned char *data_inout, unsigned char *phash1, unsigned char *phash, const unsigned char *target, @@ -74,7 +74,7 @@ bool scanhash_via(int thr_id, const unsigned char *pmidstate, return true; } - if ((n >= max_nonce) || work_restart[thr_id].restart) { + if ((n >= max_nonce) || thr->work_restart) { *last_nonce = n; return false; } diff --git a/util.c b/util.c index 01cbb20b..c6b82048 100644 --- a/util.c +++ b/util.c @@ -692,9 +692,14 @@ void thr_info_cancel(struct thr_info *thr) * on SMP machines */ void nmsleep(unsigned int msecs) { - struct timespec twait; - - twait.tv_sec = msecs / 1000; - twait.tv_nsec = (uint64_t)(msecs * 1000000) - (uint64_t)(twait.tv_sec / 1000000000); - nanosleep(&twait, NULL); + struct timespec twait, tleft; + int ret; + + tleft.tv_sec = msecs / 1000; + tleft.tv_nsec = (uint64_t)(msecs * 1000000) - (uint64_t)(twait.tv_sec / 1000000000); + do { + twait.tv_sec = tleft.tv_sec; + twait.tv_nsec = tleft.tv_nsec; + ret = nanosleep(&twait, &tleft); + } while (ret == -1 && errno == EINTR); }