Make the one-time initialization in av_get_cpu_flags() thread-safe. The
static variables |flags|, |cpuflags_mask|, and |checked| in
libavutil/cpu.c are read and written using normal load and store
operations. These are considered as data races. The fix is to use atomic
load and store operations.
Remove the |checked| variable because the invalid value of -1 for
|flags| can be used to indicate the same condition. Rename |flags| to
|cpu_flags| and move it to file scope.
The fix can be verified by running the libavutil/tests/cpu_init.c test
program under ThreadSanitizer:
./configure --toolchain=clang-tsan
make libavutil/tests/cpu_init
libavutil/tests/cpu_init
There should be no warnings from ThreadSanitizer.
Co-author: Dmitry Vyukov of Google, who suggested the data race fix.
Signed-off-by: Wan-Teh Chang <wtc@google.com>
This is a follow-up to commit d84a21207ea83055dc9b6dc1cd6a379f2ea756e7,
which added the libavutil/tests/cpu_init.c.
Signed-off-by: Michael Niedermayer <michael@niedermayer.cc>
* commit 'ded4a6543dfb5a2f1d9f7fb8d3ab27a1872c22b3':
xtea-test: Use struct allocation functions from the API
Merged-by: Clément Bœsch <clement@stupeflix.com>
* commit '8131bd4c22ad59b040173f67a5b2edb75863e801':
blowfish-test: Use struct allocation functions from the API
Merged-by: Clément Bœsch <clement@stupeflix.com>
* commit 'a86ef80494d759807a5ef8dd12838f0690092e37':
blowfish-test: Return different values for different errors
Merged-by: Clément Bœsch <clement@stupeflix.com>