int main(int argc, const char *argv[]) { LogPolicy::GetInstance().Unmute(); try { std::string ip_address; int ip_port, requested_thread_num, max_locations_map_matching; bool trial_run = false; libosrm_config lib_config; 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, max_locations_map_matching); if (init_result == INIT_OK_DO_NOT_START_ENGINE) { return 0; } if (init_result == INIT_FAILED) { return 1; } SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION; OSRM routing_machine(lib_config); RouteParameters route_parameters; route_parameters.zoom_level = 18; // no generalization route_parameters.print_instructions = true; // turn by turn instructions route_parameters.alternate_route = true; // get an alternate route, too route_parameters.geometry = true; // retrieve geometry of route route_parameters.compression = true; // polyline encoding route_parameters.check_sum = -1; // see wiki route_parameters.service = "viaroute"; // that's routing route_parameters.output_format = "json"; route_parameters.jsonp_parameter = ""; // set for jsonp wrapping route_parameters.language = ""; // unused atm // route_parameters.hints.push_back(); // see wiki, saves I/O if done properly // start_coordinate route_parameters.coordinates.emplace_back(52.519930 * COORDINATE_PRECISION, 13.438640 * COORDINATE_PRECISION); // target_coordinate route_parameters.coordinates.emplace_back(52.513191 * COORDINATE_PRECISION, 13.415852 * COORDINATE_PRECISION); osrm::json::Object json_result; const int result_code = routing_machine.RunQuery(route_parameters, json_result); SimpleLogger().Write() << "http code: " << result_code; osrm::json::render(SimpleLogger().Write(), json_result); } catch (std::exception ¤t_exception) { SimpleLogger().Write(logWARNING) << "caught exception: " << current_exception.what(); return -1; } return 0; }
int main(int argc, const char *argv[]) { try { LogPolicy::GetInstance().Unmute(); bool use_shared_memory = false, trial_run = false; std::string ip_address; int ip_port, requested_thread_num; ServerPaths server_paths; const unsigned init_result = GenerateServerProgramOptions(argc, argv, server_paths, ip_address, ip_port, requested_thread_num, use_shared_memory, trial_run); if (init_result == INIT_OK_DO_NOT_START_ENGINE) { return 0; } if (init_result == INIT_FAILED) { return 1; } #ifdef __linux__ const int lock_flags = MCL_CURRENT | MCL_FUTURE; if (-1 == mlockall(lock_flags)) { SimpleLogger().Write(logWARNING) << argv[0] << " could not be locked to RAM"; } #endif SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION << ", " << "compiled at " << __DATE__ << ", " __TIME__; if (use_shared_memory) { SimpleLogger().Write(logDEBUG) << "Loading from shared memory"; } else { SimpleLogger().Write() << "HSGR file:\t" << server_paths["hsgrdata"]; SimpleLogger().Write(logDEBUG) << "Nodes file:\t" << server_paths["nodesdata"]; SimpleLogger().Write(logDEBUG) << "Edges file:\t" << server_paths["edgesdata"]; SimpleLogger().Write(logDEBUG) << "Geometry file:\t" << server_paths["geometries"]; SimpleLogger().Write(logDEBUG) << "RAM file:\t" << server_paths["ramindex"]; SimpleLogger().Write(logDEBUG) << "Index file:\t" << server_paths["fileindex"]; SimpleLogger().Write(logDEBUG) << "Names file:\t" << server_paths["namesdata"]; SimpleLogger().Write(logDEBUG) << "Timestamp file:\t" << server_paths["timestamp"]; 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(server_paths, use_shared_memory); Server *routing_server = ServerFactory::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 { boost::thread server_thread(std::bind(&Server::Run, routing_server)); #ifndef _WIN32 sigset_t wait_mask; pthread_sigmask(SIG_SETMASK, &old_mask, 0); sigemptyset(&wait_mask); sigaddset(&wait_mask, SIGINT); sigaddset(&wait_mask, SIGQUIT); sigaddset(&wait_mask, SIGTERM); pthread_sigmask(SIG_BLOCK, &wait_mask, 0); 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"; if (!server_thread.timed_join(boost::posix_time::seconds(2))) { SimpleLogger().Write(logWARNING) << "Didn't exit within 2 seconds. Hard abort!"; } } SimpleLogger().Write() << "freeing objects"; delete routing_server; SimpleLogger().Write() << "shutdown completed"; } catch (const std::exception &e) { SimpleLogger().Write(logWARNING) << "exception: " << e.what(); return 1; } #ifdef __linux__ munlockall(); #endif return 0; }
int main(int argc, const char *argv[]) { try { LogPolicy::GetInstance().Unmute(); bool trial_run = false; std::string ip_address; int ip_port, requested_thread_num; libosrm_config lib_config; 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__ const int lock_flags = MCL_CURRENT | MCL_FUTURE; if (-1 == mlockall(lock_flags)) { SimpleLogger().Write(logWARNING) << argv[0] << " could not be locked to RAM"; } #endif SimpleLogger().Write() << "starting up engines, " << g_GIT_DESCRIPTION; 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, 0); sigemptyset(&wait_mask); sigaddset(&wait_mask, SIGINT); sigaddset(&wait_mask, SIGQUIT); sigaddset(&wait_mask, SIGTERM); pthread_sigmask(SIG_BLOCK, &wait_mask, 0); 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; } #ifdef __linux__ munlockall(); #endif return 0; }