"
"
"
diff --git a/xmrstak/misc/executor.cpp b/xmrstak/misc/executor.cpp
index 5eb9f07ef..18da71224 100644
--- a/xmrstak/misc/executor.cpp
+++ b/xmrstak/misc/executor.cpp
@@ -121,7 +121,9 @@ void executor::sched_reconnect()
rt, int_port(iReconnectAttempts));
auto work = xmrstak::miner_work();
- xmrstak::globalStates::inst().switch_work(work);
+ xmrstak::pool_data dat;
+
+ xmrstak::globalStates::inst().switch_work(work, dat);
push_timed_event(ex_event(EV_RECONNECT, usr_pool_id), rt);
}
@@ -166,7 +168,8 @@ void executor::log_result_ok(uint64_t iActualDiff)
jpsock* executor::pick_pool_by_id(size_t pool_id)
{
- assert(pool_id != invalid_pool_id);
+ if(pool_id == invalid_pool_id)
+ return nullptr;
if(pool_id == dev_pool_id)
return dev_pool;
@@ -233,14 +236,23 @@ void executor::on_pool_have_job(size_t pool_id, pool_job& oPoolJob)
jpsock* pool = pick_pool_by_id(pool_id);
- xmrstak::miner_work oWork(oPoolJob.sJobID, oPoolJob.bWorkBlob,
- oPoolJob.iWorkLen, oPoolJob.iResumeCnt, oPoolJob.iTarget,
- pool_id != dev_pool_id && ::jconf::inst()->NiceHashMode(),
- pool_id);
+ xmrstak::miner_work oWork(oPoolJob.sJobID, oPoolJob.bWorkBlob, oPoolJob.iWorkLen, oPoolJob.iTarget,
+ pool_id != dev_pool_id && ::jconf::inst()->NiceHashMode(), pool_id);
oWork.iTarget32 = oPoolJob.iTarget32;
- xmrstak::globalStates::inst().switch_work(oWork);
+ xmrstak::pool_data dat;
+ dat.iSavedNonce = oPoolJob.iSavedNonce;
+ dat.pool_id = pool_id;
+
+ xmrstak::globalStates::inst().switch_work(oWork, dat);
+
+ if(dat.pool_id != pool_id)
+ {
+ jpsock* prev_pool;
+ if((prev_pool = pick_pool_by_id(dat.pool_id)) != nullptr)
+ prev_pool->save_nonce(dat.iSavedNonce);
+ }
if(pool_id == dev_pool_id)
return;
@@ -251,7 +263,10 @@ void executor::on_pool_have_job(size_t pool_id, pool_job& oPoolJob)
printer::inst()->print_msg(L2, "Difficulty changed. Now: %llu.", int_port(iPoolDiff));
}
- printer::inst()->print_msg(L3, "New block detected.");
+ if(dat.pool_id == pool_id)
+ printer::inst()->print_msg(L3, "New block detected.");
+ else
+ printer::inst()->print_msg(L3, "Pool switched.");
}
void executor::on_miner_result(size_t pool_id, job_result& oResult)
@@ -356,13 +371,7 @@ void executor::on_switch_pool(size_t pool_id)
return;
}
- xmrstak::miner_work oWork(oPoolJob.sJobID, oPoolJob.bWorkBlob,
- oPoolJob.iWorkLen, oPoolJob.iResumeCnt, oPoolJob.iTarget,
- ::jconf::inst()->NiceHashMode(), pool_id);
-
- oWork.iTarget32 = oPoolJob.iTarget32;
-
- xmrstak::globalStates::inst().switch_work(oWork);
+ on_pool_have_job(current_pool_id, oPoolJob);
if(dev_pool->is_running())
push_timed_event(ex_event(EV_DEV_POOL_EXIT), 5);
diff --git a/xmrstak/net/jpsock.cpp b/xmrstak/net/jpsock.cpp
index ae20e5221..773592177 100644
--- a/xmrstak/net/jpsock.cpp
+++ b/xmrstak/net/jpsock.cpp
@@ -566,6 +566,12 @@ bool jpsock::cmd_submit(const char* sJobId, uint32_t iNonce, const uint8_t* bRes
return cmd_ret_wait(cmd_buffer, oResult);
}
+void jpsock::save_nonce(uint32_t nonce)
+{
+ std::unique_lock(job_mutex);
+ oCurrentJob.iSavedNonce = nonce;
+}
+
bool jpsock::get_current_job(pool_job& job)
{
std::unique_lock(job_mutex);
@@ -573,7 +579,6 @@ bool jpsock::get_current_job(pool_job& job)
if(oCurrentJob.iWorkLen == 0)
return false;
- oCurrentJob.iResumeCnt++;
job = oCurrentJob;
return true;
}
diff --git a/xmrstak/net/jpsock.hpp b/xmrstak/net/jpsock.hpp
index c2194ad0d..e94eaad22 100644
--- a/xmrstak/net/jpsock.hpp
+++ b/xmrstak/net/jpsock.hpp
@@ -50,6 +50,7 @@ class jpsock
inline uint64_t get_current_diff() { return iJobDiff; }
+ void save_nonce(uint32_t nonce);
bool get_current_job(pool_job& job);
size_t pool_id;
diff --git a/xmrstak/net/msgstruct.hpp b/xmrstak/net/msgstruct.hpp
index 05d15fe24..8e8254bdc 100644
--- a/xmrstak/net/msgstruct.hpp
+++ b/xmrstak/net/msgstruct.hpp
@@ -15,11 +15,11 @@ struct pool_job
// \todo remove workaround needed for amd
uint32_t iTarget32;
uint32_t iWorkLen;
- uint32_t iResumeCnt;
+ uint32_t iSavedNonce;
- pool_job() : iWorkLen(0), iResumeCnt(0) {}
+ pool_job() : iWorkLen(0), iSavedNonce(0) {}
pool_job(const char* sJobID, uint64_t iTarget, const uint8_t* bWorkBlob, uint32_t iWorkLen) :
- iTarget(iTarget), iWorkLen(iWorkLen), iResumeCnt(0)
+ iTarget(iTarget), iWorkLen(iWorkLen), iSavedNonce(0)
{
assert(iWorkLen <= sizeof(pool_job::bWorkBlob));
memcpy(this->sJobID, sJobID, sizeof(pool_job::sJobID));