Parallelize generation of the edge-expanded-edges.
This commit is contained in:
committed by
Patrick Niklaus
parent
b68d79407e
commit
35550d8c0a
@@ -0,0 +1,57 @@
|
||||
#ifndef CONCURRENT_ID_MAP_HPP
|
||||
#define CONCURRENT_ID_MAP_HPP
|
||||
|
||||
#include <boost/interprocess/sync/interprocess_upgradable_mutex.hpp>
|
||||
#include <boost/interprocess/sync/scoped_lock.hpp>
|
||||
#include <boost/interprocess/sync/sharable_lock.hpp>
|
||||
|
||||
#include <unordered_map>
|
||||
|
||||
namespace osrm
|
||||
{
|
||||
namespace util
|
||||
{
|
||||
|
||||
/**
|
||||
* This is a special purpose map for caching incrementing IDs
|
||||
*/
|
||||
template <typename KeyType, typename ValueType, typename HashType = std::hash<KeyType>>
|
||||
struct ConcurrentIDMap
|
||||
{
|
||||
static_assert(std::is_unsigned<ValueType>::value, "Only unsigned integer types are supported.");
|
||||
|
||||
using UpgradableMutex = boost::interprocess::interprocess_upgradable_mutex;
|
||||
using ScopedReaderLock = boost::interprocess::sharable_lock<UpgradableMutex>;
|
||||
using ScopedWriterLock = boost::interprocess::scoped_lock<UpgradableMutex>;
|
||||
|
||||
std::unordered_map<KeyType, ValueType, HashType> data;
|
||||
mutable UpgradableMutex mutex;
|
||||
|
||||
const ValueType ConcurrentFindOrAdd(const KeyType &key)
|
||||
{
|
||||
{
|
||||
ScopedReaderLock sentry{mutex};
|
||||
const auto result = data.find(key);
|
||||
if (result != data.end())
|
||||
{
|
||||
return result->second;
|
||||
}
|
||||
}
|
||||
{
|
||||
ScopedWriterLock sentry{mutex};
|
||||
const auto result = data.find(key);
|
||||
if (result != data.end())
|
||||
{
|
||||
return result->second;
|
||||
}
|
||||
const auto id = static_cast<ValueType>(data.size());
|
||||
data[key] = id;
|
||||
return id;
|
||||
}
|
||||
}
|
||||
};
|
||||
|
||||
} // util
|
||||
} // osrm
|
||||
|
||||
#endif // CONCURRENT_ID_MAP_HPP
|
||||
@@ -7,6 +7,7 @@
|
||||
#include <unordered_map>
|
||||
#include <vector>
|
||||
|
||||
#include "util/concurrent_id_map.hpp"
|
||||
#include "util/typedefs.hpp"
|
||||
|
||||
#include <boost/functional/hash.hpp>
|
||||
@@ -97,7 +98,7 @@ class LaneTupleIdPair
|
||||
}
|
||||
};
|
||||
|
||||
using LaneDataIdMap = std::unordered_map<LaneTupleIdPair, LaneDataID, boost::hash<LaneTupleIdPair>>;
|
||||
using LaneDataIdMap = ConcurrentIDMap<LaneTupleIdPair, LaneDataID, boost::hash<LaneTupleIdPair>>;
|
||||
|
||||
} // namespace guidance
|
||||
} // namespace util
|
||||
|
||||
Reference in New Issue
Block a user