Migrate to modern TBB version (#6300)

This commit is contained in:
Siarhei Fedartsou
2022-08-24 18:13:49 +02:00
committed by GitHub
parent a98074a051
commit 91895604c9
18 changed files with 586 additions and 718 deletions
+20 -6
View File
@@ -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;