mirror of
https://github.com/xmrig/xmrig.git
synced 2025-12-31 15:42:40 -05:00
Compare commits
14 Commits
v6.22.1
...
df76a78ae4
| Author | SHA1 | Date | |
|---|---|---|---|
|
|
df76a78ae4 | ||
|
|
e8bbd134f9 | ||
|
|
cf86a1e05c | ||
|
|
f9e990d0f0 | ||
|
|
200f23bba7 | ||
|
|
4234b20e21 | ||
|
|
c5d8b8265b | ||
|
|
77c14c8362 | ||
|
|
8b03750806 | ||
|
|
40949f2767 | ||
|
|
56c447e02a | ||
|
|
21c206f05d | ||
|
|
753e63cd96 | ||
|
|
f42b3e83a7 |
@@ -1,3 +1,7 @@
|
|||||||
|
# v6.22.2
|
||||||
|
- [#3569](https://github.com/xmrig/xmrig/pull/3569) Fixed corrupted API output in some rare conditions.
|
||||||
|
- [#3571](https://github.com/xmrig/xmrig/pull/3571) Fixed number of threads on the new Intel Core Ultra CPUs.
|
||||||
|
|
||||||
# v6.22.1
|
# v6.22.1
|
||||||
- [#3531](https://github.com/xmrig/xmrig/pull/3531) Always reset nonce on RandomX dataset change.
|
- [#3531](https://github.com/xmrig/xmrig/pull/3531) Always reset nonce on RandomX dataset change.
|
||||||
- [#3534](https://github.com/xmrig/xmrig/pull/3534) Fixed threads auto-config on Zen5.
|
- [#3534](https://github.com/xmrig/xmrig/pull/3534) Fixed threads auto-config on Zen5.
|
||||||
|
|||||||
74
doc/API.md
74
doc/API.md
@@ -4,7 +4,7 @@ If you want use HTTP API you need enable it (`"enabled": true,`) then choice `po
|
|||||||
|
|
||||||
Offical HTTP client for API: http://workers.xmrig.info/
|
Offical HTTP client for API: http://workers.xmrig.info/
|
||||||
|
|
||||||
Example configuration:
|
Example configuration, used in Curl examples below:
|
||||||
|
|
||||||
```json
|
```json
|
||||||
"api": {
|
"api": {
|
||||||
@@ -12,11 +12,11 @@ Example configuration:
|
|||||||
"worker-id": null,
|
"worker-id": null,
|
||||||
},
|
},
|
||||||
"http": {
|
"http": {
|
||||||
"enabled": false,
|
"enabled": true,
|
||||||
"host": "127.0.0.1",
|
"host": "127.0.0.1",
|
||||||
"port": 0,
|
"port": 44444,
|
||||||
"access-token": null,
|
"access-token": "SECRET",
|
||||||
"restricted": true
|
"restricted": false
|
||||||
}
|
}
|
||||||
```
|
```
|
||||||
|
|
||||||
@@ -37,30 +37,78 @@ Versions before 2.15 was use another options for API https://github.com/xmrig/xm
|
|||||||
|
|
||||||
## Endpoints
|
## Endpoints
|
||||||
|
|
||||||
### GET /1/summary
|
### APIVersion 2
|
||||||
|
|
||||||
Get miner summary information. [Example](api/1/summary.json).
|
#### GET /2/summary
|
||||||
|
|
||||||
### GET /1/threads
|
Get miner summary information. [Example](api/2/summary.json).
|
||||||
|
|
||||||
Get detailed information about miner threads. [Example](api/1/threads.json).
|
#### GET /2/backends
|
||||||
|
|
||||||
|
Get detailed information about miner backends. [Example](api/2/backends.json).
|
||||||
|
|
||||||
|
### APIVersion 1 (deprecated)
|
||||||
|
|
||||||
|
#### GET /1/summary
|
||||||
|
|
||||||
|
Get miner summary information. Currently identical to `GET /2/summary`
|
||||||
|
|
||||||
|
#### GET /1/threads
|
||||||
|
|
||||||
|
**REMOVED** Get detailed information about miner threads. [Example](api/1/threads.json).
|
||||||
|
|
||||||
|
Functionally replaced by `GET /2/backends` which contains a `threads` item per backend.
|
||||||
|
|
||||||
|
### APIVersion 0 (deprecated)
|
||||||
|
|
||||||
|
#### GET /api.json
|
||||||
|
|
||||||
|
Get miner summary information. Currently identical to `GET /2/summary`
|
||||||
|
|
||||||
|
|
||||||
## Restricted endpoints
|
## Restricted endpoints
|
||||||
|
|
||||||
All API endpoints below allow access to sensitive information and remote configure miner. You should set `access-token` and allow unrestricted access (`"restricted": false`).
|
All API endpoints below allow access to sensitive information and remote configure miner. You should set `access-token` and allow unrestricted access (`"restricted": false`).
|
||||||
|
|
||||||
### GET /1/config
|
### JSON-RPC Interface
|
||||||
|
|
||||||
Get current miner configuration. [Example](api/1/config.json).
|
#### POST /json_rpc
|
||||||
|
|
||||||
|
Control miner with JSON-RPC. Methods: `pause`, `resume`, `stop`, `start`
|
||||||
|
|
||||||
### PUT /1/config
|
Curl example:
|
||||||
|
|
||||||
|
```
|
||||||
|
curl -v --data "{\"method\":\"pause\",\"id\":1}" -H "Content-Type: application/json" -H "Authorization: Bearer SECRET" http://127.0.0.1:44444/json_rpc
|
||||||
|
```
|
||||||
|
|
||||||
|
### APIVersion 2
|
||||||
|
|
||||||
|
#### GET /2/config
|
||||||
|
|
||||||
|
Get current miner configuration. [Example](api/2/config.json).
|
||||||
|
|
||||||
|
#### PUT /2/config
|
||||||
|
|
||||||
Update current miner configuration. Common use case, get current configuration, make changes, and upload it to miner.
|
Update current miner configuration. Common use case, get current configuration, make changes, and upload it to miner.
|
||||||
|
|
||||||
Curl example:
|
Curl example:
|
||||||
|
|
||||||
```
|
```
|
||||||
curl -v --data-binary @config.json -X PUT -H "Content-Type: application/json" -H "Authorization: Bearer SECRET" http://127.0.0.1:44444/1/config
|
...GET current config...
|
||||||
|
curl -v -H "Content-Type: application/json" -H "Authorization: Bearer SECRET" http://127.0.0.1:44444/2/config > config.json
|
||||||
|
...make changes...
|
||||||
|
vim config.json
|
||||||
|
...PUT changed config...
|
||||||
|
curl -v --data-binary @config.json -X PUT -H "Content-Type: application/json" -H "Authorization: Bearer SECRET" http://127.0.0.1:44444/2/config
|
||||||
```
|
```
|
||||||
|
|
||||||
|
### APIVersion 1 (deprecated)
|
||||||
|
|
||||||
|
#### GET /1/config
|
||||||
|
|
||||||
|
Get current miner configuration. Currently identical to `GET /2/config`
|
||||||
|
|
||||||
|
#### PUT /1/config
|
||||||
|
|
||||||
|
Update current miner configuration. Currently identical to `PUT /2/config`
|
||||||
|
|||||||
78
doc/api/2/backends.json
Normal file
78
doc/api/2/backends.json
Normal file
@@ -0,0 +1,78 @@
|
|||||||
|
[
|
||||||
|
{
|
||||||
|
"type": "cpu",
|
||||||
|
"enabled": true,
|
||||||
|
"algo": "rx/0",
|
||||||
|
"profile": "rx",
|
||||||
|
"hw-aes": true,
|
||||||
|
"priority": -1,
|
||||||
|
"msr": true,
|
||||||
|
"asm": "intel",
|
||||||
|
"argon2-impl": "AVX2",
|
||||||
|
"hugepages": [6, 6],
|
||||||
|
"memory": 6291456,
|
||||||
|
"hashrate": [1235.78, 1228.89, null],
|
||||||
|
"threads": [
|
||||||
|
{
|
||||||
|
"intensity": 1,
|
||||||
|
"affinity": 0,
|
||||||
|
"av": 1,
|
||||||
|
"hashrate": [409.75, 406.58, null]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"intensity": 1,
|
||||||
|
"affinity": 2,
|
||||||
|
"av": 1,
|
||||||
|
"hashrate": [412.9, 411.33, null]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"intensity": 1,
|
||||||
|
"affinity": 4,
|
||||||
|
"av": 1,
|
||||||
|
"hashrate": [413.11, 410.98, null]
|
||||||
|
}
|
||||||
|
]
|
||||||
|
},
|
||||||
|
{
|
||||||
|
"type": "cuda",
|
||||||
|
"enabled": true,
|
||||||
|
"algo": "cn-heavy/xhv",
|
||||||
|
"profile": "cn-heavy/xhv",
|
||||||
|
"versions": {
|
||||||
|
"cuda-runtime": "11.6",
|
||||||
|
"cuda-driver": "11.6",
|
||||||
|
"plugin": "6.17.1-dev",
|
||||||
|
"nvml": "11.512.15",
|
||||||
|
"driver": "512.15"
|
||||||
|
},
|
||||||
|
"hashrate": [247.02, 247.34, null],
|
||||||
|
"threads": [
|
||||||
|
{
|
||||||
|
"index": 0,
|
||||||
|
"threads": 32,
|
||||||
|
"blocks": 38,
|
||||||
|
"bfactor": 6,
|
||||||
|
"bsleep": 25,
|
||||||
|
"affinity": -1,
|
||||||
|
"cclock": 0,
|
||||||
|
"mclock": 0,
|
||||||
|
"dataset_host": false,
|
||||||
|
"hashrate": [246.77, 247.26, null],
|
||||||
|
"name": "NVIDIA GeForce GTX 970",
|
||||||
|
"bus_id": "01:00.0",
|
||||||
|
"smx": 13,
|
||||||
|
"arch": 52,
|
||||||
|
"global_mem": 4294836224,
|
||||||
|
"clock": 1177,
|
||||||
|
"memory_clock": 3666,
|
||||||
|
"health": {
|
||||||
|
"temperature": 69,
|
||||||
|
"power": 161,
|
||||||
|
"clock": 1328,
|
||||||
|
"mem_clock": 3662,
|
||||||
|
"fan_speed": [100]
|
||||||
|
}
|
||||||
|
}
|
||||||
|
]
|
||||||
|
}
|
||||||
|
]
|
||||||
136
doc/api/2/config.json
Normal file
136
doc/api/2/config.json
Normal file
@@ -0,0 +1,136 @@
|
|||||||
|
{
|
||||||
|
"api": {
|
||||||
|
"id": null,
|
||||||
|
"worker-id": null
|
||||||
|
},
|
||||||
|
"http": {
|
||||||
|
"enabled": true,
|
||||||
|
"host": "127.0.0.1",
|
||||||
|
"port": 44444,
|
||||||
|
"access-token": "SECRET",
|
||||||
|
"restricted": false
|
||||||
|
},
|
||||||
|
"autosave": true,
|
||||||
|
"background": false,
|
||||||
|
"colors": true,
|
||||||
|
"title": true,
|
||||||
|
"randomx": {
|
||||||
|
"init": -1,
|
||||||
|
"init-avx2": -1,
|
||||||
|
"mode": "auto",
|
||||||
|
"1gb-pages": true,
|
||||||
|
"rdmsr": true,
|
||||||
|
"wrmsr": true,
|
||||||
|
"cache_qos": false,
|
||||||
|
"numa": true,
|
||||||
|
"scratchpad_prefetch_mode": 1
|
||||||
|
},
|
||||||
|
"cpu": {
|
||||||
|
"enabled": true,
|
||||||
|
"huge-pages": true,
|
||||||
|
"huge-pages-jit": true,
|
||||||
|
"hw-aes": null,
|
||||||
|
"priority": null,
|
||||||
|
"memory-pool": true,
|
||||||
|
"yield": true,
|
||||||
|
"asm": true,
|
||||||
|
"argon2-impl": null,
|
||||||
|
"argon2": [0, 2, 4, 6, 5, 7],
|
||||||
|
"astrobwt/v2": [1, 2, 3, 4, 5, 6, 7],
|
||||||
|
"cn": [
|
||||||
|
[1, 0],
|
||||||
|
[1, 2],
|
||||||
|
[1, 4]
|
||||||
|
],
|
||||||
|
"cn-heavy": [
|
||||||
|
[1, 0],
|
||||||
|
[1, 2]
|
||||||
|
],
|
||||||
|
"cn-lite": [
|
||||||
|
[1, 0],
|
||||||
|
[1, 2],
|
||||||
|
[1, 4],
|
||||||
|
[1, 6],
|
||||||
|
[1, 5],
|
||||||
|
[1, 7]
|
||||||
|
],
|
||||||
|
"cn-pico": [
|
||||||
|
[2, 1],
|
||||||
|
[2, 2],
|
||||||
|
[2, 3],
|
||||||
|
[2, 4],
|
||||||
|
[2, 5],
|
||||||
|
[2, 6],
|
||||||
|
[2, 7]
|
||||||
|
],
|
||||||
|
"cn/2": [
|
||||||
|
[1, 0],
|
||||||
|
[1, 2],
|
||||||
|
[1, 4]
|
||||||
|
],
|
||||||
|
"cn/upx2": [
|
||||||
|
[2, 1],
|
||||||
|
[2, 2],
|
||||||
|
[2, 3],
|
||||||
|
[2, 4],
|
||||||
|
[2, 5],
|
||||||
|
[2, 6],
|
||||||
|
[2, 7]
|
||||||
|
],
|
||||||
|
"ghostrider": [
|
||||||
|
[8, 0],
|
||||||
|
[8, 2],
|
||||||
|
[8, 4]
|
||||||
|
],
|
||||||
|
"rx": [0, 2, 4],
|
||||||
|
"rx/arq": [1, 2, 3, 4, 5, 6, 7],
|
||||||
|
"rx/keva": [0, 2, 4, 6, 5, 7],
|
||||||
|
"rx/wow": [0, 2, 4, 6, 5, 7],
|
||||||
|
"cn-lite/0": false,
|
||||||
|
"cn/0": "cn"
|
||||||
|
},
|
||||||
|
"log-file": null,
|
||||||
|
"donate-level": 0,
|
||||||
|
"donate-over-proxy": 0,
|
||||||
|
"pools": [
|
||||||
|
{
|
||||||
|
"algo": null,
|
||||||
|
"coin": null,
|
||||||
|
"url": "some.pool:10064",
|
||||||
|
"user": "4blahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahblahbl",
|
||||||
|
"pass": "x",
|
||||||
|
"rig-id": null,
|
||||||
|
"nicehash": false,
|
||||||
|
"keepalive": true,
|
||||||
|
"enabled": true,
|
||||||
|
"tls": false,
|
||||||
|
"wss": false,
|
||||||
|
"daemon": false,
|
||||||
|
"socks5": null,
|
||||||
|
"self-select": null,
|
||||||
|
"submit-to-origin": false
|
||||||
|
}
|
||||||
|
],
|
||||||
|
"retries": 5,
|
||||||
|
"retry-pause": 5,
|
||||||
|
"print-time": 64,
|
||||||
|
"syslog": false,
|
||||||
|
"tls": {
|
||||||
|
"enabled": false,
|
||||||
|
"protocols": null,
|
||||||
|
"cert": null,
|
||||||
|
"cert_key": null,
|
||||||
|
"ciphers": null,
|
||||||
|
"ciphersuites": null,
|
||||||
|
"dhparam": null
|
||||||
|
},
|
||||||
|
"dns": {
|
||||||
|
"ipv6": false,
|
||||||
|
"ttl": 30
|
||||||
|
},
|
||||||
|
"user-agent": null,
|
||||||
|
"verbose": 1,
|
||||||
|
"watch": true,
|
||||||
|
"pause-on-battery": false,
|
||||||
|
"pause-on-active": false
|
||||||
|
}
|
||||||
76
doc/api/2/summary.json
Normal file
76
doc/api/2/summary.json
Normal file
@@ -0,0 +1,76 @@
|
|||||||
|
{
|
||||||
|
"id": "51aca77da137cb62",
|
||||||
|
"worker_id": "tpad",
|
||||||
|
"uptime": 106,
|
||||||
|
"restricted": false,
|
||||||
|
"resources": {
|
||||||
|
"memory": {
|
||||||
|
"free": 4977348608,
|
||||||
|
"total": 16659546112,
|
||||||
|
"resident_set_memory": 16441344
|
||||||
|
},
|
||||||
|
"load_average": [3.4, 2.7, 2.44],
|
||||||
|
"hardware_concurrency": 8
|
||||||
|
},
|
||||||
|
"features": ["api", "asm", "http", "hwloc", "tls"],
|
||||||
|
"results": {
|
||||||
|
"diff_current": 37638,
|
||||||
|
"shares_good": 3,
|
||||||
|
"shares_total": 3,
|
||||||
|
"avg_time": 35,
|
||||||
|
"avg_time_ms": 35603,
|
||||||
|
"hashes_total": 165638,
|
||||||
|
"best": [358821, 344438, 73371, 0, 0, 0, 0, 0, 0, 0]
|
||||||
|
},
|
||||||
|
"algo": "rx/0",
|
||||||
|
"connection": {
|
||||||
|
"pool": "some.pool:20064",
|
||||||
|
"ip": "127.1.2.3",
|
||||||
|
"uptime": 106,
|
||||||
|
"uptime_ms": 106811,
|
||||||
|
"ping": 405,
|
||||||
|
"failures": 0,
|
||||||
|
"tls": "TLSv1.3",
|
||||||
|
"tls-fingerprint": null,
|
||||||
|
"algo": "rx/0",
|
||||||
|
"diff": 37638,
|
||||||
|
"accepted": 3,
|
||||||
|
"rejected": 0,
|
||||||
|
"avg_time": 35,
|
||||||
|
"avg_time_ms": 35603,
|
||||||
|
"hashes_total": 165638
|
||||||
|
},
|
||||||
|
"version": "6.17.1-dev",
|
||||||
|
"kind": "miner",
|
||||||
|
"ua": "XMRig/6.17.1-dev (Linux x86_64) libuv/1.43.0 gcc/9.4.0",
|
||||||
|
"cpu": {
|
||||||
|
"brand": "Intel(R) Core(TM) i7-4700MQ CPU @ 2.40GHz",
|
||||||
|
"family": 6,
|
||||||
|
"model": 60,
|
||||||
|
"stepping": 3,
|
||||||
|
"proc_info": 198339,
|
||||||
|
"aes": true,
|
||||||
|
"avx2": true,
|
||||||
|
"x64": true,
|
||||||
|
"64_bit": true,
|
||||||
|
"l2": 1048576,
|
||||||
|
"l3": 6291456,
|
||||||
|
"cores": 4,
|
||||||
|
"threads": 8,
|
||||||
|
"packages": 1,
|
||||||
|
"nodes": 1,
|
||||||
|
"backend": "hwloc/2.7.0",
|
||||||
|
"msr": "intel",
|
||||||
|
"assembly": "intel",
|
||||||
|
"arch": "x86_64",
|
||||||
|
"flags": ["aes", "avx", "avx2", "bmi2", "osxsave", "pdpe1gb", "sse2", "ssse3", "sse4.1", "popcnt"]
|
||||||
|
},
|
||||||
|
"donate_level": 0,
|
||||||
|
"paused": false,
|
||||||
|
"algorithms": ["cn/0", "cn/1", "cn/2", "cn/r", "cn/fast", "cn/half", "cn/xao", "cn/rto", "cn/rwz", "cn/zls", "cn/double", "cn/ccx", "cn-lite/1", "cn-heavy/0", "cn-heavy/tube", "cn-heavy/xhv", "cn-pico", "cn-pico/tlo", "cn/upx2", "rx/0", "rx/wow", "rx/arq", "rx/graft", "rx/sfx", "rx/keva", "argon2/chukwa", "argon2/chukwav2", "argon2/ninja", "astrobwt/v2", "ghostrider"],
|
||||||
|
"hashrate": {
|
||||||
|
"total": [1207.19, 1210.82, null],
|
||||||
|
"highest": 1316.85
|
||||||
|
},
|
||||||
|
"hugepages": [6, 6]
|
||||||
|
}
|
||||||
@@ -30,10 +30,10 @@
|
|||||||
#include "base/tools/Handle.h"
|
#include "base/tools/Handle.h"
|
||||||
|
|
||||||
|
|
||||||
inline static const char *format(double h, char *buf, size_t size)
|
inline static const char *format(std::pair<bool, double> h, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
if (std::isnormal(h)) {
|
if (h.first) {
|
||||||
snprintf(buf, size, (h < 100.0) ? "%04.2f" : "%03.1f", h);
|
snprintf(buf, size, (h.second < 100.0) ? "%04.2f" : "%03.1f", h.second);
|
||||||
return buf;
|
return buf;
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -80,15 +80,16 @@ double xmrig::Hashrate::average() const
|
|||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
const char *xmrig::Hashrate::format(double h, char *buf, size_t size)
|
const char *xmrig::Hashrate::format(std::pair<bool, double> h, char *buf, size_t size)
|
||||||
{
|
{
|
||||||
return ::format(h, buf, size);
|
return ::format(h, buf, size);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
rapidjson::Value xmrig::Hashrate::normalize(double d)
|
rapidjson::Value xmrig::Hashrate::normalize(std::pair<bool, double> d)
|
||||||
{
|
{
|
||||||
return Json::normalize(d, false);
|
using namespace rapidjson;
|
||||||
|
return d.first ? Value(floor(d.second * 100.0) / 100.0) : Value(kNullType);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
@@ -122,11 +123,11 @@ rapidjson::Value xmrig::Hashrate::toJSON(size_t threadId, rapidjson::Document &d
|
|||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
double xmrig::Hashrate::hashrate(size_t index, size_t ms) const
|
std::pair<bool, double> xmrig::Hashrate::hashrate(size_t index, size_t ms) const
|
||||||
{
|
{
|
||||||
assert(index < m_threads);
|
assert(index < m_threads);
|
||||||
if (index >= m_threads) {
|
if (index >= m_threads) {
|
||||||
return nan("");
|
return { false, 0.0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
uint64_t earliestHashCount = 0;
|
uint64_t earliestHashCount = 0;
|
||||||
@@ -157,17 +158,27 @@ double xmrig::Hashrate::hashrate(size_t index, size_t ms) const
|
|||||||
} while (idx != idx_start);
|
} while (idx != idx_start);
|
||||||
|
|
||||||
if (!haveFullSet || earliestStamp == 0 || lastestStamp == 0) {
|
if (!haveFullSet || earliestStamp == 0 || lastestStamp == 0) {
|
||||||
return nan("");
|
return { false, 0.0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
if (lastestStamp - earliestStamp == 0) {
|
if (lastestHashCnt == earliestHashCount) {
|
||||||
return nan("");
|
return { true, 0.0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
if (lastestStamp == earliestStamp) {
|
||||||
|
return { false, 0.0 };
|
||||||
}
|
}
|
||||||
|
|
||||||
const auto hashes = static_cast<double>(lastestHashCnt - earliestHashCount);
|
const auto hashes = static_cast<double>(lastestHashCnt - earliestHashCount);
|
||||||
const auto time = static_cast<double>(lastestStamp - earliestStamp) / 1000.0;
|
const auto time = static_cast<double>(lastestStamp - earliestStamp);
|
||||||
|
|
||||||
return hashes / time;
|
const auto hr = hashes * 1000.0 / time;
|
||||||
|
|
||||||
|
if (!std::isnormal(hr)) {
|
||||||
|
return { false, 0.0 };
|
||||||
|
}
|
||||||
|
|
||||||
|
return { true, hr };
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -47,16 +47,16 @@ public:
|
|||||||
Hashrate(size_t threads);
|
Hashrate(size_t threads);
|
||||||
~Hashrate();
|
~Hashrate();
|
||||||
|
|
||||||
inline double calc(size_t ms) const { const double data = hashrate(0U, ms); return std::isnormal(data) ? data : 0.0; }
|
inline std::pair<bool, double> calc(size_t ms) const { return hashrate(0U, ms); }
|
||||||
inline double calc(size_t threadId, size_t ms) const { return hashrate(threadId + 1, ms); }
|
inline std::pair<bool, double> calc(size_t threadId, size_t ms) const { return hashrate(threadId + 1, ms); }
|
||||||
inline size_t threads() const { return m_threads > 0U ? m_threads - 1U : 0U; }
|
inline size_t threads() const { return m_threads > 0U ? m_threads - 1U : 0U; }
|
||||||
inline void add(size_t threadId, uint64_t count, uint64_t timestamp) { addData(threadId + 1U, count, timestamp); }
|
inline void add(size_t threadId, uint64_t count, uint64_t timestamp) { addData(threadId + 1U, count, timestamp); }
|
||||||
inline void add(uint64_t count, uint64_t timestamp) { addData(0U, count, timestamp); }
|
inline void add(uint64_t count, uint64_t timestamp) { addData(0U, count, timestamp); }
|
||||||
|
|
||||||
double average() const;
|
double average() const;
|
||||||
|
|
||||||
static const char *format(double h, char *buf, size_t size);
|
static const char *format(std::pair<bool, double> h, char *buf, size_t size);
|
||||||
static rapidjson::Value normalize(double d);
|
static rapidjson::Value normalize(std::pair<bool, double> d);
|
||||||
|
|
||||||
# ifdef XMRIG_FEATURE_API
|
# ifdef XMRIG_FEATURE_API
|
||||||
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
rapidjson::Value toJSON(rapidjson::Document &doc) const;
|
||||||
@@ -64,7 +64,7 @@ public:
|
|||||||
# endif
|
# endif
|
||||||
|
|
||||||
private:
|
private:
|
||||||
double hashrate(size_t index, size_t ms) const;
|
std::pair<bool, double> hashrate(size_t index, size_t ms) const;
|
||||||
void addData(size_t index, uint64_t count, uint64_t timestamp);
|
void addData(size_t index, uint64_t count, uint64_t timestamp);
|
||||||
|
|
||||||
constexpr static size_t kBucketSize = 2 << 11;
|
constexpr static size_t kBucketSize = 2 << 11;
|
||||||
|
|||||||
@@ -342,7 +342,7 @@ void xmrig::HwlocCpuInfo::processTopLevelCache(hwloc_obj_t cache, const Algorith
|
|||||||
}
|
}
|
||||||
|
|
||||||
# ifdef XMRIG_ALGO_RANDOMX
|
# ifdef XMRIG_ALGO_RANDOMX
|
||||||
if ((algorithm.family() == Algorithm::RANDOM_X) && L3_exclusive && (PUs > cores.size()) && (PUs < cores.size() * 2)) {
|
if ((vendor() == VENDOR_INTEL) && (algorithm.family() == Algorithm::RANDOM_X) && L3_exclusive && (PUs < cores.size() * 2)) {
|
||||||
// Use all L3+L2 on latest Intel CPUs with P-cores, E-cores and exclusive L3 cache
|
// Use all L3+L2 on latest Intel CPUs with P-cores, E-cores and exclusive L3 cache
|
||||||
cacheHashes = (L3 + L2) / scratchpad;
|
cacheHashes = (L3 + L2) / scratchpad;
|
||||||
}
|
}
|
||||||
|
|||||||
@@ -372,15 +372,20 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
|||||||
|
|
||||||
char num[16 * 3] = { 0 };
|
char num[16 * 3] = { 0 };
|
||||||
|
|
||||||
const double hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
auto hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
||||||
const double hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
auto hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
||||||
const double hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
auto hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
||||||
|
|
||||||
double scale = 1.0;
|
double scale = 1.0;
|
||||||
const char* h = " H/s";
|
const char* h = " H/s";
|
||||||
|
|
||||||
if ((hashrate_short >= 1e6) || (hashrate_medium >= 1e6) || (hashrate_large >= 1e6)) {
|
if ((hashrate_short.second >= 1e6) || (hashrate_medium.second >= 1e6) || (hashrate_large.second >= 1e6)) {
|
||||||
scale = 1e-6;
|
scale = 1e-6;
|
||||||
|
|
||||||
|
hashrate_short.second *= scale;
|
||||||
|
hashrate_medium.second *= scale;
|
||||||
|
hashrate_large.second *= scale;
|
||||||
|
|
||||||
h = "MH/s";
|
h = "MH/s";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -388,12 +393,20 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
|||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (const auto& data : d_ptr->threads) {
|
for (const auto& data : d_ptr->threads) {
|
||||||
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") GREEN(" %s"),
|
auto h0 = hashrate()->calc(i, Hashrate::ShortInterval);
|
||||||
|
auto h1 = hashrate()->calc(i, Hashrate::MediumInterval);
|
||||||
|
auto h2 = hashrate()->calc(i, Hashrate::LargeInterval);
|
||||||
|
|
||||||
|
h0.second *= scale;
|
||||||
|
h1.second *= scale;
|
||||||
|
h2.second *= scale;
|
||||||
|
|
||||||
|
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") GREEN(" %s"),
|
||||||
i,
|
i,
|
||||||
data.thread.affinity(),
|
data.thread.affinity(),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval) * scale, num, sizeof num / 3),
|
Hashrate::format(h0, num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval) * scale, num + 16, sizeof num / 3),
|
Hashrate::format(h1, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval) * scale, num + 16 * 2, sizeof num / 3),
|
Hashrate::format(h2, num + 16 * 2, sizeof num / 3),
|
||||||
data.device.index(),
|
data.device.index(),
|
||||||
data.device.topology().toString().data(),
|
data.device.topology().toString().data(),
|
||||||
data.device.name().data()
|
data.device.name().data()
|
||||||
@@ -403,9 +416,9 @@ void xmrig::CudaBackend::printHashrate(bool details)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
||||||
Hashrate::format(hashrate_short * scale, num, sizeof num / 3),
|
Hashrate::format(hashrate_short , num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate_medium * scale, num + 16, sizeof num / 3),
|
Hashrate::format(hashrate_medium, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate_large * scale, num + 16 * 2, sizeof num / 3)
|
Hashrate::format(hashrate_large , num + 16 * 2, sizeof num / 3)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -352,15 +352,20 @@ void xmrig::OclBackend::printHashrate(bool details)
|
|||||||
|
|
||||||
char num[16 * 3] = { 0 };
|
char num[16 * 3] = { 0 };
|
||||||
|
|
||||||
const double hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
auto hashrate_short = hashrate()->calc(Hashrate::ShortInterval);
|
||||||
const double hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
auto hashrate_medium = hashrate()->calc(Hashrate::MediumInterval);
|
||||||
const double hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
auto hashrate_large = hashrate()->calc(Hashrate::LargeInterval);
|
||||||
|
|
||||||
double scale = 1.0;
|
double scale = 1.0;
|
||||||
const char* h = " H/s";
|
const char* h = " H/s";
|
||||||
|
|
||||||
if ((hashrate_short >= 1e6) || (hashrate_medium >= 1e6) || (hashrate_large >= 1e6)) {
|
if ((hashrate_short.second >= 1e6) || (hashrate_medium.second >= 1e6) || (hashrate_large.second >= 1e6)) {
|
||||||
scale = 1e-6;
|
scale = 1e-6;
|
||||||
|
|
||||||
|
hashrate_short.second *= scale;
|
||||||
|
hashrate_medium.second *= scale;
|
||||||
|
hashrate_large.second *= scale;
|
||||||
|
|
||||||
h = "MH/s";
|
h = "MH/s";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -368,12 +373,16 @@ void xmrig::OclBackend::printHashrate(bool details)
|
|||||||
|
|
||||||
size_t i = 0;
|
size_t i = 0;
|
||||||
for (const auto& data : d_ptr->threads) {
|
for (const auto& data : d_ptr->threads) {
|
||||||
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") " %s",
|
auto h0 = hashrate()->calc(i, Hashrate::ShortInterval);
|
||||||
|
auto h1 = hashrate()->calc(i, Hashrate::MediumInterval);
|
||||||
|
auto h2 = hashrate()->calc(i, Hashrate::LargeInterval);
|
||||||
|
|
||||||
|
Log::print("| %8zu | %8" PRId64 " | %8s | %8s | %8s |" CYAN_BOLD(" #%u") YELLOW(" %s") " %s",
|
||||||
i,
|
i,
|
||||||
data.affinity,
|
data.affinity,
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::ShortInterval) * scale, num, sizeof num / 3),
|
Hashrate::format(h0, num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::MediumInterval) * scale, num + 16, sizeof num / 3),
|
Hashrate::format(h1, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate()->calc(i, Hashrate::LargeInterval) * scale, num + 16 * 2, sizeof num / 3),
|
Hashrate::format(h2, num + 16 * 2, sizeof num / 3),
|
||||||
data.device.index(),
|
data.device.index(),
|
||||||
data.device.topology().toString().data(),
|
data.device.topology().toString().data(),
|
||||||
data.device.printableName().data()
|
data.device.printableName().data()
|
||||||
@@ -383,9 +392,9 @@ void xmrig::OclBackend::printHashrate(bool details)
|
|||||||
}
|
}
|
||||||
|
|
||||||
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
Log::print(WHITE_BOLD_S "| - | - | %8s | %8s | %8s |",
|
||||||
Hashrate::format(hashrate_short * scale, num, sizeof num / 3),
|
Hashrate::format(hashrate_short , num, sizeof num / 3),
|
||||||
Hashrate::format(hashrate_medium * scale, num + 16, sizeof num / 3),
|
Hashrate::format(hashrate_medium, num + 16, sizeof num / 3),
|
||||||
Hashrate::format(hashrate_large * scale, num + 16 * 2, sizeof num / 3)
|
Hashrate::format(hashrate_large , num + 16 * 2, sizeof num / 3)
|
||||||
);
|
);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|||||||
@@ -52,6 +52,8 @@ public:
|
|||||||
enum RequestType {
|
enum RequestType {
|
||||||
REQ_UNKNOWN,
|
REQ_UNKNOWN,
|
||||||
REQ_SUMMARY,
|
REQ_SUMMARY,
|
||||||
|
REQ_BACKENDS,
|
||||||
|
REQ_CONFIG,
|
||||||
REQ_JSON_RPC
|
REQ_JSON_RPC
|
||||||
};
|
};
|
||||||
|
|
||||||
|
|||||||
@@ -60,7 +60,7 @@ protected:
|
|||||||
inline Source source() const override { return m_source; }
|
inline Source source() const override { return m_source; }
|
||||||
inline void done(int) override { m_state = STATE_DONE; }
|
inline void done(int) override { m_state = STATE_DONE; }
|
||||||
|
|
||||||
int m_version = 1;
|
int m_version = 0;
|
||||||
RequestType m_type = REQ_UNKNOWN;
|
RequestType m_type = REQ_UNKNOWN;
|
||||||
State m_state = STATE_NEW;
|
State m_state = STATE_NEW;
|
||||||
String m_rpcMethod;
|
String m_rpcMethod;
|
||||||
|
|||||||
@@ -67,10 +67,33 @@ xmrig::HttpApiRequest::HttpApiRequest(const HttpData &req, bool restricted) :
|
|||||||
m_res(req.id()),
|
m_res(req.id()),
|
||||||
m_url(req.url.c_str())
|
m_url(req.url.c_str())
|
||||||
{
|
{
|
||||||
if (method() == METHOD_GET) {
|
if (url().size() > 4 && memcmp(url().data(), "/", 1) == 0 && memcmp(url().data()+2, "/", 1) == 0) {
|
||||||
if (url() == "/1/summary" || url() == "/2/summary" || url() == "/api.json") {
|
if (memcmp(url().data(), "/2/", 3) == 0) {
|
||||||
m_type = REQ_SUMMARY;
|
m_version = 2;
|
||||||
|
} else if (memcmp(url().data(), "/1/", 3) == 0) {
|
||||||
|
m_version = 1;
|
||||||
}
|
}
|
||||||
|
switch (url().size()) {
|
||||||
|
case 9:
|
||||||
|
if (memcmp(url().data()+3, "config", 6) == 0) {
|
||||||
|
m_type = REQ_CONFIG;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 10:
|
||||||
|
if (memcmp(url().data()+3, "summary", 7) == 0) {
|
||||||
|
m_type = REQ_SUMMARY;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
case 11:
|
||||||
|
if (memcmp(url().data()+3, "backends", 8) == 0) {
|
||||||
|
m_type = REQ_BACKENDS;
|
||||||
|
}
|
||||||
|
break;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
if (url() == "/api.json") {
|
||||||
|
m_type = REQ_SUMMARY;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (method() == METHOD_POST && url() == "/json_rpc") {
|
if (method() == METHOD_POST && url() == "/json_rpc") {
|
||||||
@@ -94,12 +117,6 @@ xmrig::HttpApiRequest::HttpApiRequest(const HttpData &req, bool restricted) :
|
|||||||
|
|
||||||
return;
|
return;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (url().size() > 4) {
|
|
||||||
if (memcmp(url().data(), "/2/", 3) == 0) {
|
|
||||||
m_version = 2;
|
|
||||||
}
|
|
||||||
}
|
|
||||||
}
|
}
|
||||||
|
|
||||||
|
|
||||||
|
|||||||
@@ -45,13 +45,6 @@
|
|||||||
#ifdef XMRIG_FEATURE_API
|
#ifdef XMRIG_FEATURE_API
|
||||||
# include "base/api/Api.h"
|
# include "base/api/Api.h"
|
||||||
# include "base/api/interfaces/IApiRequest.h"
|
# include "base/api/interfaces/IApiRequest.h"
|
||||||
|
|
||||||
namespace xmrig {
|
|
||||||
|
|
||||||
static const char *kConfigPathV1 = "/1/config";
|
|
||||||
static const char *kConfigPathV2 = "/2/config";
|
|
||||||
|
|
||||||
} // namespace xmrig
|
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
|
|
||||||
@@ -317,7 +310,7 @@ void xmrig::Base::onFileChanged(const String &fileName)
|
|||||||
void xmrig::Base::onRequest(IApiRequest &request)
|
void xmrig::Base::onRequest(IApiRequest &request)
|
||||||
{
|
{
|
||||||
if (request.method() == IApiRequest::METHOD_GET) {
|
if (request.method() == IApiRequest::METHOD_GET) {
|
||||||
if (request.url() == kConfigPathV1 || request.url() == kConfigPathV2) {
|
if (request.type() == IApiRequest::REQ_CONFIG) {
|
||||||
if (request.isRestricted()) {
|
if (request.isRestricted()) {
|
||||||
return request.done(403);
|
return request.done(403);
|
||||||
}
|
}
|
||||||
@@ -327,7 +320,7 @@ void xmrig::Base::onRequest(IApiRequest &request)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
else if (request.method() == IApiRequest::METHOD_PUT || request.method() == IApiRequest::METHOD_POST) {
|
else if (request.method() == IApiRequest::METHOD_PUT || request.method() == IApiRequest::METHOD_POST) {
|
||||||
if (request.url() == kConfigPathV1 || request.url() == kConfigPathV2) {
|
if (request.type() == IApiRequest::REQ_CONFIG) {
|
||||||
request.accept();
|
request.accept();
|
||||||
|
|
||||||
if (!reload(request.json())) {
|
if (!reload(request.json())) {
|
||||||
|
|||||||
@@ -173,7 +173,7 @@ public:
|
|||||||
Value total(kArrayType);
|
Value total(kArrayType);
|
||||||
Value threads(kArrayType);
|
Value threads(kArrayType);
|
||||||
|
|
||||||
double t[3] = { 0.0 };
|
std::pair<bool, double> t[3] = { { true, 0.0 }, { true, 0.0 }, { true, 0.0 } };
|
||||||
|
|
||||||
for (IBackend *backend : backends) {
|
for (IBackend *backend : backends) {
|
||||||
const Hashrate *hr = backend->hashrate();
|
const Hashrate *hr = backend->hashrate();
|
||||||
@@ -181,9 +181,13 @@ public:
|
|||||||
continue;
|
continue;
|
||||||
}
|
}
|
||||||
|
|
||||||
t[0] += hr->calc(Hashrate::ShortInterval);
|
const auto h0 = hr->calc(Hashrate::ShortInterval);
|
||||||
t[1] += hr->calc(Hashrate::MediumInterval);
|
const auto h1 = hr->calc(Hashrate::MediumInterval);
|
||||||
t[2] += hr->calc(Hashrate::LargeInterval);
|
const auto h2 = hr->calc(Hashrate::LargeInterval);
|
||||||
|
|
||||||
|
if (h0.first) { t[0].second += h0.second; } else { t[0].first = false; }
|
||||||
|
if (h1.first) { t[1].second += h1.second; } else { t[1].first = false; }
|
||||||
|
if (h2.first) { t[2].second += h2.second; } else { t[2].first = false; }
|
||||||
|
|
||||||
if (version > 1) {
|
if (version > 1) {
|
||||||
continue;
|
continue;
|
||||||
@@ -204,7 +208,7 @@ public:
|
|||||||
total.PushBack(Hashrate::normalize(t[2]), allocator);
|
total.PushBack(Hashrate::normalize(t[2]), allocator);
|
||||||
|
|
||||||
hashrate.AddMember("total", total, allocator);
|
hashrate.AddMember("total", total, allocator);
|
||||||
hashrate.AddMember("highest", Hashrate::normalize(maxHashrate[algorithm]), allocator);
|
hashrate.AddMember("highest", Hashrate::normalize({ maxHashrate[algorithm] > 0.0, maxHashrate[algorithm] }), allocator);
|
||||||
|
|
||||||
if (version == 1) {
|
if (version == 1) {
|
||||||
hashrate.AddMember("threads", threads, allocator);
|
hashrate.AddMember("threads", threads, allocator);
|
||||||
@@ -283,7 +287,7 @@ public:
|
|||||||
void printHashrate(bool details)
|
void printHashrate(bool details)
|
||||||
{
|
{
|
||||||
char num[16 * 5] = { 0 };
|
char num[16 * 5] = { 0 };
|
||||||
double speed[3] = { 0.0 };
|
std::pair<bool, double> speed[3] = { { true, 0.0 }, { true, 0.0 }, { true, 0.0 } };
|
||||||
uint32_t count = 0;
|
uint32_t count = 0;
|
||||||
|
|
||||||
double avg_hashrate = 0.0;
|
double avg_hashrate = 0.0;
|
||||||
@@ -293,9 +297,13 @@ public:
|
|||||||
if (hashrate) {
|
if (hashrate) {
|
||||||
++count;
|
++count;
|
||||||
|
|
||||||
speed[0] += hashrate->calc(Hashrate::ShortInterval);
|
const auto h0 = hashrate->calc(Hashrate::ShortInterval);
|
||||||
speed[1] += hashrate->calc(Hashrate::MediumInterval);
|
const auto h1 = hashrate->calc(Hashrate::MediumInterval);
|
||||||
speed[2] += hashrate->calc(Hashrate::LargeInterval);
|
const auto h2 = hashrate->calc(Hashrate::LargeInterval);
|
||||||
|
|
||||||
|
if (h0.first) { speed[0].second += h0.second; } else { speed[0].first = false; }
|
||||||
|
if (h1.first) { speed[1].second += h1.second; } else { speed[1].first = false; }
|
||||||
|
if (h2.first) { speed[2].second += h2.second; } else { speed[2].first = false; }
|
||||||
|
|
||||||
avg_hashrate += hashrate->average();
|
avg_hashrate += hashrate->average();
|
||||||
}
|
}
|
||||||
@@ -312,8 +320,13 @@ public:
|
|||||||
double scale = 1.0;
|
double scale = 1.0;
|
||||||
const char* h = "H/s";
|
const char* h = "H/s";
|
||||||
|
|
||||||
if ((speed[0] >= 1e6) || (speed[1] >= 1e6) || (speed[2] >= 1e6) || (maxHashrate[algorithm] >= 1e6)) {
|
if ((speed[0].second >= 1e6) || (speed[1].second >= 1e6) || (speed[2].second >= 1e6) || (maxHashrate[algorithm] >= 1e6)) {
|
||||||
scale = 1e-6;
|
scale = 1e-6;
|
||||||
|
|
||||||
|
speed[0].second *= scale;
|
||||||
|
speed[1].second *= scale;
|
||||||
|
speed[2].second *= scale;
|
||||||
|
|
||||||
h = "MH/s";
|
h = "MH/s";
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -322,16 +335,16 @@ public:
|
|||||||
|
|
||||||
# ifdef XMRIG_ALGO_GHOSTRIDER
|
# ifdef XMRIG_ALGO_GHOSTRIDER
|
||||||
if (algorithm.family() == Algorithm::GHOSTRIDER) {
|
if (algorithm.family() == Algorithm::GHOSTRIDER) {
|
||||||
snprintf(avg_hashrate_buf, sizeof(avg_hashrate_buf), " avg " CYAN_BOLD("%s %s"), Hashrate::format(avg_hashrate * scale, num + 16 * 4, 16), h);
|
snprintf(avg_hashrate_buf, sizeof(avg_hashrate_buf), " avg " CYAN_BOLD("%s %s"), Hashrate::format({ true, avg_hashrate * scale }, num + 16 * 4, 16), h);
|
||||||
}
|
}
|
||||||
# endif
|
# endif
|
||||||
|
|
||||||
LOG_INFO("%s " WHITE_BOLD("speed") " 10s/60s/15m " CYAN_BOLD("%s") CYAN(" %s %s ") CYAN_BOLD("%s") " max " CYAN_BOLD("%s %s") "%s",
|
LOG_INFO("%s " WHITE_BOLD("speed") " 10s/60s/15m " CYAN_BOLD("%s") CYAN(" %s %s ") CYAN_BOLD("%s") " max " CYAN_BOLD("%s %s") "%s",
|
||||||
Tags::miner(),
|
Tags::miner(),
|
||||||
Hashrate::format(speed[0] * scale, num, 16),
|
Hashrate::format(speed[0], num, 16),
|
||||||
Hashrate::format(speed[1] * scale, num + 16, 16),
|
Hashrate::format(speed[1], num + 16, 16),
|
||||||
Hashrate::format(speed[2] * scale, num + 16 * 2, 16), h,
|
Hashrate::format(speed[2], num + 16 * 2, 16), h,
|
||||||
Hashrate::format(maxHashrate[algorithm] * scale, num + 16 * 3, 16), h,
|
Hashrate::format({ maxHashrate[algorithm] > 0.0, maxHashrate[algorithm] * scale }, num + 16 * 3, 16), h,
|
||||||
avg_hashrate_buf
|
avg_hashrate_buf
|
||||||
);
|
);
|
||||||
|
|
||||||
@@ -646,7 +659,10 @@ void xmrig::Miner::onTimer(const Timer *)
|
|||||||
}
|
}
|
||||||
|
|
||||||
if (backend->hashrate()) {
|
if (backend->hashrate()) {
|
||||||
maxHashrate += backend->hashrate()->calc(Hashrate::ShortInterval);
|
const auto h = backend->hashrate()->calc(Hashrate::ShortInterval);
|
||||||
|
if (h.first) {
|
||||||
|
maxHashrate += h.second;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
@@ -694,7 +710,7 @@ void xmrig::Miner::onRequest(IApiRequest &request)
|
|||||||
d_ptr->getMiner(request.reply(), request.doc(), request.version());
|
d_ptr->getMiner(request.reply(), request.doc(), request.version());
|
||||||
d_ptr->getHashrate(request.reply(), request.doc(), request.version());
|
d_ptr->getHashrate(request.reply(), request.doc(), request.version());
|
||||||
}
|
}
|
||||||
else if (request.url() == "/2/backends") {
|
else if (request.type() == IApiRequest::REQ_BACKENDS && request.version() == 2) {
|
||||||
request.accept();
|
request.accept();
|
||||||
|
|
||||||
d_ptr->getBackends(request.reply(), request.doc());
|
d_ptr->getBackends(request.reply(), request.doc());
|
||||||
@@ -716,6 +732,12 @@ void xmrig::Miner::onRequest(IApiRequest &request)
|
|||||||
|
|
||||||
stop();
|
stop();
|
||||||
}
|
}
|
||||||
|
else if (request.rpcMethod() == "start") {
|
||||||
|
request.accept();
|
||||||
|
|
||||||
|
const auto config = d_ptr->controller->config();
|
||||||
|
onConfigChanged(config, config);
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
for (IBackend *backend : d_ptr->backends) {
|
for (IBackend *backend : d_ptr->backends) {
|
||||||
|
|||||||
@@ -22,7 +22,7 @@
|
|||||||
#define APP_ID "xmrig"
|
#define APP_ID "xmrig"
|
||||||
#define APP_NAME "XMRig"
|
#define APP_NAME "XMRig"
|
||||||
#define APP_DESC "XMRig miner"
|
#define APP_DESC "XMRig miner"
|
||||||
#define APP_VERSION "6.22.1"
|
#define APP_VERSION "6.22.3-dev"
|
||||||
#define APP_DOMAIN "xmrig.com"
|
#define APP_DOMAIN "xmrig.com"
|
||||||
#define APP_SITE "www.xmrig.com"
|
#define APP_SITE "www.xmrig.com"
|
||||||
#define APP_COPYRIGHT "Copyright (C) 2016-2024 xmrig.com"
|
#define APP_COPYRIGHT "Copyright (C) 2016-2024 xmrig.com"
|
||||||
@@ -30,7 +30,7 @@
|
|||||||
|
|
||||||
#define APP_VER_MAJOR 6
|
#define APP_VER_MAJOR 6
|
||||||
#define APP_VER_MINOR 22
|
#define APP_VER_MINOR 22
|
||||||
#define APP_VER_PATCH 1
|
#define APP_VER_PATCH 3
|
||||||
|
|
||||||
#ifdef _MSC_VER
|
#ifdef _MSC_VER
|
||||||
# if (_MSC_VER >= 1930)
|
# if (_MSC_VER >= 1930)
|
||||||
|
|||||||
Reference in New Issue
Block a user