diff --git a/src/dsp/cpu.h b/src/dsp/cpu.h index 913e857f..7c0cb376 100644 --- a/src/dsp/cpu.h +++ b/src/dsp/cpu.h @@ -189,8 +189,40 @@ #endif #endif -#if defined(WEBP_USE_THREAD) && !defined(_WIN32) -#include // NOLINT +#if defined(WEBP_USE_THREAD) +#if defined(_WIN32) +#include + +#if _WIN32_WINNT >= 0x0600 +// clang-format off +#define WEBP_DSP_INIT_VARS(func) \ + static VP8CPUInfo func##_last_cpuinfo_used = \ + (VP8CPUInfo)&func##_last_cpuinfo_used; \ + static SRWLOCK func##_lock = SRWLOCK_INIT +#define WEBP_DSP_INIT(func) \ + do { \ + AcquireSRWLockExclusive(&func##_lock); \ + if (func##_last_cpuinfo_used != VP8GetCPUInfo) func(); \ + func##_last_cpuinfo_used = VP8GetCPUInfo; \ + ReleaseSRWLockExclusive(&func##_lock); \ + } while (0) +// clang-format on +#else // _WIN32_WINNT < 0x0600 +// clang-format off +#define WEBP_DSP_INIT_VARS(func) \ + static volatile VP8CPUInfo func##_last_cpuinfo_used = \ + (VP8CPUInfo)&func##_last_cpuinfo_used +#define WEBP_DSP_INIT(func) \ + do { \ + if (func##_last_cpuinfo_used == VP8GetCPUInfo) break; \ + func(); \ + func##_last_cpuinfo_used = VP8GetCPUInfo; \ + } while (0) +// clang-format on +#endif // _WIN32_WINNT >= 0x0600 +#else // !defined(_WIN32) +// NOLINTNEXTLINE +#include // clang-format off #define WEBP_DSP_INIT_VARS(func) \ @@ -205,7 +237,8 @@ (void)pthread_mutex_unlock(&func##_lock); \ } while (0) // clang-format on -#else // !(defined(WEBP_USE_THREAD) && !defined(_WIN32)) +#endif // defined(_WIN32) +#else // !defined(WEBP_USE_THREAD) // clang-format off #define WEBP_DSP_INIT_VARS(func) \ static volatile VP8CPUInfo func##_last_cpuinfo_used = \ @@ -217,7 +250,7 @@ func##_last_cpuinfo_used = VP8GetCPUInfo; \ } while (0) // clang-format on -#endif // defined(WEBP_USE_THREAD) && !defined(_WIN32) +#endif // defined(WEBP_USE_THREAD) // Defines an Init + helper function that control multiple initialization of // function pointers / tables.