summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJohn Fultz <jfultz@wolfram.com>2019-01-10 22:41:33 -0600
committerJohn Fultz <jfultz@wolfram.com>2019-01-13 10:26:45 -0600
commitf8f8b58da81f1fefd6aa319df9fb50e8903801cc (patch)
tree01a12a87f10e961094d1f256100e034918e9553d
parent0c544662ded7bbc90ad04cd5e250f28b4894333a (diff)
Fix potential crash on exit.
Start Championship Player, then exit while the player is still thinking could crash.
-rw-r--r--quacker/quacker.cpp12
1 files changed, 12 insertions, 0 deletions
diff --git a/quacker/quacker.cpp b/quacker/quacker.cpp
index d64324c..0d5514d 100644
--- a/quacker/quacker.cpp
+++ b/quacker/quacker.cpp
@@ -89,6 +89,13 @@ TopLevel::TopLevel(QWidget *parent)
TopLevel::~TopLevel()
{
+ stopEverything();
+ for (const auto& it : m_otherOppoThreads)
+ it->wait();
+ for (const auto& it : m_oppoThreads)
+ it->wait();
+ kibitzThreadFinished();
+ computerPlayerDone();
QuackleIO::Queenie::cleanUp();
delete m_game;
delete m_simulator;
@@ -914,6 +921,8 @@ void TopLevel::kibitz(int numberOfPlays, Quackle::ComputerPlayer *computerPlayer
void TopLevel::kibitzThreadFinished()
{
+ if (m_otherOppoThreads.begin() == m_otherOppoThreads.end())
+ return;
QString name;
QString rack;
for (QList<OppoThread *>::iterator it = m_otherOppoThreads.begin(); it != m_otherOppoThreads.end(); )
@@ -1446,6 +1455,9 @@ void TopLevel::stopOutcraftyingCurrentPlayer()
void TopLevel::computerPlayerDone()
{
+ if (m_oppoThreads.begin() == m_oppoThreads.end())
+ return;
+
Quackle::MoveList moves;
for (QList<OppoThread *>::iterator it = m_oppoThreads.begin(); it != m_oppoThreads.end(); )