Avoid a race at thread creation
authorMarco Costalba <mcostalba@gmail.com>
Tue, 3 Jan 2012 20:13:29 +0000 (21:13 +0100)
committerMarco Costalba <mcostalba@gmail.com>
Tue, 3 Jan 2012 20:31:50 +0000 (21:31 +0100)
commitd282cf6964d493706b6face7109e1859eab1742f
tree08ae7374370d390748992b81aefd96fd6abc4b09
parentb1fcfe4c5d1fbe7e538268b79f12224f8c4d5012
Avoid a race at thread creation

Before creating main thread we set its do_sleep flag to true,
then thread is created and it will go to sleep in main_loop()
after resetting do_sleep.

But if after the setting of do_sleep and before its resetting
the UI thread calls start_thinking() it will not wait on:

  if (!asyncMode)
      while (!main.do_sleep)
          cond_wait(&sleepCond, &main.sleepLock);

as it should but will immediately return before the main thread has
started the search. This very rare race show itself during bench,
when the first position is erroneusly skipped so that bench node count
results of 5309038 instead of the correct 5457475.

The patch is somewhat tricky, but is simple and it works!

No functional change.

Signed-off-by: Marco Costalba <mcostalba@gmail.com>
src/thread.cpp