Flatten routed by using functional try-catch blocks
This commit is contained in:
parent
e75be68466
commit
f7a1e2f652
237
routed.cpp
237
routed.cpp
@ -63,132 +63,127 @@ BOOL WINAPI console_ctrl_handler(DWORD ctrl_type)
|
|||||||
}
|
}
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
int main(int argc, const char *argv[])
|
int main(int argc, const char *argv[]) try
|
||||||
{
|
{
|
||||||
try
|
LogPolicy::GetInstance().Unmute();
|
||||||
|
|
||||||
|
bool trial_run = false;
|
||||||
|
std::string ip_address;
|
||||||
|
int ip_port, requested_thread_num;
|
||||||
|
|
||||||
|
libosrm_config lib_config;
|
||||||
|
// make the behaviour of routed backward compatible
|
||||||
|
lib_config.use_shared_memory = false;
|
||||||
|
|
||||||
|
const unsigned init_result = GenerateServerProgramOptions(
|
||||||
|
argc, argv, lib_config.server_paths, ip_address, ip_port, requested_thread_num,
|
||||||
|
lib_config.use_shared_memory, trial_run, lib_config.max_locations_distance_table,
|
||||||
|
lib_config.max_locations_map_matching);
|
||||||
|
if (init_result == INIT_OK_DO_NOT_START_ENGINE)
|
||||||
{
|
{
|
||||||
LogPolicy::GetInstance().Unmute();
|
return 0;
|
||||||
|
|
||||||
bool trial_run = false;
|
|
||||||
std::string ip_address;
|
|
||||||
int ip_port, requested_thread_num;
|
|
||||||
|
|
||||||
libosrm_config lib_config;
|
|
||||||
// make the behaviour of routed backward compatible
|
|
||||||
lib_config.use_shared_memory = false;
|
|
||||||
|
|
||||||
const unsigned init_result = GenerateServerProgramOptions(
|
|
||||||
argc, argv, lib_config.server_paths, ip_address, ip_port, requested_thread_num,
|
|
||||||
lib_config.use_shared_memory, trial_run, lib_config.max_locations_distance_table,
|
|
||||||
lib_config.max_locations_map_matching);
|
|
||||||
if (init_result == INIT_OK_DO_NOT_START_ENGINE)
|
|
||||||
{
|
|
||||||
return 0;
|
|
||||||
}
|
|
||||||
if (init_result == INIT_FAILED)
|
|
||||||
{
|
|
||||||
return 1;
|
|
||||||
}
|
|
||||||
|
|
||||||
#ifdef __linux__
|
|
||||||
struct MemoryLocker final
|
|
||||||
{
|
|
||||||
explicit MemoryLocker(bool shouldLock_) : shouldLock(shouldLock_)
|
|
||||||
{
|
|
||||||
if (-1 == mlockall(MCL_CURRENT | MCL_FUTURE))
|
|
||||||
{
|
|
||||||
couldLock = false;
|
|
||||||
SimpleLogger().Write(logWARNING) << "memory could not be locked to RAM";
|
|
||||||
}
|
|
||||||
}
|
|
||||||
~MemoryLocker()
|
|
||||||
{
|
|
||||||
if (couldLock)
|
|
||||||
(void)munlockall();
|
|
||||||
}
|
|
||||||
bool shouldLock = false, couldLock = false;
|
|
||||||
} memoryLocker(lib_config.use_shared_memory);
|
|
||||||
#endif
|
|
||||||
SimpleLogger().Write() << "starting up engines, " << OSRM_VERSION;
|
|
||||||
|
|
||||||
if (lib_config.use_shared_memory)
|
|
||||||
{
|
|
||||||
SimpleLogger().Write(logDEBUG) << "Loading from shared memory";
|
|
||||||
}
|
|
||||||
|
|
||||||
SimpleLogger().Write(logDEBUG) << "Threads:\t" << requested_thread_num;
|
|
||||||
SimpleLogger().Write(logDEBUG) << "IP address:\t" << ip_address;
|
|
||||||
SimpleLogger().Write(logDEBUG) << "IP port:\t" << ip_port;
|
|
||||||
#ifndef _WIN32
|
|
||||||
int sig = 0;
|
|
||||||
sigset_t new_mask;
|
|
||||||
sigset_t old_mask;
|
|
||||||
sigfillset(&new_mask);
|
|
||||||
pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask);
|
|
||||||
#endif
|
|
||||||
|
|
||||||
OSRM osrm_lib(lib_config);
|
|
||||||
auto routing_server = Server::CreateServer(ip_address, ip_port, requested_thread_num);
|
|
||||||
|
|
||||||
routing_server->GetRequestHandlerPtr().RegisterRoutingMachine(&osrm_lib);
|
|
||||||
|
|
||||||
if (trial_run)
|
|
||||||
{
|
|
||||||
SimpleLogger().Write() << "trial run, quitting after successful initialization";
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
std::packaged_task<int()> server_task([&]() -> int
|
|
||||||
{
|
|
||||||
routing_server->Run();
|
|
||||||
return 0;
|
|
||||||
});
|
|
||||||
auto future = server_task.get_future();
|
|
||||||
std::thread server_thread(std::move(server_task));
|
|
||||||
|
|
||||||
#ifndef _WIN32
|
|
||||||
sigset_t wait_mask;
|
|
||||||
pthread_sigmask(SIG_SETMASK, &old_mask, nullptr);
|
|
||||||
sigemptyset(&wait_mask);
|
|
||||||
sigaddset(&wait_mask, SIGINT);
|
|
||||||
sigaddset(&wait_mask, SIGQUIT);
|
|
||||||
sigaddset(&wait_mask, SIGTERM);
|
|
||||||
pthread_sigmask(SIG_BLOCK, &wait_mask, nullptr);
|
|
||||||
SimpleLogger().Write() << "running and waiting for requests";
|
|
||||||
sigwait(&wait_mask, &sig);
|
|
||||||
#else
|
|
||||||
// Set console control handler to allow server to be stopped.
|
|
||||||
console_ctrl_function = std::bind(&Server::Stop, routing_server);
|
|
||||||
SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
|
|
||||||
SimpleLogger().Write() << "running and waiting for requests";
|
|
||||||
routing_server->Run();
|
|
||||||
#endif
|
|
||||||
SimpleLogger().Write() << "initiating shutdown";
|
|
||||||
routing_server->Stop();
|
|
||||||
SimpleLogger().Write() << "stopping threads";
|
|
||||||
|
|
||||||
auto status = future.wait_for(std::chrono::seconds(2));
|
|
||||||
|
|
||||||
if (status == std::future_status::ready)
|
|
||||||
{
|
|
||||||
server_thread.join();
|
|
||||||
}
|
|
||||||
else
|
|
||||||
{
|
|
||||||
SimpleLogger().Write(logWARNING) << "Didn't exit within 2 seconds. Hard abort!";
|
|
||||||
server_task.reset(); // just kill it
|
|
||||||
}
|
|
||||||
}
|
|
||||||
|
|
||||||
SimpleLogger().Write() << "freeing objects";
|
|
||||||
routing_server.reset();
|
|
||||||
SimpleLogger().Write() << "shutdown completed";
|
|
||||||
}
|
}
|
||||||
catch (const std::exception &e)
|
if (init_result == INIT_FAILED)
|
||||||
{
|
{
|
||||||
SimpleLogger().Write(logWARNING) << "exception: " << e.what();
|
|
||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
return 0;
|
#ifdef __linux__
|
||||||
|
struct MemoryLocker final
|
||||||
|
{
|
||||||
|
explicit MemoryLocker(bool shouldLock_) : shouldLock(shouldLock_)
|
||||||
|
{
|
||||||
|
if (-1 == mlockall(MCL_CURRENT | MCL_FUTURE))
|
||||||
|
{
|
||||||
|
couldLock = false;
|
||||||
|
SimpleLogger().Write(logWARNING) << "memory could not be locked to RAM";
|
||||||
|
}
|
||||||
|
}
|
||||||
|
~MemoryLocker()
|
||||||
|
{
|
||||||
|
if (couldLock)
|
||||||
|
(void)munlockall();
|
||||||
|
}
|
||||||
|
bool shouldLock = false, couldLock = false;
|
||||||
|
} memoryLocker(lib_config.use_shared_memory);
|
||||||
|
#endif
|
||||||
|
SimpleLogger().Write() << "starting up engines, " << OSRM_VERSION;
|
||||||
|
|
||||||
|
if (lib_config.use_shared_memory)
|
||||||
|
{
|
||||||
|
SimpleLogger().Write(logDEBUG) << "Loading from shared memory";
|
||||||
|
}
|
||||||
|
|
||||||
|
SimpleLogger().Write(logDEBUG) << "Threads:\t" << requested_thread_num;
|
||||||
|
SimpleLogger().Write(logDEBUG) << "IP address:\t" << ip_address;
|
||||||
|
SimpleLogger().Write(logDEBUG) << "IP port:\t" << ip_port;
|
||||||
|
#ifndef _WIN32
|
||||||
|
int sig = 0;
|
||||||
|
sigset_t new_mask;
|
||||||
|
sigset_t old_mask;
|
||||||
|
sigfillset(&new_mask);
|
||||||
|
pthread_sigmask(SIG_BLOCK, &new_mask, &old_mask);
|
||||||
|
#endif
|
||||||
|
|
||||||
|
OSRM osrm_lib(lib_config);
|
||||||
|
auto routing_server = Server::CreateServer(ip_address, ip_port, requested_thread_num);
|
||||||
|
|
||||||
|
routing_server->GetRequestHandlerPtr().RegisterRoutingMachine(&osrm_lib);
|
||||||
|
|
||||||
|
if (trial_run)
|
||||||
|
{
|
||||||
|
SimpleLogger().Write() << "trial run, quitting after successful initialization";
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
std::packaged_task<int()> server_task([&]() -> int
|
||||||
|
{
|
||||||
|
routing_server->Run();
|
||||||
|
return 0;
|
||||||
|
});
|
||||||
|
auto future = server_task.get_future();
|
||||||
|
std::thread server_thread(std::move(server_task));
|
||||||
|
|
||||||
|
#ifndef _WIN32
|
||||||
|
sigset_t wait_mask;
|
||||||
|
pthread_sigmask(SIG_SETMASK, &old_mask, nullptr);
|
||||||
|
sigemptyset(&wait_mask);
|
||||||
|
sigaddset(&wait_mask, SIGINT);
|
||||||
|
sigaddset(&wait_mask, SIGQUIT);
|
||||||
|
sigaddset(&wait_mask, SIGTERM);
|
||||||
|
pthread_sigmask(SIG_BLOCK, &wait_mask, nullptr);
|
||||||
|
SimpleLogger().Write() << "running and waiting for requests";
|
||||||
|
sigwait(&wait_mask, &sig);
|
||||||
|
#else
|
||||||
|
// Set console control handler to allow server to be stopped.
|
||||||
|
console_ctrl_function = std::bind(&Server::Stop, routing_server);
|
||||||
|
SetConsoleCtrlHandler(console_ctrl_handler, TRUE);
|
||||||
|
SimpleLogger().Write() << "running and waiting for requests";
|
||||||
|
routing_server->Run();
|
||||||
|
#endif
|
||||||
|
SimpleLogger().Write() << "initiating shutdown";
|
||||||
|
routing_server->Stop();
|
||||||
|
SimpleLogger().Write() << "stopping threads";
|
||||||
|
|
||||||
|
auto status = future.wait_for(std::chrono::seconds(2));
|
||||||
|
|
||||||
|
if (status == std::future_status::ready)
|
||||||
|
{
|
||||||
|
server_thread.join();
|
||||||
|
}
|
||||||
|
else
|
||||||
|
{
|
||||||
|
SimpleLogger().Write(logWARNING) << "Didn't exit within 2 seconds. Hard abort!";
|
||||||
|
server_task.reset(); // just kill it
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
|
SimpleLogger().Write() << "freeing objects";
|
||||||
|
routing_server.reset();
|
||||||
|
SimpleLogger().Write() << "shutdown completed";
|
||||||
|
}
|
||||||
|
catch (const std::exception &e)
|
||||||
|
{
|
||||||
|
SimpleLogger().Write(logWARNING) << "exception: " << e.what();
|
||||||
|
return 1;
|
||||||
}
|
}
|
||||||
|
Loading…
Reference in New Issue
Block a user