Compare commits

..

3 Commits

Author SHA1 Message Date
Michael Krasnyk ba095c8566 Avoid using signed integers for edge IDs 2018-04-12 10:10:37 +02:00
Patrick Niklaus c1fd02bb8d Bump OSRM version to 5.16.5 2018-04-09 11:10:52 +00:00
Patrick Niklaus 54d02fac15 Simplify toEdges and make it more robust against accidental memory allocations 2018-04-09 11:09:00 +00:00
5 changed files with 31 additions and 17 deletions
+10
View File
@@ -1,3 +1,13 @@
# 5.16.6
- Changes from 5.16.5:
- Bugfixes:
- FIXED: integer overflow in `DynamicGraph::Renumber` [#5021](https://github.com/Project-OSRM/osrm-backend/pull/5021)
# 5.16.5
- Changes from 5.16.4:
- Debug:
- ADDED: Made toEdges allocation more robust and add better memory usage debugging.
# 5.16.4 # 5.16.4
- Changes from 5.16.3: - Changes from 5.16.3:
- Bugfixes: - Bugfixes:
+1 -1
View File
@@ -61,7 +61,7 @@ endif()
project(OSRM C CXX) project(OSRM C CXX)
set(OSRM_VERSION_MAJOR 5) set(OSRM_VERSION_MAJOR 5)
set(OSRM_VERSION_MINOR 16) set(OSRM_VERSION_MINOR 16)
set(OSRM_VERSION_PATCH 4) set(OSRM_VERSION_PATCH 6)
set(OSRM_VERSION "${OSRM_VERSION_MAJOR}.${OSRM_VERSION_MINOR}.${OSRM_VERSION_PATCH}") set(OSRM_VERSION "${OSRM_VERSION_MAJOR}.${OSRM_VERSION_MINOR}.${OSRM_VERSION_PATCH}")
add_definitions(-DOSRM_PROJECT_DIR="${CMAKE_CURRENT_SOURCE_DIR}") add_definitions(-DOSRM_PROJECT_DIR="${CMAKE_CURRENT_SOURCE_DIR}")
@@ -128,23 +128,24 @@ ContractorGraph toContractorGraph(NodeID number_of_nodes, InputEdgeContainer inp
template <class Edge, typename GraphT> inline std::vector<Edge> toEdges(GraphT graph) template <class Edge, typename GraphT> inline std::vector<Edge> toEdges(GraphT graph)
{ {
std::vector<Edge> edges; util::Log() << "Converting contracted graph with " << graph.GetNumberOfEdges()
edges.reserve(graph.GetNumberOfEdges()); << " to edge list (" << (graph.GetNumberOfEdges() * sizeof(Edge)) << " bytes)";
std::vector<Edge> edges(graph.GetNumberOfEdges());
util::UnbufferedLog log;
log << "Getting edges of minimized graph ";
util::Percent p(log, graph.GetNumberOfNodes());
const NodeID number_of_nodes = graph.GetNumberOfNodes();
if (graph.GetNumberOfNodes())
{ {
Edge new_edge; util::UnbufferedLog log;
log << "Getting edges of minimized graph ";
util::Percent p(log, graph.GetNumberOfNodes());
const NodeID number_of_nodes = graph.GetNumberOfNodes();
std::size_t edge_index = 0;
for (const auto node : util::irange(0u, number_of_nodes)) for (const auto node : util::irange(0u, number_of_nodes))
{ {
p.PrintStatus(node); p.PrintStatus(node);
for (auto edge : graph.GetAdjacentEdgeRange(node)) for (auto edge : graph.GetAdjacentEdgeRange(node))
{ {
const NodeID target = graph.GetTarget(edge); const NodeID target = graph.GetTarget(edge);
const ContractorGraph::EdgeData &data = graph.GetEdgeData(edge); const auto &data = graph.GetEdgeData(edge);
auto &new_edge = edges[edge_index++];
new_edge.source = node; new_edge.source = node;
new_edge.target = target; new_edge.target = target;
BOOST_ASSERT_MSG(SPECIAL_NODEID != new_edge.target, "Target id invalid"); BOOST_ASSERT_MSG(SPECIAL_NODEID != new_edge.target, "Target id invalid");
@@ -156,16 +157,12 @@ template <class Edge, typename GraphT> inline std::vector<Edge> toEdges(GraphT g
"edge id invalid"); "edge id invalid");
new_edge.data.forward = data.forward; new_edge.data.forward = data.forward;
new_edge.data.backward = data.backward; new_edge.data.backward = data.backward;
edges.push_back(new_edge);
} }
} }
BOOST_ASSERT(edge_index == edges.size());
} }
// sort and remove duplicates
tbb::parallel_sort(edges.begin(), edges.end()); tbb::parallel_sort(edges.begin(), edges.end());
auto new_end = std::unique(edges.begin(), edges.end());
edges.resize(new_end - edges.begin());
edges.shrink_to_fit();
return edges; return edges;
} }
+8 -1
View File
@@ -2,6 +2,8 @@
#define DYNAMICGRAPH_HPP #define DYNAMICGRAPH_HPP
#include "util/deallocating_vector.hpp" #include "util/deallocating_vector.hpp"
#include "util/exception.hpp"
#include "util/exception_utils.hpp"
#include "util/integer_range.hpp" #include "util/integer_range.hpp"
#include "util/permutation.hpp" #include "util/permutation.hpp"
#include "util/typedefs.hpp" #include "util/typedefs.hpp"
@@ -424,7 +426,7 @@ template <typename EdgeDataT> class DynamicGraph
util::inplacePermutation(node_array.begin(), node_array.end(), old_to_new_node); util::inplacePermutation(node_array.begin(), node_array.end(), old_to_new_node);
// Build up edge permutation // Build up edge permutation
auto new_edge_index = 0; EdgeID new_edge_index = 0;
std::vector<EdgeID> old_to_new_edge(edge_list.size(), SPECIAL_EDGEID); std::vector<EdgeID> old_to_new_edge(edge_list.size(), SPECIAL_EDGEID);
for (auto node : util::irange<NodeID>(0, number_of_nodes)) for (auto node : util::irange<NodeID>(0, number_of_nodes))
{ {
@@ -432,6 +434,11 @@ template <typename EdgeDataT> class DynamicGraph
// move all filled edges // move all filled edges
for (auto edge : GetAdjacentEdgeRange(node)) for (auto edge : GetAdjacentEdgeRange(node))
{ {
if (new_edge_index == std::numeric_limits<EdgeID>::max())
{
throw util::exception("There are too many edges, OSRM only supports 2^32" +
SOURCE_REF);
}
edge_list[edge].target = old_to_new_node[edge_list[edge].target]; edge_list[edge].target = old_to_new_node[edge_list[edge].target];
BOOST_ASSERT(edge_list[edge].target != SPECIAL_NODEID); BOOST_ASSERT(edge_list[edge].target != SPECIAL_NODEID);
old_to_new_edge[edge] = new_edge_index++; old_to_new_edge[edge] = new_edge_index++;
+1 -1
View File
@@ -1,6 +1,6 @@
{ {
"name": "osrm", "name": "osrm",
"version": "5.16.4", "version": "5.16.6",
"private": false, "private": false,
"description": "The Open Source Routing Machine is a high performance routing engine written in C++14 designed to run on OpenStreetMap data.", "description": "The Open Source Routing Machine is a high performance routing engine written in C++14 designed to run on OpenStreetMap data.",
"dependencies": { "dependencies": {