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

_______________________________________________
Mailing list: https://launchpad.net/~widelands-dev
Post to     : [email protected]
Unsubscribe : https://launchpad.net/~widelands-dev
More help   : https://help.launchpad.net/ListHelp

Reply via email to