Commit d375ddf3 authored by Joseph Noir's avatar Joseph Noir

Let spawn_server return a pair over actor and port

parent f304cfdb
......@@ -192,14 +192,14 @@ public:
void run_server(actor_system& system, const config& cfg) {
cout << "run in server mode" << endl;
auto pong_actor = system.spawn(pong);
auto server_actor = system.middleman().spawn_server(server, cfg.port,
pong_actor);
if (!server_actor) {
auto server_details = system.middleman().spawn_server(server, cfg.port,
pong_actor);
if (!server_details) {
std::cerr << "failed to spawn server: "
<< system.render(server_actor.error()) << endl;
<< system.render(server_details.error()) << endl;
return;
}
print_on_exit(*server_actor, "server");
print_on_exit(server_details->first, "server");
print_on_exit(pong_actor, "pong");
}
......
......@@ -77,19 +77,21 @@ public:
};
void caf_main(actor_system& system, const config& cfg) {
auto server_actor = system.middleman().spawn_server(server, cfg.port);
if (!server_actor) {
auto server_details = system.middleman().spawn_server(server, cfg.port);
if (!server_details) {
cerr << "*** cannot spawn server: "
<< system.render(server_actor.error()) << endl;
<< system.render(server_details.error()) << endl;
return;
}
cout << "*** listening on port " << cfg.port << endl;
auto& server_actor = server_details->first;
auto& port = server_details->second;
cout << "*** listening on port " << port << endl;
cout << "*** to quit the program, simply press <enter>" << endl;
// wait for any input
std::string dummy;
std::getline(std::cin, dummy);
// kill server
anon_send_exit(*server_actor, exit_reason::user_shutdown);
anon_send_exit(server_actor, exit_reason::user_shutdown);
}
} // namespace <anonymous>
......
......@@ -300,26 +300,8 @@ public:
/// @warning Blocks the caller until the server socket is initialized.
template <spawn_options Os = no_spawn_options,
class F = std::function<void(broker*)>, class... Ts>
expected<typename infer_handle_from_fun<F>::type>
spawn_server(F fun, uint16_t& port, Ts&&... xs) {
auto tmp = uri::make(std::string(default_protocol) + "0.0.0.0:" +
std::to_string(port));
if (!tmp)
throw sec::invalid_argument;
std::cout << "Built uri '" << tmp->str() << "' from port '" << port
<< "'. Port was interpreted as '" << tmp->port_as_int() << "'."
<< std::endl;
using impl = typename infer_handle_from_fun<F>::impl;
return spawn_server_impl<Os, impl>(std::move(fun), std::move(*tmp),
std::forward<Ts>(xs)...);
}
/// Spawns a new broker as server running on given `port`.
/// @warning Blocks the caller until the server socket is initialized.
template <spawn_options Os = no_spawn_options,
class F = std::function<void(broker*)>, class... Ts>
expected<typename infer_handle_from_fun<F>::type>
spawn_server(F fun, const uint16_t& port, Ts&&... xs) {
expected<std::pair<typename infer_handle_from_fun<F>::type, uint16_t>>
spawn_server(F fun, uint16_t port, Ts&&... xs) {
auto tmp = uri::make(std::string(default_protocol) + "0.0.0.0:" +
std::to_string(port));
if (!tmp)
......@@ -386,7 +368,7 @@ private:
}
template <spawn_options Os, class Impl, class F, class... Ts>
expected<typename infer_handle_from_class<Impl>::type>
expected<std::pair<typename infer_handle_from_fun<F>::type, uint16_t>>
spawn_server_impl(F fun, uri u, Ts&&... xs) {
detail::init_fun_factory<Impl, F> fac;
auto init_fun = fac(std::move(fun), std::forward<Ts>(xs)...);
......@@ -401,7 +383,7 @@ private:
static_cast<abstract_broker*>(ptr)->assign_tcp_doorman(hdl);
return init_fun(ptr);
};
return system().spawn_class<Impl, Os>(cfg);
return std::make_pair(system().spawn_class<Impl, Os>(cfg), port);
}
expected<strong_actor_ptr> remote_spawn_impl(const node_id& nid,
......
......@@ -232,9 +232,9 @@ CAF_TEST_FIXTURE_SCOPE(trigger_tests, fixture)
CAF_TEST(trigger_connection) {
CAF_MESSAGE("spawn server");
uint16_t port = 0;
auto serv = server_system.middleman().spawn_server(server1, port);
CAF_REQUIRE(serv);
auto server_details = server_system.middleman().spawn_server(server1, 0);
CAF_REQUIRE(server_details);
auto& port = server_details->second;
CAF_REQUIRE_NOT_EQUAL(port, 0);
CAF_MESSAGE("server spawned at port " << port);
std::thread child{[&] {
......@@ -246,9 +246,9 @@ CAF_TEST(trigger_connection) {
CAF_TEST(trigger_acceptor) {
CAF_MESSAGE("spawn server");
uint16_t port = 0;
auto serv = server_system.middleman().spawn_server(server2, port);
CAF_REQUIRE(serv);
auto server_details = server_system.middleman().spawn_server(server2, 0);
CAF_REQUIRE(server_details);
auto& port = server_details->second;
CAF_REQUIRE_NOT_EQUAL(port, 0);
CAF_MESSAGE("server spawned at port " << port);
std::thread child{[&] {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment