mirror of
https://github.com/simdjson/simdjson
synced 2026-06-08 17:27:07 +00:00
Fixes https://github.com/simdjson/simdjson/issues/1771 Co-authored-by: Hao Chen <chenhao.yalier@gmail.com>
This commit is contained in:
+56
-29
@@ -15,19 +15,34 @@ namespace internal {
|
||||
// without requiring a static initializer.
|
||||
|
||||
#if SIMDJSON_IMPLEMENTATION_HASWELL
|
||||
const haswell::implementation haswell_singleton{};
|
||||
static const haswell::implementation* get_haswell_singleton() {
|
||||
static const haswell::implementation haswell_singleton{};
|
||||
return &haswell_singleton;
|
||||
}
|
||||
#endif
|
||||
#if SIMDJSON_IMPLEMENTATION_WESTMERE
|
||||
const westmere::implementation westmere_singleton{};
|
||||
static const westmere::implementation* get_westmere_singleton() {
|
||||
static const westmere::implementation westmere_singleton{};
|
||||
return &westmere_singleton;
|
||||
}
|
||||
#endif // SIMDJSON_IMPLEMENTATION_WESTMERE
|
||||
#if SIMDJSON_IMPLEMENTATION_ARM64
|
||||
const arm64::implementation arm64_singleton{};
|
||||
static const arm64::implementation* get_arm64_singleton() {
|
||||
static const arm64::implementation arm64_singleton{};
|
||||
return &arm64_singleton;
|
||||
}
|
||||
#endif // SIMDJSON_IMPLEMENTATION_ARM64
|
||||
#if SIMDJSON_IMPLEMENTATION_PPC64
|
||||
const ppc64::implementation ppc64_singleton{};
|
||||
static const ppc64::implementation* get_ppc64_singleton() {
|
||||
static const ppc64::implementation ppc64_singleton{};
|
||||
return &ppc64_singleton;
|
||||
}
|
||||
#endif // SIMDJSON_IMPLEMENTATION_PPC64
|
||||
#if SIMDJSON_IMPLEMENTATION_FALLBACK
|
||||
const fallback::implementation fallback_singleton{};
|
||||
static const fallback::implementation* get_fallback_singleton() {
|
||||
static const fallback::implementation fallback_singleton{};
|
||||
return &fallback_singleton;
|
||||
}
|
||||
#endif // SIMDJSON_IMPLEMENTATION_FALLBACK
|
||||
|
||||
/**
|
||||
@@ -56,25 +71,26 @@ private:
|
||||
const implementation *set_best() const noexcept;
|
||||
};
|
||||
|
||||
const detect_best_supported_implementation_on_first_use detect_best_supported_implementation_on_first_use_singleton;
|
||||
|
||||
const std::initializer_list<const implementation *> available_implementation_pointers {
|
||||
static const std::initializer_list<const implementation *>& get_available_implementation_pointers() {
|
||||
static const std::initializer_list<const implementation *> available_implementation_pointers {
|
||||
#if SIMDJSON_IMPLEMENTATION_HASWELL
|
||||
&haswell_singleton,
|
||||
get_haswell_singleton(),
|
||||
#endif
|
||||
#if SIMDJSON_IMPLEMENTATION_WESTMERE
|
||||
&westmere_singleton,
|
||||
get_westmere_singleton(),
|
||||
#endif
|
||||
#if SIMDJSON_IMPLEMENTATION_ARM64
|
||||
&arm64_singleton,
|
||||
get_arm64_singleton(),
|
||||
#endif
|
||||
#if SIMDJSON_IMPLEMENTATION_PPC64
|
||||
&ppc64_singleton,
|
||||
get_ppc64_singleton(),
|
||||
#endif
|
||||
#if SIMDJSON_IMPLEMENTATION_FALLBACK
|
||||
&fallback_singleton,
|
||||
get_fallback_singleton(),
|
||||
#endif
|
||||
}; // available_implementation_pointers
|
||||
}; // available_implementation_pointers
|
||||
return available_implementation_pointers;
|
||||
}
|
||||
|
||||
// So we can return UNSUPPORTED_ARCHITECTURE from the parser when there is no support
|
||||
class unsupported_implementation final : public implementation {
|
||||
@@ -102,25 +118,28 @@ public:
|
||||
unsupported_implementation() : implementation("unsupported", "Unsupported CPU (no detected SIMD instructions)", 0) {}
|
||||
};
|
||||
|
||||
const unsupported_implementation unsupported_singleton{};
|
||||
const unsupported_implementation* get_unsupported_singleton() {
|
||||
static const unsupported_implementation unsupported_singleton{};
|
||||
return &unsupported_singleton;
|
||||
}
|
||||
|
||||
size_t available_implementation_list::size() const noexcept {
|
||||
return internal::available_implementation_pointers.size();
|
||||
return internal::get_available_implementation_pointers().size();
|
||||
}
|
||||
const implementation * const *available_implementation_list::begin() const noexcept {
|
||||
return internal::available_implementation_pointers.begin();
|
||||
return internal::get_available_implementation_pointers().begin();
|
||||
}
|
||||
const implementation * const *available_implementation_list::end() const noexcept {
|
||||
return internal::available_implementation_pointers.end();
|
||||
return internal::get_available_implementation_pointers().end();
|
||||
}
|
||||
const implementation *available_implementation_list::detect_best_supported() const noexcept {
|
||||
// They are prelisted in priority order, so we just go down the list
|
||||
uint32_t supported_instruction_sets = internal::detect_supported_architectures();
|
||||
for (const implementation *impl : internal::available_implementation_pointers) {
|
||||
for (const implementation *impl : internal::get_available_implementation_pointers()) {
|
||||
uint32_t required_instruction_sets = impl->required_instruction_sets();
|
||||
if ((supported_instruction_sets & required_instruction_sets) == required_instruction_sets) { return impl; }
|
||||
}
|
||||
return &unsupported_singleton; // this should never happen?
|
||||
return get_unsupported_singleton(); // this should never happen?
|
||||
}
|
||||
|
||||
const implementation *detect_best_supported_implementation_on_first_use::set_best() const noexcept {
|
||||
@@ -130,31 +149,39 @@ const implementation *detect_best_supported_implementation_on_first_use::set_bes
|
||||
SIMDJSON_POP_DISABLE_WARNINGS
|
||||
|
||||
if (force_implementation_name) {
|
||||
auto force_implementation = available_implementations[force_implementation_name];
|
||||
auto force_implementation = get_available_implementations()[force_implementation_name];
|
||||
if (force_implementation) {
|
||||
return active_implementation = force_implementation;
|
||||
return get_active_implementation() = force_implementation;
|
||||
} else {
|
||||
// Note: abort() and stderr usage within the library is forbidden.
|
||||
return active_implementation = &unsupported_singleton;
|
||||
return get_active_implementation() = get_unsupported_singleton();
|
||||
}
|
||||
}
|
||||
return active_implementation = available_implementations.detect_best_supported();
|
||||
return get_active_implementation() = get_available_implementations().detect_best_supported();
|
||||
}
|
||||
|
||||
} // namespace internal
|
||||
|
||||
SIMDJSON_DLLIMPORTEXPORT const internal::available_implementation_list available_implementations{};
|
||||
SIMDJSON_DLLIMPORTEXPORT internal::atomic_ptr<const implementation> active_implementation{&internal::detect_best_supported_implementation_on_first_use_singleton};
|
||||
SIMDJSON_DLLIMPORTEXPORT const internal::available_implementation_list& get_available_implementations() {
|
||||
static const internal::available_implementation_list available_implementations{};
|
||||
return available_implementations;
|
||||
}
|
||||
|
||||
SIMDJSON_DLLIMPORTEXPORT internal::atomic_ptr<const implementation>& get_active_implementation() {
|
||||
static const internal::detect_best_supported_implementation_on_first_use detect_best_supported_implementation_on_first_use_singleton;
|
||||
static internal::atomic_ptr<const implementation> active_implementation{&detect_best_supported_implementation_on_first_use_singleton};
|
||||
return active_implementation;
|
||||
}
|
||||
|
||||
simdjson_warn_unused error_code minify(const char *buf, size_t len, char *dst, size_t &dst_len) noexcept {
|
||||
return active_implementation->minify(reinterpret_cast<const uint8_t *>(buf), len, reinterpret_cast<uint8_t *>(dst), dst_len);
|
||||
return get_active_implementation()->minify(reinterpret_cast<const uint8_t *>(buf), len, reinterpret_cast<uint8_t *>(dst), dst_len);
|
||||
}
|
||||
simdjson_warn_unused bool validate_utf8(const char *buf, size_t len) noexcept {
|
||||
return active_implementation->validate_utf8(buf, len);
|
||||
return get_active_implementation()->validate_utf8(buf, len);
|
||||
}
|
||||
|
||||
const implementation * builtin_implementation() {
|
||||
static const implementation * builtin_impl = available_implementations[SIMDJSON_STRINGIFY(SIMDJSON_BUILTIN_IMPLEMENTATION)];
|
||||
static const implementation * builtin_impl = get_available_implementations()[SIMDJSON_STRINGIFY(SIMDJSON_BUILTIN_IMPLEMENTATION)];
|
||||
assert(builtin_impl);
|
||||
return builtin_impl;
|
||||
}
|
||||
|
||||
Reference in New Issue
Block a user