From 796009ef2152262ba9b2541256a880ff555449fd Mon Sep 17 00:00:00 2001 From: Kahrl Date: Tue, 31 Jan 2012 20:42:49 +0100 Subject: [PATCH] Fix server hang when stepping a furnace with a huge dtime --- src/content_nodemeta.cpp | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/content_nodemeta.cpp b/src/content_nodemeta.cpp index 9fb5450c..b36d57c8 100644 --- a/src/content_nodemeta.cpp +++ b/src/content_nodemeta.cpp @@ -441,6 +441,10 @@ bool FurnaceNodeMetadata::step(float dtime) { if(dtime > 60.0) infostream<<"Furnace stepping a long time ("<getList("dst"); + assert(dst_list); + // Update at a fixed frequency const float interval = 2.0; m_step_accumulator += dtime; @@ -452,8 +456,7 @@ bool FurnaceNodeMetadata::step(float dtime) //infostream<<"Furnace step dtime="<getList("dst"); - assert(dst_list); + bool changed_this_loop = false; // Check // 1. if the source item is cookable @@ -473,7 +476,7 @@ bool FurnaceNodeMetadata::step(float dtime) bool burning = (m_fuel_time < m_fuel_totaltime); if(burning) { - changed = true; + changed_this_loop = true; m_fuel_time += dtime; } @@ -483,7 +486,7 @@ bool FurnaceNodeMetadata::step(float dtime) float burntime; if(burning) { - changed = true; + changed_this_loop = true; m_src_time += dtime; m_src_totaltime = cooktime; infotext = "Furnace is cooking"; @@ -491,7 +494,7 @@ bool FurnaceNodeMetadata::step(float dtime) else if(getBurnResult(true, burntime)) { // Fuel inserted - changed = true; + changed_this_loop = true; m_fuel_time = 0; m_fuel_totaltime = burntime; //m_src_time += dtime; @@ -507,7 +510,7 @@ bool FurnaceNodeMetadata::step(float dtime) if(m_src_totaltime > 0.001 && m_src_time >= m_src_totaltime) { // One item fully cooked - changed = true; + changed_this_loop = true; dst_list->addItem(cookresult_item); getCookResult(true, cookresult, cooktime); // decrement source m_src_totaltime = 0; @@ -541,7 +544,7 @@ bool FurnaceNodeMetadata::step(float dtime) if(infotext != m_infotext) { m_infotext = infotext; - changed = true; + changed_this_loop = true; } if(burning && m_fuel_time >= m_fuel_totaltime) @@ -550,7 +553,11 @@ bool FurnaceNodeMetadata::step(float dtime) m_fuel_totaltime = 0; } - if(!changed) + if(changed_this_loop) + { + changed = true; + } + else { m_step_accumulator = 0; break;