Document 4e028ecd

+ bump version to 3.0 beta2
diff --git a/CMakeLists.txt b/CMakeLists.txt
index e3528b6..d866b8d 100644
--- a/CMakeLists.txt
+++ b/CMakeLists.txt
@@ -10,7 +10,7 @@
 project(libjpeg-turbo C)
-set(VERSION 2.1.90)
+set(VERSION 2.1.91)
 set(COPYRIGHT_YEAR "1991-2023")
diff --git a/ b/
index a8c982f..f148190 100644
--- a/
+++ b/
@@ -1,7 +1,7 @@
-3.0 beta1
+3.0 beta2
-### Significant changes relative to 2.1.5:
+### Significant changes relative to
 1. Significantly sped up the computation of optimal Huffman tables.  This
 speeds up the compression of tiny images by as much as 2x and provides a
@@ -134,6 +134,27 @@
 TurboJPEG API documentation for more details.
+### Significant changes relative to 2.1.5:
+1. The SIMD dispatchers in libjpeg-turbo 2.1.4 and prior stored the list of
+supported SIMD instruction sets in a global variable, which caused an innocuous
+race condition whereby the variable could have been initialized multiple times
+if `jpeg_start_*compress()` was called simultaneously in multiple threads.
+libjpeg-turbo 2.1.5 included an undocumented attempt to fix this race condition
+by making the SIMD support variable thread-local.  However, that caused another
+issue whereby, if `jpeg_start_*compress()` was called in one thread and
+`jpeg_read_*()` or `jpeg_write_*()` was called in a second thread, the SIMD
+support variable was never initialized in the second thread.  On x86 systems,
+this led the second thread to incorrectly assume that AVX2 instructions were
+always available, and when it attempted to use those instructions on older x86
+CPUs that do not support them, an illegal instruction error occurred.  The SIMD
+dispatchers now ensure that the SIMD support variable is initialized before
+dispatching based on its value.