50 const milli cleanup_timeout{1000};
51 const milli rep_recv_timeout{-1};
52 const milli rep_send_timeout{1000};
56 component_type::connect_p connect_p;
62 std::atomic<int> tot_served{0};
68 using parent_type::parent_type;
72 void startup(
int argc,
char** argv)
override
77 auto ts = state.tx(server_state::creating, server_state::initializing);
83 max_allowed = std::stoi(argv[4]);
88 max_served = std::stoi(argv[3]);
93 connect_p.service_cmode = net::cmode_from_string(argv[1]);
95 connect_p.service_addr = argv[2];
100 throw std::invalid_argument(
"Usage: ./server_backend service_cmode "
101 "service_addr [max_served [max_allowed]]");
134 auto ts = state.tx(server_state::initializing, server_state::running);
136 comp().
init({.num_ctxs = max_allowed,
137 .rep_opts = {.recv_timeout = rep_recv_timeout.count(),
138 .send_timeout = rep_send_timeout.count()}});
150 state.ensure(server_state::running);
152 auto [
ev, md] =
fired.as_tuple();
154 auto resources_count = resources.count();
156 if (resources_count < max_allowed)
158 resources.emplace(md.pipe().id(), pipe_state::waiting_work);
160 pars::info(
SL,
"{}: Fired {}, Pipe Accepted! [# resources: {} < {}]", md,
161 ev, resources_count, max_allowed);
165 md.pipe().close().or_abort();
167 pars::info(
SL,
"{}: Fired {}, Pipe Rejected! [# resources: {} >= {}]", md,
168 ev, resources_count, max_allowed);
175 state.ensure(server_state::running);
177 auto [
ev, md] =
fired.as_tuple();
179 pars::info(
SL,
"{}: Fired {} [# resources: {}]", md,
ev, resources.count());
185 state.ensure(server_state::running);
187 auto [
ev, md] =
fired.as_tuple();
189 pars::info(
SL,
"{}: Fired {} [# resources: {}]", md,
ev, resources.count());
195 state.ensure(server_state::running);
197 auto [
ev, md] = recv.as_tuple();
199 auto locked = resources.locked_resource(md.pipe().id());
206 pars::info(
SL,
"{}: Received {}, Already Working: Returning ...", md,
ev);
226 state.ensure(server_state::running);
228 auto [
ev, md] =
fired.as_tuple();
232 auto locked = resources.locked_resource(p.id());
244 fib_n = compute::fib(
ev.n,
ev.use_fast_fib, md);
248 locked.guard().unlock();
252 resources.delete_resource(p.id());
254 pars::info(
SL,
"{}: Fired {}, Stop Requested! [# resources: {}]", md,
ev,
276 state.ensure(server_state::running);
278 auto [
ev, md] =
sent.as_tuple();
282 resources.delete_resource(p.id());
284 if (++tot_served == max_served)
290 pars::info(
SL,
"{}: Sent {}, Fire {}! [{} succesfully served]", md,
ev,
291 shutdown_ev, max_served);
309 state.ensure(server_state::running);
311 auto [
ev, md] =
fired.as_tuple();
315 resources.delete_resource(p.id());
317 p.close().or_abort();
325 pars::info(
SL,
"{}: Fired {} (during {}), Pipe Closed!", md,
ev, dir);
331 state.ensure(server_state::running);
337 std::cout <<
"SHUTDOWN ..." << std::endl;
context & of(const net::tool_view &t)