|
|
@ -273,7 +273,9 @@ static int include_count; |
|
|
|
static int forkpid; |
|
|
|
static int forkpid; |
|
|
|
#endif // defined(unix)
|
|
|
|
#endif // defined(unix)
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
#ifndef _MSC_VER |
|
|
|
struct sigaction termhandler, inthandler; |
|
|
|
struct sigaction termhandler, inthandler; |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
struct thread_q *getq; |
|
|
|
struct thread_q *getq; |
|
|
|
|
|
|
|
|
|
|
@ -505,7 +507,7 @@ struct pool *add_pool(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct pool *pool; |
|
|
|
struct pool *pool; |
|
|
|
|
|
|
|
|
|
|
|
pool = calloc(sizeof(struct pool), 1); |
|
|
|
pool = (struct pool *)calloc(sizeof(struct pool), 1); |
|
|
|
if (!pool) |
|
|
|
if (!pool) |
|
|
|
quit(1, "Failed to malloc pool in add_pool"); |
|
|
|
quit(1, "Failed to malloc pool in add_pool"); |
|
|
|
pool->pool_no = pool->prio = total_pools; |
|
|
|
pool->pool_no = pool->prio = total_pools; |
|
|
@ -518,7 +520,6 @@ struct pool *add_pool(void) |
|
|
|
pool->has_stratum ? pool->stratum_port : ""); |
|
|
|
pool->has_stratum ? pool->stratum_port : ""); |
|
|
|
pool->poolname = strdup(buf); |
|
|
|
pool->poolname = strdup(buf); |
|
|
|
|
|
|
|
|
|
|
|
pools = realloc(pools, sizeof(struct pool *) * (total_pools + 2)); |
|
|
|
|
|
|
|
pools[total_pools++] = pool; |
|
|
|
pools[total_pools++] = pool; |
|
|
|
mutex_init(&pool->pool_lock); |
|
|
|
mutex_init(&pool->pool_lock); |
|
|
|
if (unlikely(pthread_cond_init(&pool->cr_cond, NULL))) |
|
|
|
if (unlikely(pthread_cond_init(&pool->cr_cond, NULL))) |
|
|
@ -718,7 +719,7 @@ static void setup_url(struct pool *pool, char *arg) |
|
|
|
strncmp(arg, "https://", 8)) { |
|
|
|
strncmp(arg, "https://", 8)) { |
|
|
|
char *httpinput; |
|
|
|
char *httpinput; |
|
|
|
|
|
|
|
|
|
|
|
httpinput = malloc(255); |
|
|
|
httpinput = (char *)malloc(255); |
|
|
|
if (!httpinput) |
|
|
|
if (!httpinput) |
|
|
|
quit(1, "Failed to malloc httpinput"); |
|
|
|
quit(1, "Failed to malloc httpinput"); |
|
|
|
strcpy(httpinput, "http://"); |
|
|
|
strcpy(httpinput, "http://"); |
|
|
@ -1449,7 +1450,7 @@ static char *load_config(const char *arg, void __maybe_unused *unused) |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
if (!json_is_object(config)) { |
|
|
|
if (!json_is_object(config)) { |
|
|
|
siz = JSON_LOAD_ERROR_LEN + strlen(arg) + strlen(err.text); |
|
|
|
siz = JSON_LOAD_ERROR_LEN + strlen(arg) + strlen(err.text); |
|
|
|
json_error = malloc(siz); |
|
|
|
json_error = (char *)malloc(siz); |
|
|
|
if (!json_error) |
|
|
|
if (!json_error) |
|
|
|
quit(1, "Malloc failure in json error"); |
|
|
|
quit(1, "Malloc failure in json error"); |
|
|
|
|
|
|
|
|
|
|
@ -1475,7 +1476,7 @@ void default_save_file(char *filename); |
|
|
|
|
|
|
|
|
|
|
|
static void load_default_config(void) |
|
|
|
static void load_default_config(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
cnfbuf = malloc(PATH_MAX); |
|
|
|
cnfbuf = (char *)malloc(PATH_MAX); |
|
|
|
|
|
|
|
|
|
|
|
default_save_file(cnfbuf); |
|
|
|
default_save_file(cnfbuf); |
|
|
|
|
|
|
|
|
|
|
@ -1545,7 +1546,7 @@ static bool jobj_binary(const json_t *obj, const char *key, |
|
|
|
applog(LOG_ERR, "JSON key '%s' is not a string", key); |
|
|
|
applog(LOG_ERR, "JSON key '%s' is not a string", key); |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
} |
|
|
|
} |
|
|
|
if (!hex2bin(buf, hexstr, buflen)) |
|
|
|
if (!hex2bin((unsigned char *)buf, hexstr, buflen)) |
|
|
|
return false; |
|
|
|
return false; |
|
|
|
|
|
|
|
|
|
|
|
return true; |
|
|
|
return true; |
|
|
@ -1567,35 +1568,35 @@ static void calc_midstate(struct work *work) |
|
|
|
|
|
|
|
|
|
|
|
static struct work *make_work(void) |
|
|
|
static struct work *make_work(void) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct work *work = calloc(1, sizeof(struct work)); |
|
|
|
struct work *w = (struct work *)calloc(1, sizeof(struct work)); |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!work)) |
|
|
|
if (unlikely(!w)) |
|
|
|
quit(1, "Failed to calloc work in make_work"); |
|
|
|
quit(1, "Failed to calloc work in make_work"); |
|
|
|
|
|
|
|
|
|
|
|
cg_wlock(&control_lock); |
|
|
|
cg_wlock(&control_lock); |
|
|
|
work->id = total_work++; |
|
|
|
w->id = total_work++; |
|
|
|
cg_wunlock(&control_lock); |
|
|
|
cg_wunlock(&control_lock); |
|
|
|
|
|
|
|
|
|
|
|
return work; |
|
|
|
return w; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* This is the central place all work that is about to be retired should be
|
|
|
|
/* This is the central place all work that is about to be retired should be
|
|
|
|
* cleaned to remove any dynamically allocated arrays within the struct */ |
|
|
|
* cleaned to remove any dynamically allocated arrays within the struct */ |
|
|
|
void clean_work(struct work *work) |
|
|
|
void clean_work(struct work *w) |
|
|
|
{ |
|
|
|
{ |
|
|
|
free(work->job_id); |
|
|
|
free(w->job_id); |
|
|
|
free(work->ntime); |
|
|
|
free(w->ntime); |
|
|
|
free(work->coinbase); |
|
|
|
free(w->coinbase); |
|
|
|
free(work->nonce1); |
|
|
|
free(w->nonce1); |
|
|
|
memset(work, 0, sizeof(struct work)); |
|
|
|
memset(w, 0, sizeof(struct work)); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
/* All dynamically allocated work structs should be freed here to not leak any
|
|
|
|
/* All dynamically allocated work structs should be freed here to not leak any
|
|
|
|
* ram from arrays allocated within the work struct */ |
|
|
|
* ram from arrays allocated within the work struct */ |
|
|
|
void free_work(struct work *work) |
|
|
|
void free_work(struct work *w) |
|
|
|
{ |
|
|
|
{ |
|
|
|
clean_work(work); |
|
|
|
clean_work(w); |
|
|
|
free(work); |
|
|
|
free(w); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
static void gen_hash(unsigned char *data, unsigned char *hash, int len); |
|
|
|
static void gen_hash(unsigned char *data, unsigned char *hash, int len); |
|
|
@ -1627,7 +1628,7 @@ static bool __build_gbt_txns(struct pool *pool, json_t *res_val) |
|
|
|
if (!pool->gbt_txns) |
|
|
|
if (!pool->gbt_txns) |
|
|
|
goto out; |
|
|
|
goto out; |
|
|
|
|
|
|
|
|
|
|
|
pool->txn_hashes = calloc(32 * (pool->gbt_txns + 1), 1); |
|
|
|
pool->txn_hashes = (unsigned char *)calloc(32 * (pool->gbt_txns + 1), 1); |
|
|
|
if (unlikely(!pool->txn_hashes)) |
|
|
|
if (unlikely(!pool->txn_hashes)) |
|
|
|
quit(1, "Failed to calloc txn_hashes in __build_gbt_txns"); |
|
|
|
quit(1, "Failed to calloc txn_hashes in __build_gbt_txns"); |
|
|
|
|
|
|
|
|
|
|
@ -1639,7 +1640,7 @@ static bool __build_gbt_txns(struct pool *pool, json_t *res_val) |
|
|
|
|
|
|
|
|
|
|
|
cal_len = txn_len; |
|
|
|
cal_len = txn_len; |
|
|
|
align_len(&cal_len); |
|
|
|
align_len(&cal_len); |
|
|
|
txn_bin = calloc(cal_len, 1); |
|
|
|
txn_bin = (unsigned char *)calloc(cal_len, 1); |
|
|
|
if (unlikely(!txn_bin)) |
|
|
|
if (unlikely(!txn_bin)) |
|
|
|
quit(1, "Failed to calloc txn_bin in __build_gbt_txns"); |
|
|
|
quit(1, "Failed to calloc txn_bin in __build_gbt_txns"); |
|
|
|
if (unlikely(!hex2bin(txn_bin, txn, txn_len / 2))) |
|
|
|
if (unlikely(!hex2bin(txn_bin, txn, txn_len / 2))) |
|
|
@ -1657,7 +1658,7 @@ static unsigned char *__gbt_merkleroot(struct pool *pool) |
|
|
|
unsigned char *merkle_hash; |
|
|
|
unsigned char *merkle_hash; |
|
|
|
int i, txns; |
|
|
|
int i, txns; |
|
|
|
|
|
|
|
|
|
|
|
merkle_hash = calloc(32 * (pool->gbt_txns + 2), 1); |
|
|
|
merkle_hash = (unsigned char *)calloc(32 * (pool->gbt_txns + 2), 1); |
|
|
|
if (unlikely(!merkle_hash)) |
|
|
|
if (unlikely(!merkle_hash)) |
|
|
|
quit(1, "Failed to calloc merkle_hash in __gbt_merkleroot"); |
|
|
|
quit(1, "Failed to calloc merkle_hash in __gbt_merkleroot"); |
|
|
|
|
|
|
|
|
|
|
@ -1837,7 +1838,7 @@ static bool gbt_decode(struct pool *pool, json_t *res_val) |
|
|
|
cal_len = pool->coinbase_len + 1; |
|
|
|
cal_len = pool->coinbase_len + 1; |
|
|
|
align_len(&cal_len); |
|
|
|
align_len(&cal_len); |
|
|
|
free(pool->coinbase); |
|
|
|
free(pool->coinbase); |
|
|
|
pool->coinbase = calloc(cal_len, 1); |
|
|
|
pool->coinbase = (unsigned char *)calloc(cal_len, 1); |
|
|
|
if (unlikely(!pool->coinbase)) |
|
|
|
if (unlikely(!pool->coinbase)) |
|
|
|
quit(1, "Failed to calloc pool coinbase in gbt_decode"); |
|
|
|
quit(1, "Failed to calloc pool coinbase in gbt_decode"); |
|
|
|
hex2bin(pool->coinbase, pool->coinbasetxn, 42); |
|
|
|
hex2bin(pool->coinbase, pool->coinbasetxn, 42); |
|
|
@ -1984,7 +1985,7 @@ static int devcursor, logstart, logcursor; |
|
|
|
/* statusy is where the status window goes up to in cases where it won't fit at startup */ |
|
|
|
/* statusy is where the status window goes up to in cases where it won't fit at startup */ |
|
|
|
static int statusy; |
|
|
|
static int statusy; |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
struct cgpu_info gpus[MAX_GPUDEVICES]; /* Maximum number apparently possible */ |
|
|
|
extern struct cgpu_info gpus[MAX_GPUDEVICES]; /* Maximum number apparently possible */ |
|
|
|
|
|
|
|
|
|
|
|
#ifdef HAVE_CURSES |
|
|
|
#ifdef HAVE_CURSES |
|
|
|
static inline void unlock_curses(void) |
|
|
|
static inline void unlock_curses(void) |
|
|
@ -2155,7 +2156,7 @@ static void curses_print_status(void) |
|
|
|
|
|
|
|
|
|
|
|
static void adj_width(int var, int *length) |
|
|
|
static void adj_width(int var, int *length) |
|
|
|
{ |
|
|
|
{ |
|
|
|
if ((int)(log10(var) + 1) > *length) |
|
|
|
if ((int)(log10((double)var) + 1) > *length) |
|
|
|
(*length)++; |
|
|
|
(*length)++; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -2579,34 +2580,34 @@ static bool submit_upstream_work(struct work *work, CURL *curl, bool resubmit) |
|
|
|
} else if (work->gbt_txns <= 0xffff) { |
|
|
|
} else if (work->gbt_txns <= 0xffff) { |
|
|
|
uint16_t val = htole16(work->gbt_txns); |
|
|
|
uint16_t val = htole16(work->gbt_txns); |
|
|
|
|
|
|
|
|
|
|
|
gbt_block = realloc_strcat(gbt_block, "fd"); |
|
|
|
gbt_block = (char *)realloc_strcat(gbt_block, "fd"); |
|
|
|
varint = bin2hex((const unsigned char *)&val, 2); |
|
|
|
varint = bin2hex((const unsigned char *)&val, 2); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
uint32_t val = htole32(work->gbt_txns); |
|
|
|
uint32_t val = htole32(work->gbt_txns); |
|
|
|
|
|
|
|
|
|
|
|
gbt_block = realloc_strcat(gbt_block, "fe"); |
|
|
|
gbt_block = (char *)realloc_strcat(gbt_block, "fe"); |
|
|
|
varint = bin2hex((const unsigned char *)&val, 4); |
|
|
|
varint = bin2hex((const unsigned char *)&val, 4); |
|
|
|
} |
|
|
|
} |
|
|
|
gbt_block = realloc_strcat(gbt_block, varint); |
|
|
|
gbt_block = (char *)realloc_strcat(gbt_block, varint); |
|
|
|
free(varint); |
|
|
|
free(varint); |
|
|
|
gbt_block = realloc_strcat(gbt_block, work->coinbase); |
|
|
|
gbt_block = (char *)realloc_strcat(gbt_block, work->coinbase); |
|
|
|
|
|
|
|
|
|
|
|
s = strdup("{\"id\": 0, \"method\": \"submitblock\", \"params\": [\""); |
|
|
|
s = strdup("{\"id\": 0, \"method\": \"submitblock\", \"params\": [\""); |
|
|
|
s = realloc_strcat(s, gbt_block); |
|
|
|
s = (char *)realloc_strcat(s, gbt_block); |
|
|
|
if (work->job_id) { |
|
|
|
if (work->job_id) { |
|
|
|
s = realloc_strcat(s, "\", {\"workid\": \""); |
|
|
|
s = (char *)realloc_strcat(s, "\", {\"workid\": \""); |
|
|
|
s = realloc_strcat(s, work->job_id); |
|
|
|
s = (char *)realloc_strcat(s, work->job_id); |
|
|
|
s = realloc_strcat(s, "\"}]}"); |
|
|
|
s = (char *)realloc_strcat(s, "\"}]}"); |
|
|
|
} else |
|
|
|
} else |
|
|
|
s = realloc_strcat(s, "\", {}]}"); |
|
|
|
s = (char *)realloc_strcat(s, "\", {}]}"); |
|
|
|
free(gbt_block); |
|
|
|
free(gbt_block); |
|
|
|
} else { |
|
|
|
} else { |
|
|
|
s = strdup("{\"method\": \"getwork\", \"params\": [ \""); |
|
|
|
s = strdup("{\"method\": \"getwork\", \"params\": [ \""); |
|
|
|
s = realloc_strcat(s, hexstr); |
|
|
|
s = (char *)realloc_strcat(s, hexstr); |
|
|
|
s = realloc_strcat(s, "\" ], \"id\":1}"); |
|
|
|
s = (char *)realloc_strcat(s, "\" ], \"id\":1}"); |
|
|
|
} |
|
|
|
} |
|
|
|
applog(LOG_DEBUG, "DBG: sending %s submit RPC call: %s", pool->rpc_url, s); |
|
|
|
applog(LOG_DEBUG, "DBG: sending %s submit RPC call: %s", pool->rpc_url, s); |
|
|
|
s = realloc_strcat(s, "\n"); |
|
|
|
s = (char *)realloc_strcat(s, "\n"); |
|
|
|
|
|
|
|
|
|
|
|
cgtime(&tv_submit); |
|
|
|
cgtime(&tv_submit); |
|
|
|
/* issue JSON-RPC request */ |
|
|
|
/* issue JSON-RPC request */ |
|
|
@ -2899,13 +2900,13 @@ static double le256todouble(const void *target) |
|
|
|
uint64_t *data64; |
|
|
|
uint64_t *data64; |
|
|
|
double dcut64; |
|
|
|
double dcut64; |
|
|
|
|
|
|
|
|
|
|
|
data64 = (uint64_t *)(target + 24); |
|
|
|
data64 = &(*(((uint64_t *)target) + 24)); |
|
|
|
dcut64 = le64toh(*data64) * bits192; |
|
|
|
dcut64 = le64toh(*data64) * bits192; |
|
|
|
|
|
|
|
|
|
|
|
data64 = (uint64_t *)(target + 16); |
|
|
|
data64 = &(*(((uint64_t *)target) + 16)); |
|
|
|
dcut64 += le64toh(*data64) * bits128; |
|
|
|
dcut64 += le64toh(*data64) * bits128; |
|
|
|
|
|
|
|
|
|
|
|
data64 = (uint64_t *)(target + 8); |
|
|
|
data64 = &(*(((uint64_t *)target) + 8)); |
|
|
|
dcut64 += le64toh(*data64) * bits64; |
|
|
|
dcut64 += le64toh(*data64) * bits64; |
|
|
|
|
|
|
|
|
|
|
|
data64 = (uint64_t *)(target); |
|
|
|
data64 = (uint64_t *)(target); |
|
|
@ -3133,9 +3134,11 @@ void app_restart(void) |
|
|
|
|
|
|
|
|
|
|
|
static void sighandler(int __maybe_unused sig) |
|
|
|
static void sighandler(int __maybe_unused sig) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
#ifndef _MSC_VER |
|
|
|
/* Restore signal handlers so we can still quit if kill_work fails */ |
|
|
|
/* Restore signal handlers so we can still quit if kill_work fails */ |
|
|
|
sigaction(SIGTERM, &termhandler, NULL); |
|
|
|
sigaction(SIGTERM, &termhandler, NULL); |
|
|
|
sigaction(SIGINT, &inthandler, NULL); |
|
|
|
sigaction(SIGINT, &inthandler, NULL); |
|
|
|
|
|
|
|
#endif |
|
|
|
kill_work(); |
|
|
|
kill_work(); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
@ -3144,7 +3147,7 @@ static void sighandler(int __maybe_unused sig) |
|
|
|
* this pool. */ |
|
|
|
* this pool. */ |
|
|
|
static void recruit_curl(struct pool *pool) |
|
|
|
static void recruit_curl(struct pool *pool) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct curl_ent *ce = calloc(sizeof(struct curl_ent), 1); |
|
|
|
struct curl_ent *ce = (struct curl_ent *)calloc(sizeof(struct curl_ent), 1); |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!ce)) |
|
|
|
if (unlikely(!ce)) |
|
|
|
quit(1, "Failed to calloc in recruit_curl"); |
|
|
|
quit(1, "Failed to calloc in recruit_curl"); |
|
|
@ -3182,7 +3185,8 @@ retry: |
|
|
|
recruited = true; |
|
|
|
recruited = true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
ce = list_entry(pool->curlring.next, struct curl_ent, node); |
|
|
|
ce = list_entry(pool->curlring.next, struct curl_ent*, node); |
|
|
|
|
|
|
|
|
|
|
|
list_del(&ce->node); |
|
|
|
list_del(&ce->node); |
|
|
|
mutex_unlock(&pool->pool_lock); |
|
|
|
mutex_unlock(&pool->pool_lock); |
|
|
|
|
|
|
|
|
|
|
@ -3899,7 +3903,7 @@ static bool 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 */ |
|
|
|
if (!block_exists(hexstr)) { |
|
|
|
if (!block_exists(hexstr)) { |
|
|
|
struct block *s = calloc(sizeof(struct block), 1); |
|
|
|
struct block *s = (struct block *)calloc(sizeof(struct block), 1); |
|
|
|
int deleted_block = 0; |
|
|
|
int deleted_block = 0; |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!s)) |
|
|
|
if (unlikely(!s)) |
|
|
@ -4104,9 +4108,9 @@ static char *json_escape(char *str) |
|
|
|
char *buf, *ptr; |
|
|
|
char *buf, *ptr; |
|
|
|
|
|
|
|
|
|
|
|
/* 2x is the max, may as well just allocate that */ |
|
|
|
/* 2x is the max, may as well just allocate that */ |
|
|
|
ptr = buf = malloc(strlen(str) * 2 + 1); |
|
|
|
ptr = buf = (char *)malloc(strlen(str) * 2 + 1); |
|
|
|
|
|
|
|
|
|
|
|
jeptr = malloc(sizeof(*jeptr)); |
|
|
|
jeptr = (struct JE *)malloc(sizeof(*jeptr)); |
|
|
|
|
|
|
|
|
|
|
|
jeptr->buf = buf; |
|
|
|
jeptr->buf = buf; |
|
|
|
jeptr->next = jedata; |
|
|
|
jeptr->next = jedata; |
|
|
@ -4579,7 +4583,7 @@ retry: |
|
|
|
goto retry; |
|
|
|
goto retry; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
pool_strategy = selected; |
|
|
|
pool_strategy = (enum pool_strategy)selected; |
|
|
|
switch_pools(NULL); |
|
|
|
switch_pools(NULL); |
|
|
|
goto updated; |
|
|
|
goto updated; |
|
|
|
} else if (!strncasecmp(&input, "i", 1)) { |
|
|
|
} else if (!strncasecmp(&input, "i", 1)) { |
|
|
@ -4854,7 +4858,7 @@ static void *input_thread(void __maybe_unused *userdata) |
|
|
|
|
|
|
|
|
|
|
|
static void *api_thread(void *userdata) |
|
|
|
static void *api_thread(void *userdata) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct thr_info *mythr = userdata; |
|
|
|
struct thr_info *mythr = (struct thr_info *)userdata; |
|
|
|
|
|
|
|
|
|
|
|
pthread_detach(pthread_self()); |
|
|
|
pthread_detach(pthread_self()); |
|
|
|
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); |
|
|
|
pthread_setcanceltype(PTHREAD_CANCEL_ASYNCHRONOUS, NULL); |
|
|
@ -5362,7 +5366,7 @@ static void *stratum_sthread(void *userdata) |
|
|
|
if (unlikely(pool->removed)) |
|
|
|
if (unlikely(pool->removed)) |
|
|
|
break; |
|
|
|
break; |
|
|
|
|
|
|
|
|
|
|
|
work = tq_pop(pool->stratum_q, NULL); |
|
|
|
work = (struct work *)tq_pop(pool->stratum_q, NULL); |
|
|
|
if (unlikely(!work)) |
|
|
|
if (unlikely(!work)) |
|
|
|
quit(1, "Stratum q returned empty work"); |
|
|
|
quit(1, "Stratum q returned empty work"); |
|
|
|
|
|
|
|
|
|
|
@ -5373,7 +5377,7 @@ static void *stratum_sthread(void *userdata) |
|
|
|
continue; |
|
|
|
continue; |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
sshare = calloc(sizeof(struct stratum_share), 1); |
|
|
|
sshare = (struct stratum_share *)calloc(sizeof(struct stratum_share), 1); |
|
|
|
hash32 = (uint32_t *)work->hash; |
|
|
|
hash32 = (uint32_t *)work->hash; |
|
|
|
submitted = false; |
|
|
|
submitted = false; |
|
|
|
|
|
|
|
|
|
|
@ -5541,11 +5545,11 @@ retry_stratum: |
|
|
|
json_t *arrval = json_array_get(mutables, i); |
|
|
|
json_t *arrval = json_array_get(mutables, i); |
|
|
|
|
|
|
|
|
|
|
|
if (json_is_string(arrval)) { |
|
|
|
if (json_is_string(arrval)) { |
|
|
|
const char *mutable = json_string_value(arrval); |
|
|
|
const char *mut = json_string_value(arrval); |
|
|
|
|
|
|
|
|
|
|
|
if (!strncasecmp(mutable, "coinbase/append", 15)) |
|
|
|
if (!strncasecmp(mut, "coinbase/append", 15)) |
|
|
|
append = true; |
|
|
|
append = true; |
|
|
|
else if (!strncasecmp(mutable, "submit/coinbase", 15)) |
|
|
|
else if (!strncasecmp(mut, "submit/coinbase", 15)) |
|
|
|
submit = true; |
|
|
|
submit = true; |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
|
} |
|
|
@ -5631,7 +5635,7 @@ retry_stratum: |
|
|
|
need_slash = true; |
|
|
|
need_slash = true; |
|
|
|
|
|
|
|
|
|
|
|
siz = strlen(pool->rpc_url) + strlen(copy_start) + 2; |
|
|
|
siz = strlen(pool->rpc_url) + strlen(copy_start) + 2; |
|
|
|
pool->lp_url = malloc(siz); |
|
|
|
pool->lp_url = (char *)malloc(siz); |
|
|
|
if (!pool->lp_url) { |
|
|
|
if (!pool->lp_url) { |
|
|
|
applog(LOG_ERR, "Malloc failure in pool_active"); |
|
|
|
applog(LOG_ERR, "Malloc failure in pool_active"); |
|
|
|
return false; |
|
|
|
return false; |
|
|
@ -6092,7 +6096,7 @@ static void hash_sole_work(struct thr_info *mythr) |
|
|
|
struct sgminer_stats *dev_stats = &(cgpu->sgminer_stats); |
|
|
|
struct sgminer_stats *dev_stats = &(cgpu->sgminer_stats); |
|
|
|
struct sgminer_stats *pool_stats; |
|
|
|
struct sgminer_stats *pool_stats; |
|
|
|
/* Try to cycle approximately 5 times before each log update */ |
|
|
|
/* Try to cycle approximately 5 times before each log update */ |
|
|
|
const long cycle = opt_log_interval / 5 ? : 1; |
|
|
|
const long cycle = opt_log_interval / 5 ? 5 : 1; |
|
|
|
const bool primary = (!mythr->device_thread) || mythr->primary_thread; |
|
|
|
const bool primary = (!mythr->device_thread) || mythr->primary_thread; |
|
|
|
struct timeval diff, sdiff, wdiff = {0, 0}; |
|
|
|
struct timeval diff, sdiff, wdiff = {0, 0}; |
|
|
|
uint32_t max_nonce = drv->can_limit_work(mythr); |
|
|
|
uint32_t max_nonce = drv->can_limit_work(mythr); |
|
|
@ -6529,7 +6533,7 @@ void hash_driver_work(struct thr_info *mythr) |
|
|
|
|
|
|
|
|
|
|
|
void *miner_thread(void *userdata) |
|
|
|
void *miner_thread(void *userdata) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct thr_info *mythr = userdata; |
|
|
|
struct thr_info *mythr = (struct thr_info *)userdata; |
|
|
|
const int thr_id = mythr->id; |
|
|
|
const int thr_id = mythr->id; |
|
|
|
struct cgpu_info *cgpu = mythr->cgpu; |
|
|
|
struct cgpu_info *cgpu = mythr->cgpu; |
|
|
|
struct device_drv *drv = cgpu->drv; |
|
|
|
struct device_drv *drv = cgpu->drv; |
|
|
@ -7200,7 +7204,7 @@ char *curses_input(const char *query) |
|
|
|
char *input; |
|
|
|
char *input; |
|
|
|
|
|
|
|
|
|
|
|
echo(); |
|
|
|
echo(); |
|
|
|
input = malloc(255); |
|
|
|
input = (char *)malloc(255); |
|
|
|
if (!input) |
|
|
|
if (!input) |
|
|
|
quit(1, "Failed to malloc input"); |
|
|
|
quit(1, "Failed to malloc input"); |
|
|
|
leaveok(logwin, false); |
|
|
|
leaveok(logwin, false); |
|
|
@ -7258,7 +7262,7 @@ bool add_pool_details(struct pool *pool, bool live, char *url, char *user, char |
|
|
|
pool->rpc_user = user; |
|
|
|
pool->rpc_user = user; |
|
|
|
pool->rpc_pass = pass; |
|
|
|
pool->rpc_pass = pass; |
|
|
|
siz = strlen(pool->rpc_user) + strlen(pool->rpc_pass) + 2; |
|
|
|
siz = strlen(pool->rpc_user) + strlen(pool->rpc_pass) + 2; |
|
|
|
pool->rpc_userpass = malloc(siz); |
|
|
|
pool->rpc_userpass = (char *)malloc(siz); |
|
|
|
if (!pool->rpc_userpass) |
|
|
|
if (!pool->rpc_userpass) |
|
|
|
quit(1, "Failed to malloc userpass"); |
|
|
|
quit(1, "Failed to malloc userpass"); |
|
|
|
snprintf(pool->rpc_userpass, siz, "%s:%s", pool->rpc_user, pool->rpc_pass); |
|
|
|
snprintf(pool->rpc_userpass, siz, "%s:%s", pool->rpc_user, pool->rpc_pass); |
|
|
@ -7304,7 +7308,7 @@ static bool input_pool(bool live) |
|
|
|
strncmp(url, "https://", 8)) { |
|
|
|
strncmp(url, "https://", 8)) { |
|
|
|
char *httpinput; |
|
|
|
char *httpinput; |
|
|
|
|
|
|
|
|
|
|
|
httpinput = malloc(256); |
|
|
|
httpinput = (char *)malloc(256); |
|
|
|
if (!httpinput) |
|
|
|
if (!httpinput) |
|
|
|
quit(1, "Failed to malloc httpinput"); |
|
|
|
quit(1, "Failed to malloc httpinput"); |
|
|
|
strcpy(httpinput, "http://"); |
|
|
|
strcpy(httpinput, "http://"); |
|
|
@ -7577,14 +7581,14 @@ bool add_cgpu(struct cgpu_info *cgpu) |
|
|
|
if (d) |
|
|
|
if (d) |
|
|
|
cgpu->device_id = ++d->lastid; |
|
|
|
cgpu->device_id = ++d->lastid; |
|
|
|
else { |
|
|
|
else { |
|
|
|
d = malloc(sizeof(*d)); |
|
|
|
d = (struct _cgpu_devid_counter *)malloc(sizeof(*d)); |
|
|
|
memcpy(d->name, cgpu->drv->name, sizeof(d->name)); |
|
|
|
memcpy(d->name, cgpu->drv->name, sizeof(d->name)); |
|
|
|
cgpu->device_id = d->lastid = 0; |
|
|
|
cgpu->device_id = d->lastid = 0; |
|
|
|
HASH_ADD_STR(devids, name, d); |
|
|
|
HASH_ADD_STR(devids, name, d); |
|
|
|
} |
|
|
|
} |
|
|
|
|
|
|
|
|
|
|
|
wr_lock(&devices_lock); |
|
|
|
wr_lock(&devices_lock); |
|
|
|
devices = realloc(devices, sizeof(struct cgpu_info *) * (total_devices + new_devices + 2)); |
|
|
|
devices = (struct cgpu_info **)realloc(devices, sizeof(struct cgpu_info *) * (total_devices + new_devices + 2)); |
|
|
|
wr_unlock(&devices_lock); |
|
|
|
wr_unlock(&devices_lock); |
|
|
|
|
|
|
|
|
|
|
|
mutex_lock(&stats_lock); |
|
|
|
mutex_lock(&stats_lock); |
|
|
@ -7604,7 +7608,7 @@ struct device_drv *copy_drv(struct device_drv *drv) |
|
|
|
{ |
|
|
|
{ |
|
|
|
struct device_drv *copy; |
|
|
|
struct device_drv *copy; |
|
|
|
|
|
|
|
|
|
|
|
if (unlikely(!(copy = malloc(sizeof(*copy))))) { |
|
|
|
if (unlikely(!(copy = (struct device_drv *)malloc(sizeof(*copy))))) { |
|
|
|
quit(1, "Failed to allocate device_drv copy of %s (%s)", |
|
|
|
quit(1, "Failed to allocate device_drv copy of %s (%s)", |
|
|
|
drv->name, drv->copy ? "copy" : "original"); |
|
|
|
drv->name, drv->copy ? "copy" : "original"); |
|
|
|
} |
|
|
|
} |
|
|
@ -7630,7 +7634,9 @@ static void probe_pools(void) |
|
|
|
|
|
|
|
|
|
|
|
int main(int argc, char *argv[]) |
|
|
|
int main(int argc, char *argv[]) |
|
|
|
{ |
|
|
|
{ |
|
|
|
|
|
|
|
#ifndef _MSC_VER |
|
|
|
struct sigaction handler; |
|
|
|
struct sigaction handler; |
|
|
|
|
|
|
|
#endif |
|
|
|
struct thr_info *thr; |
|
|
|
struct thr_info *thr; |
|
|
|
struct block *block; |
|
|
|
struct block *block; |
|
|
|
unsigned int k; |
|
|
|
unsigned int k; |
|
|
@ -7648,7 +7654,7 @@ int main(int argc, char *argv[]) |
|
|
|
quithere(1, "Failed to pthread_mutex_init lockstat_lock errno=%d", errno); |
|
|
|
quithere(1, "Failed to pthread_mutex_init lockstat_lock errno=%d", errno); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
initial_args = malloc(sizeof(char *) * (argc + 1)); |
|
|
|
initial_args = (const char **)malloc(sizeof(char *)* (argc + 1)); |
|
|
|
for (i = 0; i < argc; i++) |
|
|
|
for (i = 0; i < argc; i++) |
|
|
|
initial_args[i] = strdup(argv[i]); |
|
|
|
initial_args[i] = strdup(argv[i]); |
|
|
|
initial_args[argc] = NULL; |
|
|
|
initial_args[argc] = NULL; |
|
|
@ -7685,29 +7691,38 @@ int main(int argc, char *argv[]) |
|
|
|
|
|
|
|
|
|
|
|
snprintf(packagename, sizeof(packagename), "%s %s", PACKAGE, VERSION); |
|
|
|
snprintf(packagename, sizeof(packagename), "%s %s", PACKAGE, VERSION); |
|
|
|
|
|
|
|
|
|
|
|
handler.sa_handler = &sighandler; |
|
|
|
|
|
|
|
handler.sa_flags = 0; |
|
|
|
|
|
|
|
sigemptyset(&handler.sa_mask); |
|
|
|
|
|
|
|
sigaction(SIGTERM, &handler, &termhandler); |
|
|
|
|
|
|
|
sigaction(SIGINT, &handler, &inthandler); |
|
|
|
|
|
|
|
#ifndef WIN32 |
|
|
|
#ifndef WIN32 |
|
|
|
signal(SIGPIPE, SIG_IGN); |
|
|
|
signal(SIGPIPE, SIG_IGN); |
|
|
|
#else |
|
|
|
#else |
|
|
|
timeBeginPeriod(1); |
|
|
|
timeBeginPeriod(1); |
|
|
|
#endif |
|
|
|
#endif |
|
|
|
opt_kernel_path = alloca(PATH_MAX); |
|
|
|
|
|
|
|
|
|
|
|
#ifndef _MSC_VER |
|
|
|
|
|
|
|
handler.sa_handler = &sighandler; |
|
|
|
|
|
|
|
handler.sa_flags = 0; |
|
|
|
|
|
|
|
sigemptyset(&handler.sa_mask); |
|
|
|
|
|
|
|
sigaction(SIGTERM, &handler, &termhandler); |
|
|
|
|
|
|
|
sigaction(SIGINT, &handler, &inthandler); |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
opt_kernel_path = (char *)alloca(PATH_MAX); |
|
|
|
strcpy(opt_kernel_path, SGMINER_PREFIX); |
|
|
|
strcpy(opt_kernel_path, SGMINER_PREFIX); |
|
|
|
sgminer_path = alloca(PATH_MAX); |
|
|
|
sgminer_path = (char *)alloca(PATH_MAX); |
|
|
|
s = strdup(argv[0]); |
|
|
|
s = strdup(argv[0]); |
|
|
|
strcpy(sgminer_path, dirname(s)); |
|
|
|
strcpy(sgminer_path, dirname(s)); |
|
|
|
free(s); |
|
|
|
free(s); |
|
|
|
strcat(sgminer_path, "/"); |
|
|
|
strcat(sgminer_path, "/"); |
|
|
|
|
|
|
|
#else |
|
|
|
|
|
|
|
opt_kernel_path = (char*)alloca(PATH_MAX); |
|
|
|
|
|
|
|
strcpy(opt_kernel_path, SGMINER_PREFIX); |
|
|
|
|
|
|
|
sgminer_path = (char*)alloca(PATH_MAX); |
|
|
|
|
|
|
|
GetCurrentDirectory(PATH_MAX - 1, sgminer_path); |
|
|
|
|
|
|
|
#endif |
|
|
|
|
|
|
|
|
|
|
|
devcursor = 8; |
|
|
|
devcursor = 8; |
|
|
|
logstart = devcursor + 1; |
|
|
|
logstart = devcursor + 1; |
|
|
|
logcursor = logstart + 1; |
|
|
|
logcursor = logstart + 1; |
|
|
|
|
|
|
|
|
|
|
|
block = calloc(sizeof(struct block), 1); |
|
|
|
block = (struct block *)calloc(sizeof(struct block), 1); |
|
|
|
if (unlikely(!block)) |
|
|
|
if (unlikely(!block)) |
|
|
|
quit (1, "main OOM"); |
|
|
|
quit (1, "main OOM"); |
|
|
|
for (i = 0; i < 36; i++) |
|
|
|
for (i = 0; i < 36; i++) |
|
|
@ -7740,7 +7755,7 @@ int main(int argc, char *argv[]) |
|
|
|
// FIXME: executes always (leftover from SHA256d days)
|
|
|
|
// FIXME: executes always (leftover from SHA256d days)
|
|
|
|
quit(1, "Cannot use benchmark mode with scrypt"); |
|
|
|
quit(1, "Cannot use benchmark mode with scrypt"); |
|
|
|
pool = add_pool(); |
|
|
|
pool = add_pool(); |
|
|
|
pool->rpc_url = malloc(255); |
|
|
|
pool->rpc_url = (char *)malloc(255); |
|
|
|
strcpy(pool->rpc_url, "Benchmark"); |
|
|
|
strcpy(pool->rpc_url, "Benchmark"); |
|
|
|
pool->rpc_user = pool->rpc_url; |
|
|
|
pool->rpc_user = pool->rpc_url; |
|
|
|
pool->rpc_pass = pool->rpc_url; |
|
|
|
pool->rpc_pass = pool->rpc_url; |
|
|
@ -7783,7 +7798,7 @@ int main(int argc, char *argv[]) |
|
|
|
opt_log_output = true; |
|
|
|
opt_log_output = true; |
|
|
|
|
|
|
|
|
|
|
|
total_control_threads = 8; |
|
|
|
total_control_threads = 8; |
|
|
|
control_thr = calloc(total_control_threads, sizeof(*thr)); |
|
|
|
control_thr = (struct thr_info *)calloc(total_control_threads, sizeof(*thr)); |
|
|
|
if (!control_thr) |
|
|
|
if (!control_thr) |
|
|
|
quit(1, "Failed to calloc control_thr"); |
|
|
|
quit(1, "Failed to calloc control_thr"); |
|
|
|
|
|
|
|
|
|
|
@ -7869,7 +7884,7 @@ int main(int argc, char *argv[]) |
|
|
|
if (!pool->rpc_user || !pool->rpc_pass) |
|
|
|
if (!pool->rpc_user || !pool->rpc_pass) |
|
|
|
quit(1, "No login credentials supplied for %s", pool->poolname); |
|
|
|
quit(1, "No login credentials supplied for %s", pool->poolname); |
|
|
|
siz = strlen(pool->rpc_user) + strlen(pool->rpc_pass) + 2; |
|
|
|
siz = strlen(pool->rpc_user) + strlen(pool->rpc_pass) + 2; |
|
|
|
pool->rpc_userpass = malloc(siz); |
|
|
|
pool->rpc_userpass = (char *)malloc(siz); |
|
|
|
if (!pool->rpc_userpass) |
|
|
|
if (!pool->rpc_userpass) |
|
|
|
quit(1, "Failed to malloc userpass"); |
|
|
|
quit(1, "Failed to malloc userpass"); |
|
|
|
snprintf(pool->rpc_userpass, siz, "%s:%s", pool->rpc_user, pool->rpc_pass); |
|
|
|
snprintf(pool->rpc_userpass, siz, "%s:%s", pool->rpc_user, pool->rpc_pass); |
|
|
@ -7888,11 +7903,11 @@ int main(int argc, char *argv[]) |
|
|
|
fork_monitor(); |
|
|
|
fork_monitor(); |
|
|
|
#endif // defined(unix)
|
|
|
|
#endif // defined(unix)
|
|
|
|
|
|
|
|
|
|
|
|
mining_thr = calloc(mining_threads, sizeof(thr)); |
|
|
|
mining_thr = (struct thr_info **)calloc(mining_threads, sizeof(thr)); |
|
|
|
if (!mining_thr) |
|
|
|
if (!mining_thr) |
|
|
|
quit(1, "Failed to calloc mining_thr"); |
|
|
|
quit(1, "Failed to calloc mining_thr"); |
|
|
|
for (i = 0; i < mining_threads; i++) { |
|
|
|
for (i = 0; i < mining_threads; i++) { |
|
|
|
mining_thr[i] = calloc(1, sizeof(*thr)); |
|
|
|
mining_thr[i] = (struct thr_info *)calloc(1, sizeof(*thr)); |
|
|
|
if (!mining_thr[i]) |
|
|
|
if (!mining_thr[i]) |
|
|
|
quit(1, "Failed to calloc mining_thr[%d]", i); |
|
|
|
quit(1, "Failed to calloc mining_thr[%d]", i); |
|
|
|
} |
|
|
|
} |
|
|
@ -7901,7 +7916,7 @@ int main(int argc, char *argv[]) |
|
|
|
k = 0; |
|
|
|
k = 0; |
|
|
|
for (i = 0; i < total_devices; ++i) { |
|
|
|
for (i = 0; i < total_devices; ++i) { |
|
|
|
struct cgpu_info *cgpu = devices[i]; |
|
|
|
struct cgpu_info *cgpu = devices[i]; |
|
|
|
cgpu->thr = malloc(sizeof(*cgpu->thr) * (cgpu->threads+1)); |
|
|
|
cgpu->thr = (struct thr_info **)malloc(sizeof(*cgpu->thr) * (cgpu->threads+1)); |
|
|
|
cgpu->thr[cgpu->threads] = NULL; |
|
|
|
cgpu->thr[cgpu->threads] = NULL; |
|
|
|
cgpu->status = LIFE_INIT; |
|
|
|
cgpu->status = LIFE_INIT; |
|
|
|
|
|
|
|
|
|
|
|