mirror of
https://github.com/rwengine/openrw.git
synced 2024-11-07 03:12:36 +01:00
Fix crash caused by thread clobbering
This commit is contained in:
parent
243bfb18a8
commit
e2bd2b704e
@ -7,6 +7,7 @@
|
||||
#include <string>
|
||||
#include <vector>
|
||||
#include <stack>
|
||||
#include <list>
|
||||
#include <set>
|
||||
|
||||
#define SCM_NEGATE_CONDITIONAL_MASK 0x8000
|
||||
@ -205,7 +206,7 @@ public:
|
||||
|
||||
void startThread(SCMThread::pc_t start, bool mission = false);
|
||||
|
||||
std::vector<SCMThread>& getThreads() { return _activeThreads; }
|
||||
std::list<SCMThread>& getThreads() { return _activeThreads; }
|
||||
|
||||
SCMByte* getGlobals();
|
||||
std::vector<SCMByte>& getGlobalData() { return globalData; }
|
||||
@ -249,7 +250,7 @@ private:
|
||||
GameState* state;
|
||||
bool interupt;
|
||||
|
||||
std::vector<SCMThread> _activeThreads;
|
||||
std::list<SCMThread> _activeThreads;
|
||||
|
||||
void executeThread(SCMThread& t, int msPassed);
|
||||
|
||||
|
@ -240,12 +240,13 @@ SCMByte *ScriptMachine::getGlobals()
|
||||
void ScriptMachine::execute(float dt)
|
||||
{
|
||||
int ms = dt * 1000.f;
|
||||
for(size_t ti = 0; ti < _activeThreads.size(); ++ti) {
|
||||
auto& thread = _activeThreads[ti];
|
||||
for(auto t = _activeThreads.begin(); t != _activeThreads.end(); ++t )
|
||||
{
|
||||
auto& thread = *t;
|
||||
executeThread( thread, ms );
|
||||
|
||||
if( thread.finished ) {
|
||||
_activeThreads.erase( _activeThreads.begin() + ti );
|
||||
t = _activeThreads.erase( t );
|
||||
}
|
||||
}
|
||||
}
|
||||
|
@ -133,9 +133,16 @@ RWGame::RWGame(const std::string& gamepath, int argc, char* argv[])
|
||||
|
||||
auto loading = new LoadingState(this);
|
||||
if( newgame )
|
||||
{
|
||||
if( test )
|
||||
{
|
||||
loading->setNextState(new IngameState(this,true, "test"));
|
||||
}
|
||||
else
|
||||
{
|
||||
loading->setNextState(new IngameState(this,true));
|
||||
}
|
||||
}
|
||||
else if( ! startSave.empty() )
|
||||
{
|
||||
loading->setNextState(new IngameState(this,true, startSave));
|
||||
|
@ -313,12 +313,12 @@ std::string HttpServer::getState() const
|
||||
ss << R"("status":"interrupted",)";
|
||||
ss << R"("breakpoint": )" << breakpoint(lastBreakpoint) << ",";
|
||||
ss << R"("threads": [)";
|
||||
for(unsigned int i = 0; i < game->getScript()->getThreads().size(); ++i)
|
||||
auto it = game->getScript()->getThreads().begin();
|
||||
for(unsigned int i = 0; i < game->getScript()->getThreads().size(); ++i,++it)
|
||||
{
|
||||
if( i != 0 )
|
||||
ss << ",";
|
||||
SCMThread& th = game->getScript()->getThreads().at(i);
|
||||
ss << thread(game->getScript(), th);
|
||||
ss << thread(game->getScript(), *it);
|
||||
}
|
||||
ss << R"(])";
|
||||
ss << "}";
|
||||
|
Loading…
Reference in New Issue
Block a user