From 50a7200b18e96a6f0e2c2ee7fda017ea6f2f1c1f Mon Sep 17 00:00:00 2001 From: Marco Costalba Date: Fri, 8 Feb 2013 08:49:36 +0100 Subject: [PATCH] Workaround value-initialization in MSVC The syntax splitPoints() should force the compiler to value-initialize the array and because there is no user defined c'tor it falls back on zero-initialization. Unfortunatly this is broken in MSVC compilers, because value initialization for non-POD types is not supported, so left splitPoints un-initialized and add in split() initialization of slavesPositions, that is the only member not already set at split time. This fixes an assert under MSVC when running with more than one thread. Spotted and reported by Jundery. No functional change. --- src/thread.cpp | 5 ++++- 1 file changed, 4 insertions(+), 1 deletion(-) diff --git a/src/thread.cpp b/src/thread.cpp index 3b59a05d..80765cde 100644 --- a/src/thread.cpp +++ b/src/thread.cpp @@ -19,6 +19,7 @@ #include // For std::count #include +#include // For memset #include #include "movegen.h" @@ -43,7 +44,7 @@ namespace { extern "C" { // Thread c'tor starts a newly-created thread of execution that will call // the the virtual function idle_loop(), going immediately to sleep. -Thread::Thread() : splitPoints() { +Thread::Thread() /* : splitPoints() */ { // Value-initialization bug in MSVC searching = exit = false; maxPly = splitPointsSize = 0; @@ -280,6 +281,8 @@ void Thread::split(Position& pos, Stack* ss, Value alpha, Value beta, Value* bes sp.cutoff = false; sp.ss = ss; + memset(sp.slavesPositions, 0, sizeof(sp.slavesPositions)); + // Try to allocate available threads and ask them to start searching setting // 'searching' flag. This must be done under lock protection to avoid concurrent // allocation of the same slave by another master. -- 2.39.2