← Back to team overview

widelands-dev team mailing list archive

[Merge] lp:~widelands-dev/widelands/bug-1831583-fri02 into lp:widelands

 

Benedikt Straub has proposed merging lp:~widelands-dev/widelands/bug-1831583-fri02 into lp:widelands.

Commit message:
Add some sleep time to costly loops in fri02 to prevent freezing

Requested reviews:
  Widelands Developers (widelands-dev)
Related bugs:
  Bug #1831583 in widelands: "Crash in Frisians 2"
  https://bugs.launchpad.net/widelands/+bug/1831583

For more details, see:
https://code.launchpad.net/~widelands-dev/widelands/bug-1831583-fri02/+merge/368348

This is a Lua problem. gdb shows that masses of new Lua objects are created, and Lua doesn´t care to release the memory again. Hopefully, some additional sleep() will give the game and the garbage collector time to catch up.

I don´t want to fix this by increasing the base sleep time or the objective will be marked done only after an enormous delay. 
Another way to fix the bug while perhaps improving performance would be to move the checks to C++, but I feel bad about having such specialised functions there.
-- 
Your team Widelands Developers is requested to review the proposed merge of lp:~widelands-dev/widelands/bug-1831583-fri02 into lp:widelands.
=== modified file 'data/campaigns/fri02.wmf/scripting/mission_thread.lua'
--- data/campaigns/fri02.wmf/scripting/mission_thread.lua	2019-03-29 18:29:54 +0000
+++ data/campaigns/fri02.wmf/scripting/mission_thread.lua	2019-06-04 18:05:55 +0000
@@ -33,6 +33,7 @@
 
 function check_empire()
    while true do
+      sleep(1000)
       for idx,field in ipairs(all_fields) do
          sleep(5)
          local p1c = false
@@ -272,9 +273,9 @@
    while not p3.defeated do sleep(4513) end
    set_objective_done(o)
 
-   -- If the barbarians already defeated Murilius – well done
+   -- If the barbarians already defeated Murilius – well done.
    -- Otherwise, Murilius provokes Reebaud into ordering the player to conquer his entire colony
-   -- (merely defeating the Empire isn’t enough)
+   -- (merely defeating the Empire isn’t enough).
    -- We don't bother to check water, walkable-only and other useless terrains.
    -- That would be really too much to ask from our poor player, now wouldn't it?
    if not p2.defeated then
@@ -285,6 +286,7 @@
       o = add_campaign_objective(obj_defeat_murilius)
       local def = false
       while not def do
+         sleep(1000)
          def = true
          for idx,field in ipairs(useful_fields) do
             if field.owner == p2 then


Follow ups