can ping on lokinet running in python context!

pull/1184/head
Thomas Winget 4 years ago
parent 85e510c89b
commit 1e04decb66

@ -10,8 +10,9 @@ def main():
def handle_sigint(sig, frame):
nonlocal running
running = False
print("SIGINT received, attempting to stop all routers")
signal(SIGINT, handle_signal)
signal(SIGINT, handle_sigint)
hive = pyllarp.RouterHive()
config = pyllarp.Config()
@ -22,7 +23,8 @@ def main():
while running:
event = hive.GetNextEvent()
print(event.ToString())
if event:
print(event)
hive.StopAll()

@ -8,6 +8,7 @@
#include <router/abstractrouter.hpp>
#include <util/buffer.hpp>
#include <util/thread/logic.hpp>
#include <tooling/router_event.hpp>
#include <functional>
@ -445,6 +446,10 @@ namespace llarp
auto path = std::make_shared< path::Path >(hops, self.get(), roles,
std::move(path_shortName));
LogInfo(Name(), " build ", path->ShortName(), ": ", path->HopsString());
tooling::RouterEventPtr event = std::make_unique<tooling::PathBuildAttemptEvent>(m_router->pubkey(), path->hops);
m_router->NotifyRouterEvent(std::move(event));
path->SetBuildResultHook(
[self](Path_ptr p) { self->HandlePathBuilt(p); });
ctx->AsyncGenerateKeys(path, m_router->logic(), m_router->threadpool(),

@ -5,6 +5,8 @@
#include <chrono>
using namespace std::chrono_literals;
namespace tooling
{
@ -39,7 +41,6 @@ namespace tooling
void
RouterHive::StopRouters()
{
using namespace std::chrono_literals;
for (llarp_main* ctx : routers)
{
@ -89,7 +90,12 @@ namespace tooling
RouterEventPtr
RouterHive::GetNextEvent()
{
return eventQueue.popFront();
auto ptr = eventQueue.popFrontWithTimeout(50ms);
if (ptr)
{
return std::move(ptr.value());
}
return nullptr;
}
void

@ -73,6 +73,11 @@ namespace llarp
Type
popFront();
// Remove an element from the queue. Block until an element is available
// or until <timeout> microseconds have elapsed
nonstd::optional< Type >
popFrontWithTimeout(std::chrono::microseconds timeout);
nonstd::optional< Type >
tryPopFront();
@ -385,6 +390,40 @@ namespace llarp
return Type(std::move(m_data[index]));
}
template < typename Type >
nonstd::optional< Type >
Queue< Type >::popFrontWithTimeout(std::chrono::microseconds timeout)
{
uint32_t generation = 0;
uint32_t index = 0;
bool secondTry = false;
bool success = false;
for(;;)
{
success = m_manager.reservePopIndex(generation, index) == QueueReturn::Success;
if (secondTry || success) break;
m_waitingPoppers.fetch_add(1, std::memory_order_relaxed);
if(empty())
{
m_popSemaphore.waitFor(timeout);
secondTry = true;
}
m_waitingPoppers.fetch_sub(1, std::memory_order_relaxed);
}
if (success)
{
QueuePopGuard< Type > popGuard(*this, generation, index);
return Type(std::move(m_data[index]));
}
return {};
}
template < typename Type >
void
Queue< Type >::removeAll()

@ -2,18 +2,19 @@
#include "tooling/router_event.hpp"
#include <path/path.hpp>
namespace tooling
{
void
RouterEvent_Init(py::module & mod)
{
py::class_<RouterEvent>(mod, "RouterEvent")
.def(py::init<>())
.def("ToString", &RouterEvent::ToString)
.def("__repr__", &RouterEvent::ToString)
.def("__str__", &RouterEvent::ToString)
.def_readonly("routerID", &RouterEvent::routerID);
py::class_<PathBuildAttemptEvent>(mod, "PathBuildAttemptEvent")
.def(py::init<>());
py::class_<PathBuildAttemptEvent, RouterEvent>(mod, "PathBuildAttemptEvent");
//.def_readonly("hops", &PathBuildAttemptEvent::hops);
}

@ -11,7 +11,8 @@ namespace tooling
.def(py::init<>())
.def("AddRouter", &RouterHive::AddRouter)
.def("StartAll", &RouterHive::StartRouters)
.def("StopAll", &RouterHive::StopRouters);
.def("StopAll", &RouterHive::StopRouters)
.def("GetNextEvent", &RouterHive::GetNextEvent);
}
}
}

Loading…
Cancel
Save