Skip to content

Commit 2d05f18

Browse files
committed
Fix delayed deallocation when there're multiple parallel interpreters
1 parent 4986aa3 commit 2d05f18

File tree

4 files changed

+20
-31
lines changed

4 files changed

+20
-31
lines changed

src/game_commonevent.cpp

Lines changed: 5 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -51,10 +51,12 @@ void Game_CommonEvent::Refresh() {
5151
: static_cast<Game_Interpreter*>(new Game_Interpreter_Map()));
5252
Update();
5353
}
54-
} else {
55-
interpreter.reset();
54+
return;
5655
}
57-
} else {
56+
}
57+
if (interpreter) {
58+
interpreter->Clear();
59+
Game_Map::ReserveInterpreterDeletion(interpreter);
5860
interpreter.reset();
5961
}
6062
}
@@ -63,13 +65,11 @@ void Game_CommonEvent::Update() {
6365
CheckEventTriggerAuto();
6466

6567
if (interpreter) {
66-
Game_Map::SetParallelInterpreter(interpreter);
6768
if (!interpreter->IsRunning()) {
6869
interpreter->Setup(GetList(), 0, -common_event_id, -2);
6970
} else {
7071
interpreter->Update();
7172
}
72-
Game_Map::SetParallelInterpreter(EASYRPG_SHARED_PTR<Game_Interpreter>());
7373
}
7474
}
7575

src/game_event.cpp

Lines changed: 7 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -241,6 +241,13 @@ void Game_Event::ClearStarting() {
241241
void Game_Event::Setup(RPG::EventPage* new_page) {
242242
page = new_page;
243243

244+
// Free resources if needed
245+
if (interpreter) {
246+
interpreter->Clear();
247+
Game_Map::ReserveInterpreterDeletion(interpreter);
248+
interpreter.reset();
249+
}
250+
244251
if (page == NULL) {
245252
tile_id = 0;
246253
SetSpriteName("");
@@ -249,7 +256,6 @@ void Game_Event::Setup(RPG::EventPage* new_page) {
249256
//move_type = 0;
250257
trigger = -1;
251258
list.clear();
252-
interpreter.reset();
253259
return;
254260
}
255261
SetSpriteName(page->character_name);
@@ -279,11 +285,6 @@ void Game_Event::Setup(RPG::EventPage* new_page) {
279285
trigger = page->trigger;
280286
list = page->event_commands;
281287

282-
// Free resources if needed
283-
if (interpreter) {
284-
interpreter->Clear();
285-
interpreter.reset();
286-
}
287288
if (trigger == RPG::EventPage::Trigger_parallel) {
288289
interpreter.reset(new Game_Interpreter_Map());
289290
}
@@ -494,13 +495,11 @@ void Game_Event::Update() {
494495
CheckEventTriggerAuto();
495496

496497
if (interpreter) {
497-
Game_Map::SetParallelInterpreter(interpreter);
498498
if (!interpreter->IsRunning()) {
499499
interpreter->Setup(list, event.ID, -event.x, event.y);
500500
} else {
501501
interpreter->Update();
502502
}
503-
Game_Map::SetParallelInterpreter(EASYRPG_SHARED_PTR<Game_Interpreter>());
504503
}
505504
}
506505

src/game_map.cpp

Lines changed: 5 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -63,7 +63,7 @@ namespace {
6363
int scroll_speed;
6464

6565
boost::scoped_ptr<Game_Interpreter> interpreter;
66-
EASYRPG_SHARED_PTR<Game_Interpreter> parallel_interpreter;
66+
std::vector<EASYRPG_SHARED_PTR<Game_Interpreter>> free_interpreters;
6767
Game_Vehicle* vehicles[3];
6868

6969
bool pan_locked;
@@ -306,12 +306,8 @@ Game_Interpreter& Game_Map::GetInterpreter() {
306306
return *interpreter;
307307
}
308308

309-
EASYRPG_SHARED_PTR<Game_Interpreter> Game_Map::GetParallelInterpreter() {
310-
return parallel_interpreter;
311-
}
312-
313-
void Game_Map::SetParallelInterpreter(EASYRPG_SHARED_PTR<Game_Interpreter> interpreter) {
314-
parallel_interpreter = interpreter;
309+
void Game_Map::ReserveInterpreterDeletion(EASYRPG_SHARED_PTR<Game_Interpreter> interpreter) {
310+
free_interpreters.push_back(interpreter);
315311
}
316312

317313
void Game_Map::ScrollDown(int distance) {
@@ -679,6 +675,8 @@ void Game_Map::Update() {
679675

680676
for (int i = 0; i < 3; ++i)
681677
vehicles[i]->Update();
678+
679+
free_interpreters.clear();
682680
}
683681

684682
RPG::Map const& Game_Map::GetMap() {

src/game_map.h

Lines changed: 3 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -392,19 +392,11 @@ namespace Game_Map {
392392
Game_Interpreter& GetInterpreter();
393393

394394
/**
395-
* Gets the currently running parallel interpreter.
395+
* Destroy an interpreter after all events and common events have been updated.
396396
*
397-
* @return running parallel interpreter.
397+
* @param interpreter to destroy.
398398
*/
399-
EASYRPG_SHARED_PTR<Game_Interpreter> GetParallelInterpreter();
400-
401-
/**
402-
* Sets the currently running parallel interpreter.
403-
* Used to hold a 2nd stromg reference to prevent destruction on refresh.
404-
*
405-
* @param interpreter executed interpreter.
406-
*/
407-
void SetParallelInterpreter(EASYRPG_SHARED_PTR<Game_Interpreter> interpreter);
399+
void ReserveInterpreterDeletion(EASYRPG_SHARED_PTR<Game_Interpreter> interpreter);
408400

409401
/**
410402
* Sets the need refresh flag.

0 commit comments

Comments
 (0)