|
|
|
@ -56,9 +56,13 @@ CurrentBlockchainStatus::monitor_blockchain()
|
|
|
|
|
OMINFO << "Current blockchain height: " << current_height
|
|
|
|
|
<< ", no of mempool txs: " << mempool_txs.size();
|
|
|
|
|
|
|
|
|
|
clean_search_thread_map();
|
|
|
|
|
//clean_search_thread_map();
|
|
|
|
|
|
|
|
|
|
std::this_thread::sleep_for(
|
|
|
|
|
// std::this_thread::sleep_for(
|
|
|
|
|
// bc_setup.refresh_block_status_every);
|
|
|
|
|
|
|
|
|
|
cout << " monitor threadid " << std::this_thread::get_id() << endl;
|
|
|
|
|
boost::this_fiber::sleep_for(
|
|
|
|
|
bc_setup.refresh_block_status_every);
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
@ -764,11 +768,50 @@ CurrentBlockchainStatus::start_tx_search_thread(
|
|
|
|
|
{
|
|
|
|
|
// launch SearchTx thread for the given xmr account
|
|
|
|
|
|
|
|
|
|
searching_threads.insert(
|
|
|
|
|
{acc.address, ThreadRAII2<TxSearch>(std::move(tx_search))});
|
|
|
|
|
//searching_threads.insert(
|
|
|
|
|
//{acc.address, ThreadRAII2<TxSearch>(std::move(tx_search))});
|
|
|
|
|
|
|
|
|
|
// searching_fibers.insert(
|
|
|
|
|
// {acc.address, std::move(tx_search)});
|
|
|
|
|
|
|
|
|
|
// boost::fibers::fiber(std::ref(*tx_search)).detach();
|
|
|
|
|
// boost::fibers::fiber(
|
|
|
|
|
// std::ref(*searching_fibers.find(acc.address)->second)
|
|
|
|
|
// ).detach();
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
//boost::fibers::fiber fb(boost::fibers::launch::dispatch,
|
|
|
|
|
auto fb = make_unique<boost::fibers::fiber>(
|
|
|
|
|
[ts = std::move(tx_search)]()
|
|
|
|
|
{
|
|
|
|
|
cout << "Fiber starting" << endl;
|
|
|
|
|
(*ts)();
|
|
|
|
|
});
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
searching_fibers2.insert(
|
|
|
|
|
{acc.address, std::move(fb)});
|
|
|
|
|
|
|
|
|
|
//searching_fibers2.insert(
|
|
|
|
|
//{acc.address, boost::fibers::fiber(
|
|
|
|
|
//boost::fibers::launch::post,
|
|
|
|
|
//[ts = std::move(tx_search)]() -> void
|
|
|
|
|
//{
|
|
|
|
|
//cout << "Fiber starting" << endl;
|
|
|
|
|
//(*ts)();
|
|
|
|
|
//cout << "Fiber finished" << endl;
|
|
|
|
|
//})});
|
|
|
|
|
|
|
|
|
|
cout << "threadid " << std::this_thread::get_id() << endl;
|
|
|
|
|
searching_fibers2.find(acc.address)->second->detach();
|
|
|
|
|
|
|
|
|
|
//fb.detach();
|
|
|
|
|
|
|
|
|
|
//boost::this_fiber::sleep_for(120s);
|
|
|
|
|
OMINFO << acc.address.substr(0,6)
|
|
|
|
|
+ ": TxSearch thread created.";
|
|
|
|
|
//boost::this_fiber::yield();
|
|
|
|
|
}
|
|
|
|
|
catch (const std::exception& e)
|
|
|
|
|
{
|
|
|
|
@ -843,7 +886,8 @@ CurrentBlockchainStatus::search_thread_exist(const string& address)
|
|
|
|
|
// no mutex here, as this will be executed
|
|
|
|
|
// from other methods, which do use mutex.
|
|
|
|
|
// so if you put mutex here, you will get into deadlock.
|
|
|
|
|
return searching_threads.count(address) > 0;
|
|
|
|
|
//return searching_threads.count(address) > 0;
|
|
|
|
|
return searching_fibers.count(address) > 0;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
bool
|
|
|
|
@ -876,7 +920,7 @@ CurrentBlockchainStatus::find_txs_in_mempool(
|
|
|
|
|
{
|
|
|
|
|
std::lock_guard<std::mutex> lck (getting_mempool_txs);
|
|
|
|
|
|
|
|
|
|
if (searching_threads.count(address_str) == 0)
|
|
|
|
|
if (searching_fibers.count(address_str) == 0)
|
|
|
|
|
{
|
|
|
|
|
// thread does not exist
|
|
|
|
|
OMERROR << "thread for " << address_str << " does not exist";
|
|
|
|
@ -1015,7 +1059,7 @@ CurrentBlockchainStatus::set_new_searched_blk_no(
|
|
|
|
|
{
|
|
|
|
|
std::lock_guard<std::mutex> lck (searching_threads_map_mtx);
|
|
|
|
|
|
|
|
|
|
if (searching_threads.count(address) == 0)
|
|
|
|
|
if (searching_fibers.count(address) == 0)
|
|
|
|
|
{
|
|
|
|
|
// thread does not exist
|
|
|
|
|
OMERROR << address.substr(0,6)
|
|
|
|
@ -1034,9 +1078,9 @@ CurrentBlockchainStatus::get_search_thread(string const& acc_address)
|
|
|
|
|
{
|
|
|
|
|
// do not need locking mutex here, as this function should be only
|
|
|
|
|
// executed from others that do lock the mutex already.
|
|
|
|
|
auto it = searching_threads.find(acc_address);
|
|
|
|
|
auto it = searching_fibers.find(acc_address);
|
|
|
|
|
|
|
|
|
|
if (it == searching_threads.end())
|
|
|
|
|
if (it == searching_fibers.end())
|
|
|
|
|
{
|
|
|
|
|
OMERROR << "Search thread does not exisit for addr: "
|
|
|
|
|
<< acc_address;
|
|
|
|
@ -1044,7 +1088,7 @@ CurrentBlockchainStatus::get_search_thread(string const& acc_address)
|
|
|
|
|
"non-existing search thread");
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
return searching_threads.find(acc_address)->second.get_functor();
|
|
|
|
|
return *searching_fibers.find(acc_address)->second;
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
void
|
|
|
|
@ -1052,17 +1096,17 @@ CurrentBlockchainStatus::clean_search_thread_map()
|
|
|
|
|
{
|
|
|
|
|
std::lock_guard<std::mutex> lck (searching_threads_map_mtx);
|
|
|
|
|
|
|
|
|
|
for (auto& st: searching_threads)
|
|
|
|
|
for (auto& st: searching_fibers)
|
|
|
|
|
{
|
|
|
|
|
if (search_thread_exist(st.first)
|
|
|
|
|
&& st.second.get_functor().still_searching() == false)
|
|
|
|
|
&& st.second->still_searching() == false)
|
|
|
|
|
{
|
|
|
|
|
|
|
|
|
|
// before erasing a search thread, check if there was any
|
|
|
|
|
// exception thrown by it
|
|
|
|
|
try
|
|
|
|
|
{
|
|
|
|
|
auto eptr = st.second.get_functor().get_exception_ptr();
|
|
|
|
|
auto eptr = st.second->get_exception_ptr();
|
|
|
|
|
if (eptr != nullptr)
|
|
|
|
|
std::rethrow_exception(eptr);
|
|
|
|
|
}
|
|
|
|
@ -1073,7 +1117,7 @@ CurrentBlockchainStatus::clean_search_thread_map()
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|
OMINFO << "Ereasing a search thread";
|
|
|
|
|
searching_threads.erase(st.first);
|
|
|
|
|
searching_fibers.erase(st.first);
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
@ -1083,9 +1127,9 @@ CurrentBlockchainStatus::stop_search_threads()
|
|
|
|
|
{
|
|
|
|
|
std::lock_guard<std::mutex> lck (searching_threads_map_mtx);
|
|
|
|
|
|
|
|
|
|
for (auto& st: searching_threads)
|
|
|
|
|
for (auto& st: searching_fibers)
|
|
|
|
|
{
|
|
|
|
|
st.second.get_functor().stop();
|
|
|
|
|
st.second->stop();
|
|
|
|
|
}
|
|
|
|
|
}
|
|
|
|
|
|
|
|
|
|