ChangeLog.md: 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 @@
endif()
project(libjpeg-turbo C)
-set(VERSION 2.1.90)
+set(VERSION 2.1.91)
set(COPYRIGHT_YEAR "1991-2023")
string(REPLACE "." ";" VERSION_TRIPLET ${VERSION})
list(GET VERSION_TRIPLET 0 VERSION_MAJOR)
diff --git a/ChangeLog.md b/ChangeLog.md
index a8c982f..f148190 100644
--- a/ChangeLog.md
+++ b/ChangeLog.md
@@ -1,7 +1,7 @@
-3.0 beta1
+3.0 beta2
=========
-### Significant changes relative to 2.1.5:
+### Significant changes relative to 2.1.5.1:
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.
+2.1.5.1
+=======
+
+### 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.
+
+
2.1.5
=====