Adds runtime alignment assertions, see #3267
This commit is contained in:
parent
7dea7476f1
commit
559c88b36d
@ -106,6 +106,7 @@ struct DataLayout
|
|||||||
|
|
||||||
template <typename T> inline void SetBlockSize(BlockID bid, uint64_t entries)
|
template <typename T> inline void SetBlockSize(BlockID bid, uint64_t entries)
|
||||||
{
|
{
|
||||||
|
static_assert(sizeof(T) % alignof(T) == 0, "aligned T* can't be used as an array pointer");
|
||||||
num_entries[bid] = entries;
|
num_entries[bid] = entries;
|
||||||
entry_size[bid] = sizeof(T);
|
entry_size[bid] = sizeof(T);
|
||||||
entry_align[bid] = alignof(T);
|
entry_align[bid] = alignof(T);
|
||||||
|
@ -373,7 +373,9 @@ class StaticRTree
|
|||||||
{
|
{
|
||||||
m_leaves_region.open(leaf_file);
|
m_leaves_region.open(leaf_file);
|
||||||
std::size_t num_leaves = m_leaves_region.size() / sizeof(LeafNode);
|
std::size_t num_leaves = m_leaves_region.size() / sizeof(LeafNode);
|
||||||
m_leaves.reset(reinterpret_cast<const LeafNode *>(m_leaves_region.data()), num_leaves);
|
auto data_ptr = m_leaves_region.data();
|
||||||
|
BOOST_ASSERT(reinterpret_cast<uintptr_t>(data_ptr) % alignof(LeafNode) == 0);
|
||||||
|
m_leaves.reset(reinterpret_cast<const LeafNode *>(data_ptr), num_leaves);
|
||||||
}
|
}
|
||||||
catch (const std::exception &exc)
|
catch (const std::exception &exc)
|
||||||
{
|
{
|
||||||
|
@ -69,6 +69,15 @@ template <> struct hash<std::tuple<OSMNodeID, OSMNodeID, OSMNodeID>>
|
|||||||
};
|
};
|
||||||
}
|
}
|
||||||
|
|
||||||
|
namespace
|
||||||
|
{
|
||||||
|
template <typename T> inline bool is_aligned(const void *pointer)
|
||||||
|
{
|
||||||
|
static_assert(sizeof(T) % alignof(T) == 0, "pointer can not be used as an array pointer");
|
||||||
|
return reinterpret_cast<uintptr_t>(pointer) % alignof(T) == 0;
|
||||||
|
}
|
||||||
|
}
|
||||||
|
|
||||||
namespace osrm
|
namespace osrm
|
||||||
{
|
{
|
||||||
namespace contractor
|
namespace contractor
|
||||||
@ -571,6 +580,7 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
|||||||
};
|
};
|
||||||
#pragma pack(pop, r1)
|
#pragma pack(pop, r1)
|
||||||
|
|
||||||
|
BOOST_ASSERT(is_aligned<EdgeBasedGraphHeader>(edge_based_graph_region.get_address()));
|
||||||
const EdgeBasedGraphHeader graph_header =
|
const EdgeBasedGraphHeader graph_header =
|
||||||
*(reinterpret_cast<const EdgeBasedGraphHeader *>(edge_based_graph_region.get_address()));
|
*(reinterpret_cast<const EdgeBasedGraphHeader *>(edge_based_graph_region.get_address()));
|
||||||
|
|
||||||
@ -669,6 +679,7 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
|||||||
|
|
||||||
auto region = mmap_file(rtree_leaf_filename.c_str());
|
auto region = mmap_file(rtree_leaf_filename.c_str());
|
||||||
region.advise(mapped_region::advice_willneed);
|
region.advise(mapped_region::advice_willneed);
|
||||||
|
BOOST_ASSERT(is_aligned<LeafNode>(region.get_address()));
|
||||||
|
|
||||||
const auto bytes = region.get_size();
|
const auto bytes = region.get_size();
|
||||||
const auto first = static_cast<const LeafNode *>(region.get_address());
|
const auto first = static_cast<const LeafNode *>(region.get_address());
|
||||||
@ -850,16 +861,20 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
|||||||
|
|
||||||
auto penaltyblock = reinterpret_cast<const extractor::lookup::PenaltyBlock *>(
|
auto penaltyblock = reinterpret_cast<const extractor::lookup::PenaltyBlock *>(
|
||||||
edge_penalty_region.get_address());
|
edge_penalty_region.get_address());
|
||||||
auto edge_segment_byte_ptr = reinterpret_cast<const char *>(edge_segment_region.get_address());
|
BOOST_ASSERT(is_aligned<extractor::lookup::PenaltyBlock>(penaltyblock));
|
||||||
|
|
||||||
auto edge_based_edge_ptr = reinterpret_cast<extractor::EdgeBasedEdge *>(
|
auto edge_based_edge_ptr = reinterpret_cast<extractor::EdgeBasedEdge *>(
|
||||||
reinterpret_cast<char *>(edge_based_graph_region.get_address()) +
|
reinterpret_cast<char *>(edge_based_graph_region.get_address()) +
|
||||||
sizeof(EdgeBasedGraphHeader));
|
sizeof(EdgeBasedGraphHeader));
|
||||||
|
BOOST_ASSERT(is_aligned<extractor::EdgeBasedEdge>(edge_based_edge_ptr));
|
||||||
|
|
||||||
const auto edge_based_edge_last = reinterpret_cast<extractor::EdgeBasedEdge *>(
|
const auto edge_based_edge_last = reinterpret_cast<extractor::EdgeBasedEdge *>(
|
||||||
reinterpret_cast<char *>(edge_based_graph_region.get_address()) +
|
reinterpret_cast<char *>(edge_based_graph_region.get_address()) +
|
||||||
sizeof(EdgeBasedGraphHeader) +
|
sizeof(EdgeBasedGraphHeader) +
|
||||||
sizeof(extractor::EdgeBasedEdge) * graph_header.number_of_edges);
|
sizeof(extractor::EdgeBasedEdge) * graph_header.number_of_edges);
|
||||||
|
|
||||||
|
auto edge_segment_byte_ptr = reinterpret_cast<const char *>(edge_segment_region.get_address());
|
||||||
|
|
||||||
while (edge_based_edge_ptr != edge_based_edge_last)
|
while (edge_based_edge_ptr != edge_based_edge_last)
|
||||||
{
|
{
|
||||||
// Make a copy of the data from the memory map
|
// Make a copy of the data from the memory map
|
||||||
@ -869,8 +884,10 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
|||||||
if (update_edge_weights || update_turn_penalties)
|
if (update_edge_weights || update_turn_penalties)
|
||||||
{
|
{
|
||||||
bool skip_this_edge = false;
|
bool skip_this_edge = false;
|
||||||
|
|
||||||
auto header = reinterpret_cast<const extractor::lookup::SegmentHeaderBlock *>(
|
auto header = reinterpret_cast<const extractor::lookup::SegmentHeaderBlock *>(
|
||||||
edge_segment_byte_ptr);
|
edge_segment_byte_ptr);
|
||||||
|
BOOST_ASSERT(is_aligned<extractor::lookup::SegmentHeaderBlock>(header));
|
||||||
edge_segment_byte_ptr += sizeof(extractor::lookup::SegmentHeaderBlock);
|
edge_segment_byte_ptr += sizeof(extractor::lookup::SegmentHeaderBlock);
|
||||||
|
|
||||||
auto previous_osm_node_id = header->previous_osm_node_id;
|
auto previous_osm_node_id = header->previous_osm_node_id;
|
||||||
@ -879,6 +896,7 @@ EdgeID Contractor::LoadEdgeExpandedGraph(
|
|||||||
|
|
||||||
auto segmentblocks =
|
auto segmentblocks =
|
||||||
reinterpret_cast<const extractor::lookup::SegmentBlock *>(edge_segment_byte_ptr);
|
reinterpret_cast<const extractor::lookup::SegmentBlock *>(edge_segment_byte_ptr);
|
||||||
|
BOOST_ASSERT(is_aligned<extractor::lookup::SegmentBlock>(segmentblocks));
|
||||||
edge_segment_byte_ptr +=
|
edge_segment_byte_ptr +=
|
||||||
sizeof(extractor::lookup::SegmentBlock) * (header->num_osm_nodes - 1);
|
sizeof(extractor::lookup::SegmentBlock) * (header->num_osm_nodes - 1);
|
||||||
|
|
||||||
|
Loading…
Reference in New Issue
Block a user