void DhtRunner::run(const sockaddr_in* local4, const sockaddr_in6* local6, DhtRunner::Config config) { if (running) return; if (rcv_thread.joinable()) rcv_thread.join(); running = true; doRun(local4, local6, config.dht_config); if (not config.threaded) return; dht_thread = std::thread([this]() { while (running) { std::unique_lock<std::mutex> lk(dht_mtx); auto wakeup = loop_(); cv.wait_until(lk, wakeup, [this]() { if (not running) return true; { std::lock_guard<std::mutex> lck(sock_mtx); if (not rcv.empty()) return true; } { std::lock_guard<std::mutex> lck(storage_mtx); if (not pending_ops.empty()) return true; } return false; }); } }); }
void DhtRunner::run(const sockaddr_in* local4, const sockaddr_in6* local6, const crypto::Identity identity, bool threaded, StatusCallback cb) { if (running) return; if (rcv_thread.joinable()) rcv_thread.join(); statusCb = cb; running = true; doRun(local4, local6, identity); if (not threaded) return; dht_thread = std::thread([this]() { while (running) { std::unique_lock<std::mutex> lk(dht_mtx); auto wakeup = loop_(); cv.wait_until(lk, wakeup, [this]() { if (not running) return true; { std::lock_guard<std::mutex> lck(sock_mtx); if (not rcv.empty()) return true; } { std::lock_guard<std::mutex> lck(storage_mtx); if (not pending_ops.empty()) return true; } return false; }); } }); }
static inline void main_loop__(jl_t* jl) { jl_fnct loop_ = jl->mode.mode.loop; // Check the amount of time passed since last frame. jl_seconds_passed__(jl); // Run the user's mode loop. loop_(jl); }