This introduces a new option to forcefully disable threads.

This commit is contained in:
Daniel Lemire 2020-06-26 13:23:44 -04:00
parent 86241e2871
commit 6c33f518a8
3 changed files with 21 additions and 3 deletions

View File

@ -105,7 +105,7 @@ if(NOT SIMDJSON_EXCEPTIONS)
target_compile_definitions(simdjson-internal-flags INTERFACE SIMDJSON_EXCEPTIONS=0) target_compile_definitions(simdjson-internal-flags INTERFACE SIMDJSON_EXCEPTIONS=0)
endif() endif()
option(SIMDJSON_ENABLE_THREADS "Enable threaded operation" ON) option(SIMDJSON_ENABLE_THREADS "Link with thread support" ON)
if(SIMDJSON_ENABLE_THREADS) if(SIMDJSON_ENABLE_THREADS)
set(CMAKE_THREAD_PREFER_PTHREAD TRUE) set(CMAKE_THREAD_PREFER_PTHREAD TRUE)
set(THREADS_PREFER_PTHREAD_FLAG TRUE) set(THREADS_PREFER_PTHREAD_FLAG TRUE)
@ -113,7 +113,13 @@ if(SIMDJSON_ENABLE_THREADS)
target_link_libraries(simdjson-flags INTERFACE Threads::Threads) target_link_libraries(simdjson-flags INTERFACE Threads::Threads)
target_link_libraries(simdjson-flags INTERFACE ${CMAKE_THREAD_LIBS_INIT}) target_link_libraries(simdjson-flags INTERFACE ${CMAKE_THREAD_LIBS_INIT})
target_compile_options(simdjson-flags INTERFACE ${CMAKE_THREAD_LIBS_INIT}) target_compile_options(simdjson-flags INTERFACE ${CMAKE_THREAD_LIBS_INIT})
target_compile_definitions(simdjson-flags INTERFACE SIMDJSON_THREADS_ENABLED=1) target_compile_definitions(simdjson-flags INTERFACE SIMDJSON_THREADS_ENABLED=1) # This will be set in the code automatically.
endif()
# Some users compile simdjson with thread support but still do not want simdjson to use threads.
option(SIMDJSON_DO_NOT_USE_THREADS_NO_MATTER_WHAT "Whether we enabled thread support or not (SIMDJSON_ENABLE_THREADS), do not use threads. This option does nothing when thread support is not enabled." OFF)
if(SIMDJSON_DO_NOT_USE_THREADS_NO_MATTER_WHAT)
target_compile_definitions(simdjson-flags INTERFACE SIMDJSON_DO_NOT_USE_THREADS_NO_MATTER_WHAT=1)
endif() endif()
if(SIMDJSON_USE_LIBCPP) if(SIMDJSON_USE_LIBCPP)

View File

@ -101,6 +101,12 @@ A `document_stream` instance uses at most two threads: there is a main thread an
You should expect the main thread to be fully occupied while the worker thread is partially busy You should expect the main thread to be fully occupied while the worker thread is partially busy
(e.g., 80% of the time). (e.g., 80% of the time).
If you compile simdjson with thread support and you still do not want simdjson to use threads,
you can forcefully disable them by setting the SIMDJSON_DO_NOT_USE_THREADS_NO_MATTER_WHAT macro
to 1 in C++, or by passing SIMDJSON_DO_NOT_USE_THREADS_NO_MATTER_WHAT=ON to cmake. It is a
compile-time decision: if you disable the threads with SIMDJSON_DO_NOT_USE_THREADS_NO_MATTER_WHAT,
you will not be able to use threads in simdjson unless you recompile.
Support Support
------- -------

View File

@ -122,7 +122,6 @@ compiling for a known 64-bit platform."
#endif #endif
#endif #endif
// workaround for large stack sizes under -O0. // workaround for large stack sizes under -O0.
// https://github.com/simdjson/simdjson/issues/691 // https://github.com/simdjson/simdjson/issues/691
#ifdef __APPLE__ #ifdef __APPLE__
@ -136,6 +135,13 @@ compiling for a known 64-bit platform."
#endif #endif
#endif #endif
#if SIMDJSON_DO_NOT_USE_THREADS_NO_MATTER_WHAT
// No matter what happened, we undefine SIMDJSON_THREADS_ENABLED and so disable threads.
#undef SIMDJSON_THREADS_ENABLED
#endif
#if defined(__clang__) #if defined(__clang__)
#define NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined"))) #define NO_SANITIZE_UNDEFINED __attribute__((no_sanitize("undefined")))
#elif defined(__GNUC__) #elif defined(__GNUC__)