diff --git a/include/common/hathreads.h b/include/common/hathreads.h index 8e96e37e8..019d74970 100644 --- a/include/common/hathreads.h +++ b/include/common/hathreads.h @@ -168,8 +168,11 @@ static inline unsigned long thread_isolated() #include #include +#ifndef MAX_THREADS #define MAX_THREADS LONGBITS -#define MAX_THREADS_MASK ((unsigned long)-1) +#endif + +#define MAX_THREADS_MASK (~0UL >> (LONGBITS - MAX_THREADS)) #define __decl_hathreads(decl) decl diff --git a/src/hathreads.c b/src/hathreads.c index 39ff7e828..a21bddd9e 100644 --- a/src/hathreads.c +++ b/src/hathreads.c @@ -108,13 +108,22 @@ void ha_rwlock_init(HA_RWLOCK_T *l) __attribute__((constructor)) static void __hathreads_init(void) { + char *ptr = NULL; + + if (MAX_THREADS < 1 || MAX_THREADS > LONGBITS) { + ha_alert("MAX_THREADS value must be between 1 and %d inclusive; " + "HAProxy was built with value %d, please fix it and rebuild.\n", + LONGBITS, MAX_THREADS); + exit(1); + } + memprintf(&ptr, "Built with multi-threading support (MAX_THREADS=%d).", MAX_THREADS); + hap_register_build_opts(ptr, 1); + #if defined(DEBUG_THREAD) || defined(DEBUG_FULL) memset(lock_stats, 0, sizeof(lock_stats)); #endif } -REGISTER_BUILD_OPTS("Built with multi-threading support."); - #else REGISTER_BUILD_OPTS("Built without multi-threading support (USE_THREAD not set).");