Skip to content
Merged
Show file tree
Hide file tree
Changes from 1 commit
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
14 changes: 9 additions & 5 deletions src/init.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -220,6 +220,7 @@ void Interrupt()
InterruptREST();
InterruptTorControl();
llmq::InterruptLLMQSystem();
InterruptMapPort();
if (g_connman)
g_connman->Interrupt();
}
Expand Down Expand Up @@ -251,7 +252,7 @@ void PrepareShutdown()
bool fRPCInWarmup = RPCIsInWarmup(&statusmessage);

g_wallet_init_interface->Flush();
MapPort(false);
StopMapPort();

// Because these depend on each-other, we make sure that neither can be
// using the other before destroying them.
Expand Down Expand Up @@ -692,7 +693,8 @@ static void BlockNotifyCallback(bool initialSync, const CBlockIndex *pBlockIndex
std::string strCmd = gArgs.GetArg("-blocknotify", "");
if (!strCmd.empty()) {
boost::replace_all(strCmd, "%s", pBlockIndex->GetBlockHash().GetHex());
boost::thread t(runCommand, strCmd); // thread runs free
std::thread t(runCommand, strCmd);
t.detach(); // thread runs free
}
}

Expand Down Expand Up @@ -2214,12 +2216,14 @@ bool AppInitMain()
}
LogPrintf("chainActive.Height() = %d\n", chain_active_height);
if (gArgs.GetBoolArg("-listenonion", DEFAULT_LISTEN_ONION))
StartTorControl(threadGroup, scheduler);
StartTorControl();

Discover(threadGroup);
Discover();

// Map ports with UPnP
MapPort(gArgs.GetBoolArg("-upnp", DEFAULT_UPNP));
if (gArgs.GetBoolArg("-upnp", DEFAULT_UPNP)) {
StartMapPort();
}

CConnman::Options connOptions;
connOptions.nLocalServices = nLocalServices;
Expand Down
86 changes: 47 additions & 39 deletions src/net.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1948,6 +1948,8 @@ void CConnman::WakeSelect()


#ifdef USE_UPNP
static CThreadInterrupt g_upnp_interrupt;
static std::thread g_upnp_thread;
void ThreadMapPort()
{
std::string port = strprintf("%u", GetListenPort());
Expand Down Expand Up @@ -1998,35 +2000,29 @@ void ThreadMapPort()

std::string strDesc = "Dash Core " + FormatFullVersion();

try {
while (true) {
do {
#ifndef UPNPDISCOVER_SUCCESS
/* miniupnpc 1.5 */
r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype,
port.c_str(), port.c_str(), lanaddr, strDesc.c_str(), "TCP", 0);
/* miniupnpc 1.5 */
r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype,
port.c_str(), port.c_str(), lanaddr, strDesc.c_str(), "TCP", 0);
#else
/* miniupnpc 1.6 */
r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype,
port.c_str(), port.c_str(), lanaddr, strDesc.c_str(), "TCP", 0, "0");
/* miniupnpc 1.6 */
r = UPNP_AddPortMapping(urls.controlURL, data.first.servicetype,
port.c_str(), port.c_str(), lanaddr, strDesc.c_str(), "TCP", 0, "0");
#endif

if(r!=UPNPCOMMAND_SUCCESS)
LogPrintf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n",
port, port, lanaddr, r, strupnperror(r));
else
LogPrintf("UPnP Port Mapping successful.\n");

MilliSleep(20*60*1000); // Refresh every 20 minutes
}
}
catch (const boost::thread_interrupted&)
{
r = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, port.c_str(), "TCP", 0);
LogPrintf("UPNP_DeletePortMapping() returned: %d\n", r);
freeUPNPDevlist(devlist); devlist = nullptr;
FreeUPNPUrls(&urls);
throw;
if(r!=UPNPCOMMAND_SUCCESS)
LogPrintf("AddPortMapping(%s, %s, %s) failed with code %d (%s)\n",
port, port, lanaddr, r, strupnperror(r));
else
LogPrintf("UPnP Port Mapping successful.\n");
}
while(g_upnp_interrupt.sleep_for(std::chrono::minutes(20)));

r = UPNP_DeletePortMapping(urls.controlURL, data.first.servicetype, port.c_str(), "TCP", 0);
LogPrintf("UPNP_DeletePortMapping() returned: %d\n", r);
freeUPNPDevlist(devlist); devlist = nullptr;
FreeUPNPUrls(&urls);
} else {
LogPrintf("No valid UPnP IGDs found\n");
freeUPNPDevlist(devlist); devlist = nullptr;
Expand All @@ -2035,27 +2031,39 @@ void ThreadMapPort()
}
}

void MapPort(bool fUseUPnP)
void StartMapPort()
{
static std::unique_ptr<boost::thread> upnp_thread;
if (!g_upnp_thread.joinable()) {
assert(!g_upnp_interrupt);
g_upnp_thread = std::thread((std::bind(&TraceThread<void (*)()>, "upnp", &ThreadMapPort)));
}
}

