shared lock for reads and unique lock for writes declare cache as object and not pointer in serach engine data to simulate singleton declaration put a lock infront of the clear function to make it threadsafe remove clear function from cache because cache will never get dropped unit tests unit tests and timestamp as part of key cache generations hash the key 500 mb 1000 mb 250 mb rebase against implement-cache
123 lines
4.0 KiB
C++
123 lines
4.0 KiB
C++
#ifndef SEARCH_ENGINE_DATA_HPP
|
|
#define SEARCH_ENGINE_DATA_HPP
|
|
|
|
#include "engine/algorithm.hpp"
|
|
#include "engine/unpacking_cache.hpp"
|
|
#include "util/query_heap.hpp"
|
|
#include "util/typedefs.hpp"
|
|
|
|
// #include <boost/thread/tss.hpp>
|
|
#include <boost/thread.hpp>
|
|
|
|
namespace osrm
|
|
{
|
|
namespace engine
|
|
{
|
|
|
|
// Algorithm-dependent heaps
|
|
// - CH algorithms use CH heaps
|
|
// - CoreCH algorithms use CH
|
|
// - MLD algorithms use MLD heaps
|
|
|
|
template <typename Algorithm> struct SearchEngineData
|
|
{
|
|
};
|
|
|
|
struct HeapData
|
|
{
|
|
NodeID parent;
|
|
/* explicit */ HeapData(NodeID p) : parent(p) {}
|
|
};
|
|
|
|
struct ManyToManyHeapData : HeapData
|
|
{
|
|
EdgeWeight duration;
|
|
ManyToManyHeapData(NodeID p, EdgeWeight duration) : HeapData(p), duration(duration) {}
|
|
};
|
|
|
|
template <> struct SearchEngineData<routing_algorithms::ch::Algorithm>
|
|
{
|
|
using QueryHeap = util::
|
|
QueryHeap<NodeID, NodeID, EdgeWeight, HeapData, util::UnorderedMapStorage<NodeID, int>>;
|
|
|
|
using ManyToManyQueryHeap = util::QueryHeap<NodeID,
|
|
NodeID,
|
|
EdgeWeight,
|
|
ManyToManyHeapData,
|
|
util::UnorderedMapStorage<NodeID, int>>;
|
|
|
|
using SearchEngineHeapPtr = boost::thread_specific_ptr<QueryHeap>;
|
|
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>;
|
|
|
|
static SearchEngineHeapPtr forward_heap_1;
|
|
static SearchEngineHeapPtr reverse_heap_1;
|
|
static SearchEngineHeapPtr forward_heap_2;
|
|
static SearchEngineHeapPtr reverse_heap_2;
|
|
static SearchEngineHeapPtr forward_heap_3;
|
|
static SearchEngineHeapPtr reverse_heap_3;
|
|
static ManyToManyHeapPtr many_to_many_heap;
|
|
|
|
static UnpackingCache unpacking_cache;
|
|
|
|
void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes);
|
|
|
|
void InitializeOrClearSecondThreadLocalStorage(unsigned number_of_nodes);
|
|
|
|
void InitializeOrClearThirdThreadLocalStorage(unsigned number_of_nodes);
|
|
|
|
void InitializeOrClearManyToManyThreadLocalStorage(unsigned number_of_nodes);
|
|
};
|
|
|
|
struct MultiLayerDijkstraHeapData
|
|
{
|
|
NodeID parent;
|
|
bool from_clique_arc;
|
|
MultiLayerDijkstraHeapData(NodeID p) : parent(p), from_clique_arc(false) {}
|
|
MultiLayerDijkstraHeapData(NodeID p, bool from) : parent(p), from_clique_arc(from) {}
|
|
};
|
|
|
|
struct ManyToManyMultiLayerDijkstraHeapData : MultiLayerDijkstraHeapData
|
|
{
|
|
EdgeWeight duration;
|
|
ManyToManyMultiLayerDijkstraHeapData(NodeID p, EdgeWeight duration)
|
|
: MultiLayerDijkstraHeapData(p), duration(duration)
|
|
{
|
|
}
|
|
ManyToManyMultiLayerDijkstraHeapData(NodeID p, bool from, EdgeWeight duration)
|
|
: MultiLayerDijkstraHeapData(p, from), duration(duration)
|
|
{
|
|
}
|
|
};
|
|
|
|
template <> struct SearchEngineData<routing_algorithms::mld::Algorithm>
|
|
{
|
|
using QueryHeap = util::QueryHeap<NodeID,
|
|
NodeID,
|
|
EdgeWeight,
|
|
MultiLayerDijkstraHeapData,
|
|
util::TwoLevelStorage<NodeID, int>>;
|
|
|
|
using ManyToManyQueryHeap = util::QueryHeap<NodeID,
|
|
NodeID,
|
|
EdgeWeight,
|
|
ManyToManyMultiLayerDijkstraHeapData,
|
|
util::TwoLevelStorage<NodeID, int>>;
|
|
|
|
using SearchEngineHeapPtr = boost::thread_specific_ptr<QueryHeap>;
|
|
using ManyToManyHeapPtr = boost::thread_specific_ptr<ManyToManyQueryHeap>;
|
|
|
|
static SearchEngineHeapPtr forward_heap_1;
|
|
static SearchEngineHeapPtr reverse_heap_1;
|
|
static ManyToManyHeapPtr many_to_many_heap;
|
|
|
|
void InitializeOrClearFirstThreadLocalStorage(unsigned number_of_nodes,
|
|
unsigned number_of_boundary_nodes);
|
|
|
|
void InitializeOrClearManyToManyThreadLocalStorage(unsigned number_of_nodes,
|
|
unsigned number_of_boundary_nodes);
|
|
};
|
|
}
|
|
}
|
|
|
|
#endif // SEARCH_ENGINE_DATA_HPP
|