0ad/source/tools/atlas/GameInterface/MessagePasserImpl.cpp
wraitii 764440e017 Remove the Engine threading when using Atlas
MacOS requires some UI-related API calls to happen on the main thread.
There are several SDL functions that call UI-things, and those were,
since #500 / 08b4d96cf2, in a separate thread.
This crashes on Catalina, instead of simply warning (see #5470).

It is not the first time we had such issues, as originally the Engine
was on the main thread and AtlasUI on a separate thread.
That didn't work on MacOS, so the threading was inverted in #500 /
08b4d96cf2, with AtlasUI on the main thread and the Engine in another
thread.
Unfortunately, this still wasn't enough.

This formally unthreads the engine, running it on a wxTimer, to avoid
these issues.

Future work should focus on:
- Further decoupling the simulation from the engine itself, as what
Atlas really needs is a threaded simulation, not a threaded engine.
- Making the simulation itself more threaded
- Making it possible to do tasks asynchronously under Atlas.

Refs #500
Fixes #5470

Differential Revision: https://code.wildfiregames.com/D2752
This was SVN commit r24361.
2020-12-10 09:42:58 +00:00

82 lines
2.2 KiB
C++

/* Copyright (C) 2019 Wildfire Games.
* This file is part of 0 A.D.
*
* 0 A.D. is free software: you can redistribute it and/or modify
* it under the terms of the GNU General Public License as published by
* the Free Software Foundation, either version 2 of the License, or
* (at your option) any later version.
*
* 0 A.D. is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU General Public License for more details.
*
* You should have received a copy of the GNU General Public License
* along with 0 A.D. If not, see <http://www.gnu.org/licenses/>.
*/
#include "precompiled.h"
#include <cstdio>
#include "MessagePasserImpl.h"
#include "Messages.h"
#include "Handlers/MessageHandler.h"
#include "lib/timer.h"
#include "ps/CLogger.h"
using namespace AtlasMessage;
double last_user_activity = 0.0;
void MessagePasserImpl::Add(IMessage* msg)
{
ENSURE(msg);
ENSURE(msg->GetType() == IMessage::Message);
if (m_Trace)
debug_printf("%8.3f add message: %s\n", timer_Time(), msg->GetName());
msgHandlers::const_iterator it = GetMsgHandlers().find(msg->GetName());
if (it != GetMsgHandlers().end())
{
it->second(msg);
}
else
{
debug_warn(L"Unrecognised message");
// CLogger might not be initialised, but this error will be sent
// to the debug output window anyway so people can still see it
LOGERROR("Unrecognised message (%s)", msg->GetName());
}
// Delete the object - we took ownership of it.
AtlasMessage::ShareableDelete(msg);
}
void MessagePasserImpl::Query(QueryMessage* msg, void(* UNUSED(timeoutCallback) )())
{
ENSURE(msg);
ENSURE(msg->GetType() == IMessage::Query);
if (m_Trace)
debug_printf("%8.3f add query: %s\n", timer_Time(), msg->GetName());
msgHandlers::const_iterator it = GetMsgHandlers().find(msg->GetName());
if (it != GetMsgHandlers().end())
{
it->second(msg);
}
else
{
debug_warn(L"Unrecognised message");
// CLogger might not be initialised, but this error will be sent
// to the debug output window anyway so people can still see it
LOGERROR("Unrecognised message (%s)", msg->GetName());
}
}
void MessagePasserImpl::SetTrace(bool t)
{
m_Trace = t;
}