Migrate to modern TBB version (#6300)
This commit is contained in:
committed by
GitHub
parent
a98074a051
commit
91895604c9
@@ -11,12 +11,15 @@
|
||||
#include <boost/iterator/iterator_facade.hpp>
|
||||
#include <boost/iterator/reverse_iterator.hpp>
|
||||
|
||||
#include <tbb/atomic.h>
|
||||
|
||||
#include <array>
|
||||
#include <cmath>
|
||||
#include <vector>
|
||||
|
||||
#if defined(_MSC_VER)
|
||||
// for `InterlockedCompareExchange64`
|
||||
#include <windows.h>
|
||||
#endif
|
||||
|
||||
namespace osrm
|
||||
{
|
||||
namespace util
|
||||
@@ -89,6 +92,19 @@ inline WordT set_upper_value(WordT word, WordT mask, std::uint8_t offset, T valu
|
||||
return (word & ~mask) | ((static_cast<WordT>(value) >> offset) & mask);
|
||||
}
|
||||
|
||||
inline bool compare_and_swap(uint64_t *ptr, uint64_t old_value, uint64_t new_value)
|
||||
{
|
||||
#if defined(_MSC_VER)
|
||||
return InterlockedCompareExchange64(reinterpret_cast<LONG64 *>(ptr),
|
||||
static_cast<LONG64>(new_value),
|
||||
static_cast<LONG64>(old_value)) == old_value;
|
||||
#elif defined(__GNUC__)
|
||||
return __sync_bool_compare_and_swap(ptr, old_value, new_value);
|
||||
#else
|
||||
#error "Unsupported compiler";
|
||||
#endif
|
||||
}
|
||||
|
||||
template <typename T, std::size_t Bits, storage::Ownership Ownership> class PackedVector
|
||||
{
|
||||
using WordT = std::uint64_t;
|
||||
@@ -527,8 +543,7 @@ template <typename T, std::size_t Bits, storage::Ownership Ownership> class Pack
|
||||
lower_mask[internal_index.element],
|
||||
lower_offset[internal_index.element],
|
||||
value);
|
||||
} while (tbb::internal::as_atomic(lower_word)
|
||||
.compare_and_swap(new_lower_word, local_lower_word) != local_lower_word);
|
||||
} while (!compare_and_swap(&lower_word, local_lower_word, new_lower_word));
|
||||
|
||||
// Lock-free update of the upper word
|
||||
WordT local_upper_word, new_upper_word;
|
||||
@@ -539,8 +554,7 @@ template <typename T, std::size_t Bits, storage::Ownership Ownership> class Pack
|
||||
upper_mask[internal_index.element],
|
||||
upper_offset[internal_index.element],
|
||||
value);
|
||||
} while (tbb::internal::as_atomic(upper_word)
|
||||
.compare_and_swap(new_upper_word, local_upper_word) != local_upper_word);
|
||||
} while (!compare_and_swap(&upper_word, local_upper_word, new_upper_word));
|
||||
}
|
||||
|
||||
util::ViewOrVector<WordT, Ownership> vec;
|
||||
|
||||
Reference in New Issue
Block a user