if (fUseUPnP)
{
if (upnp_thread) {
upnp_thread->interrupt();
upnp_thread->join();
}
upnp_thread.reset(new boost::thread(boost::bind(&TraceThread<void (*)()>, "upnp", &ThreadMapPort)));
void InterruptMapPort()
{
if(g_upnp_thread.joinable()) {
g_upnp_interrupt();
}
else if (upnp_thread) {
upnp_thread->interrupt();
upnp_thread->join();
upnp_thread.reset();
}

void StopMapPort()
{
if(g_upnp_thread.joinable()) {
g_upnp_thread.join();
g_upnp_interrupt.reset();
}
}

#else
void MapPort(bool)
void StartMapPort()
{
// Intentionally left blank.
}
void InterruptMapPort()
{
// Intentionally left blank.
}
void StopMapPort()
{
// Intentionally left blank.
}
Expand Down Expand Up @@ -2827,7 +2835,7 @@ bool CConnman::BindListenPort(const CService &addrBind, std::string& strError, b
return true;
}

void Discover(boost::thread_group& threadGroup)
void Discover()
{
if (!fDiscover)
return;
Expand Down
10 changes: 4 additions & 6 deletions src/net.h
Original file line number Diff line number Diff line change
Expand Up @@ -46,10 +46,6 @@
class CScheduler;
class CNode;

namespace boost {
class thread_group;
} // namespace boost

/** Time between pings automatically sent out for latency probing and keepalive (in seconds). */
static const int PING_INTERVAL = 2 * 60;
/** Time after which to disconnect, after waiting for a ping response (or inactivity). */
Expand Down Expand Up @@ -644,8 +640,10 @@ friend class CNode;
friend struct CConnmanTest;
};
extern std::unique_ptr<CConnman> g_connman;
void Discover(boost::thread_group& threadGroup);
void MapPort(bool fUseUPnP);
void Discover();
void StartMapPort();
void InterruptMapPort();
void StopMapPort();
unsigned short GetListenPort();
bool BindListenPort(const CService &bindAddr, std::string& strError, bool fWhitelisted = false);

Expand Down
7 changes: 6 additions & 1 deletion src/qt/optionsmodel.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -379,7 +379,12 @@ bool OptionsModel::setData(const QModelIndex & index, const QVariant & value, in
break;
case MapPortUPnP: // core option - can be changed on-the-fly
settings.setValue("fUseUPnP", value.toBool());
MapPort(value.toBool());
if (value.toBool()) {
StartMapPort();
} else {
InterruptMapPort();
StopMapPort();
}
break;
case MinimizeOnClose:
fMinimizeOnClose = value.toBool();
Expand Down
6 changes: 3 additions & 3 deletions src/torcontrol.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -731,7 +731,7 @@ void TorController::reconnect_cb(evutil_socket_t fd, short what, void *arg)

/****** Thread ********/
static struct event_base *gBase;
static boost::thread torControlThread;
static std::thread torControlThread;

static void TorControlThread()
{
Expand All @@ -740,7 +740,7 @@ static void TorControlThread()
event_base_dispatch(gBase);
}

void StartTorControl(boost::thread_group& threadGroup, CScheduler& scheduler)
void StartTorControl()
{
assert(!gBase);
#ifdef WIN32
Expand All @@ -754,7 +754,7 @@ void StartTorControl(boost::thread_group& threadGroup, CScheduler& scheduler)
return;
}

torControlThread = boost::thread(boost::bind(&TraceThread<void (*)()>, "torcontrol", &TorControlThread));
torControlThread = std::thread(std::bind(&TraceThread<void (*)()>, "torcontrol", &TorControlThread));
}

void InterruptTorControl()
Expand Down
2 changes: 1 addition & 1 deletion src/torcontrol.h
Original file line number Diff line number Diff line change
Expand Up @@ -13,7 +13,7 @@
extern const std::string DEFAULT_TOR_CONTROL;
static const bool DEFAULT_LISTEN_ONION = true;

void StartTorControl(boost::thread_group& threadGroup, CScheduler& scheduler);
void StartTorControl();
void InterruptTorControl();
void StopTorControl();

Expand Down
3 changes: 2 additions & 1 deletion src/validation.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -1214,7 +1214,8 @@ static void AlertNotify(const std::string& strMessage)
safeStatus = singleQuote+safeStatus+singleQuote;
boost::replace_all(strCmd, "%s", safeStatus);

boost::thread t(runCommand, strCmd); // thread runs free
std::thread t(runCommand, strCmd);
t.detach(); // thread runs free
}

static void CheckForkWarningConditions()
Expand Down
4 changes: 2 additions & 2 deletions src/wallet/wallet.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -45,7 +45,6 @@
#include <future>

#include <boost/algorithm/string/replace.hpp>
#include <boost/thread.hpp>

static CCriticalSection cs_wallets;
static std::vector<CWallet*> vpwallets GUARDED_BY(cs_wallets);
Expand Down Expand Up @@ -1169,7 +1168,8 @@ bool CWallet::AddToWallet(const CWalletTx& wtxIn, bool fFlushOnClose)
if (!strCmd.empty())
{
boost::replace_all(strCmd, "%s", wtxIn.GetHash().GetHex());
boost::thread t(runCommand, strCmd); // thread runs free
std::thread t(runCommand, strCmd);
t.detach(); // thread runs free
}

fAnonymizableTallyCached = false;
Expand Down