Fix four data races.
authorJoost VandeVondele <Joost.VandeVondele@gmail.com>
Wed, 21 Jun 2017 20:36:53 +0000 (13:36 -0700)
committerJoona Kiiski <joona@zoox.com>
Wed, 21 Jun 2017 20:37:58 +0000 (13:37 -0700)
commit3cb02004596f868ae405b09fbf3a2038a680a989
treefccc128ae42b3bf6761d502f09ba8237e0d15b62
parent2c237da54647bb7526f3512bea183eb44919cdda
Fix four data races.

the nodes, tbHits, rootDepth and lastInfoTime variables are read by multiple threads, but not declared atomic, leading to data races as found by -fsanitize=thread. This patch fixes this issue. It is based on top of the CI-threading branch (PR #1129), and should fix the corresponding CI error messages.

The patch passed an STC check for no regression:

http://tests.stockfishchess.org/tests/view/5925d5590ebc59035df34b9f
LLR: 2.96 (-2.94,2.94) [-3.00,1.00]
Total: 169597 W: 29938 L: 30066 D: 109593

Whereas rootDepth and lastInfoTime are not performance critical, nodes and tbHits are. Indeed, an earlier version using relaxed atomic updates on the latter two variables failed STC testing (http://tests.stockfishchess.org/tests/view/592001700ebc59035df34924), which can be shown to be due to x86-32 (http://tests.stockfishchess.org/tests/view/592330ac0ebc59035df34a89). Indeed, the latter have no instruction to atomically update a 64bit variable. The proposed solution thus uses a variable in Position that is accessed only by one thread, which is copied every few thousand nodes to the shared variable in Thread.

No functional change.

Closes #1130
Closes #1129
.travis.yml
src/Makefile
src/position.h
src/search.cpp
src/thread.cpp
src/thread.h
tests/instrumented.sh