diff --git a/src/p2pool.cpp b/src/p2pool.cpp index dee34e2..4809d21 100644 --- a/src/p2pool.cpp +++ b/src/p2pool.cpp @@ -521,7 +521,7 @@ void p2pool::handle_chain_main(ChainMain& data, const char* extra) LOGINFO(0, log::LightCyan() << "Your wallet " << log::LightYellow() << w << log::LightCyan() << " didn't get a payout in block " << log::LightYellow() << data.height << log::LightCyan() << " because you had no shares in PPLNS window"); } - api_update_block_found(&data, block); + api_update_block_found(&data, block, false); } else { side_chain().watch_mainchain_block(data, merkle_root); @@ -1680,7 +1680,7 @@ void p2pool::cleanup_mainchain_data(uint64_t height) } } -void p2pool::api_update_block_found(const ChainMain* data, const PoolBlock* block) +void p2pool::api_update_block_found(const ChainMain* data, const PoolBlock* block, bool update_stats_mod) { if (!m_api || m_stopped) { return; @@ -1727,7 +1727,9 @@ void p2pool::api_update_block_found(const ChainMain* data, const PoolBlock* bloc s << ']'; }); - api_update_stats_mod(); + if (update_stats_mod) { + api_update_stats_mod(); + } } bool p2pool::get_difficulty_at_height(uint64_t height, difficulty_type& diff) diff --git a/src/p2pool.h b/src/p2pool.h index 561d649..9ca01f3 100644 --- a/src/p2pool.h +++ b/src/p2pool.h @@ -110,7 +110,7 @@ public: bool chainmain_get_by_hash(const hash& id, ChainMain& data) const; - void api_update_block_found(const ChainMain* data, const PoolBlock* block); + void api_update_block_found(const ChainMain* data, const PoolBlock* block, bool update_stats_mod = true); bool get_difficulty_at_height(uint64_t height, difficulty_type& diff); diff --git a/src/p2pool_api.cpp b/src/p2pool_api.cpp index d62c01e..dc8b521 100644 --- a/src/p2pool_api.cpp +++ b/src/p2pool_api.cpp @@ -130,29 +130,36 @@ void p2pool_api::dump_to_file_async_internal(Category category, const char* file } MutexLock lock(m_dumpDataLock); - m_dumpData[path] = std::move(buf); - if (!uv_is_closing(reinterpret_cast(&m_dumpToFileAsync))) { - uv_async_send(&m_dumpToFileAsync); + std::pair, bool>& data = m_dumpData[path]; + + if (data.first != buf) { + data.first = buf; + data.second = true; + + if (!uv_is_closing(reinterpret_cast(&m_dumpToFileAsync))) { + uv_async_send(&m_dumpToFileAsync); + } } } void p2pool_api::dump_to_file() { - unordered_map> data; - { - MutexLock lock(m_dumpDataLock); - data = std::move(m_dumpData); - } + MutexLock lock(m_dumpDataLock); char buf[log::Stream::BUF_SIZE + 1]; buf[0] = '\0'; - for (auto& it : data) { + for (auto& it : m_dumpData) { + if (!it.second.second) { + continue; + } + it.second.second = false; + log::Stream s(buf); s << it.first << m_counter << '\0'; - DumpFileWork* work = new DumpFileWork{ {}, 0, it.first, buf, std::move(it.second) }; + DumpFileWork* work = new DumpFileWork{ {}, 0, it.first, buf, it.second.first }; work->req.data = work; ++m_counter; diff --git a/src/p2pool_api.h b/src/p2pool_api.h index 2006e38..7655e9d 100644 --- a/src/p2pool_api.h +++ b/src/p2pool_api.h @@ -68,7 +68,7 @@ private: std::string m_localPath; uv_mutex_t m_dumpDataLock; - unordered_map> m_dumpData; + unordered_map, bool>> m_dumpData; uv_async_t m_dumpToFileAsync;