From cc3552af7a8ad183960c23c7fa9cc2ef7185becc Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jonah=20Br=C3=BCchert?= Date: Sun, 18 Feb 2024 19:13:14 +0100 Subject: [PATCH] Allow to set timeout for searching --- include/nigiri/routing/search.h | 28 ++++++++++++++++++++++------ 1 file changed, 22 insertions(+), 6 deletions(-) diff --git a/include/nigiri/routing/search.h b/include/nigiri/routing/search.h index 992606c1..7fdd2204 100644 --- a/include/nigiri/routing/search.h +++ b/include/nigiri/routing/search.h @@ -109,7 +109,8 @@ struct search { rt_timetable const* rtt, search_state& s, algo_state_t& algo_state, - query q) + query q, + std::optional timeout = std::nullopt) : tt_{tt}, rtt_{rtt}, state_{s}, @@ -124,7 +125,8 @@ struct search { }}, q_.start_time_)}, fastest_direct_{get_fastest_direct(tt_, q_, SearchDir)}, - algo_{init(algo_state)} {} + algo_{init(algo_state)}, + timeout_(timeout) {} routing_result execute() { state_.results_.clear(); @@ -136,17 +138,29 @@ struct search { state_.starts_.clear(); add_start_labels(q_.start_time_, true); + auto const processing_start_time = std::chrono::system_clock::now(); + auto const is_timeout_reached = [&]() { + if (timeout_) { + return (std::chrono::system_clock::now() - processing_start_time) >= + *timeout_; + } + + return false; + }; + while (true) { trace("start_time={}\n", search_interval_); search_interval(); if (is_ontrip() || max_interval_reached() || - n_results_in_interval() >= q_.min_connection_count_) { + n_results_in_interval() >= q_.min_connection_count_ || + is_timeout_reached()) { trace( " finished: is_ontrip={}, max_interval_reached={}, " "extend_earlier={}, extend_later={}, initial={}, interval={}, " - "timetable={}, number_of_results_in_interval={}\n", + "timetable={}, number_of_results_in_interval={}, " + "timeout_reached={}\n", is_ontrip(), max_interval_reached(), q_.extend_interval_earlier_, q_.extend_interval_later_, std::visit( @@ -158,7 +172,8 @@ struct search { return interval{start_time, start_time}; }}, q_.start_time_), - search_interval_, tt_.external_interval(), n_results_in_interval()); + search_interval_, tt_.external_interval(), n_results_in_interval(), + is_timeout_reached()); break; } else { trace( @@ -338,6 +353,7 @@ struct search { search_stats stats_; duration_t fastest_direct_; Algo algo_; + std::optional timeout_; }; -} // namespace nigiri::routing \ No newline at end of file +} // namespace nigiri::routing