Complete.Org: Mailing Lists: Archives: freeciv-dev: December 2002:
[Freeciv-Dev] Re: [FreeCiv-Cvs] per: Abort possibly infinite loop in ai
Home

[Freeciv-Dev] Re: [FreeCiv-Cvs] per: Abort possibly infinite loop in ai

[Top] [All Lists]

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index] [Thread Index]
To: "Per I. Mathisen" <per@xxxxxxxxxxx>
Cc: freeciv-dev@xxxxxxxxxxx
Subject: [Freeciv-Dev] Re: [FreeCiv-Cvs] per: Abort possibly infinite loop in ai_unit_rampage...
From: "Ross W. Wetmore" <rwetmore@xxxxxxxxxxxx>
Date: Sun, 08 Dec 2002 20:56:54 -0500

This may not work, since if punit has moves left the count is never
decremented. Move --count test to the front of the while tests to 
always be decremented.

Cheers,
RossW
=====

At 01:48 AM 02/12/09 +0000, Per I. Mathisen wrote:
>
>On Sun, 8 Dec 2002 freeciv@xxxxxxxxxxxxxxxxxxx wrote:
>> Abort possibly infinite loop in ai_unit_rampage() when we are unable to
>> move or attack our target.
>>
>> Patch by Jordi Negrevernis i Font <jorneg@xxxxxxxxxxx> with changes by
>> me.
>
>Ooops. Investigating this more properly, I realize that this will give a
>number of false positives because we can railroad into empty cities (no
>movement spent).
>
>Still, a way to identify and break potential infinite loops in
>ai_unit_rampage() is sorely needed. Suggestion pasted below.
>
>In any case, the proper fix for the current infinite loops is pasted
>below. Will be committed.
>
>  - Per
>
>Index: ai/aitools.c
>===================================================================
>RCS file: /home/freeciv/CVS/freeciv/ai/aitools.c,v
>retrieving revision 1.64
>diff -u -r1.64 aitools.c
>--- ai/aitools.c        8 Dec 2002 23:42:37 -0000       1.64
>+++ ai/aitools.c        9 Dec 2002 01:43:51 -0000
>@@ -279,6 +279,10 @@
>   pmove.x = x;
>   pmove.y = y;
>   pmove.unid = punit->id;
>+  if (punit->activity != ACTIVITY_IDLE
>+      && punit->activity != ACTIVITY_GOTO) {
>+    handle_unit_activity_request(punit, ACTIVITY_IDLE);
>+  }
>   handle_move_unit(unit_owner(punit), &pmove);
>
>   if (find_unit_by_id(sanity) && same_pos(x, y, punit->x, punit->y)) {
>
>Index: ai/aiunit.c
>===================================================================
>RCS file: /home/freeciv/CVS/freeciv/ai/aiunit.c,v
>retrieving revision 1.235
>diff -u -r1.235 aiunit.c
>--- ai/aiunit.c 9 Dec 2002 00:32:12 -0000       1.235
>+++ ai/aiunit.c 9 Dec 2002 01:46:59 -0000
>@@ -1057,20 +1057,14 @@
>
>**************************************************************************/
> static struct unit *ai_military_rampage(struct unit *punit, int
>threshold)
> {
>-  int x, y, moves_left, id = punit->id;
>+  int x, y, id = punit->id;
>+  int count = punit->moves_left + 1; /* break any infinite loops */
>
>-  while (punit && punit->moves_left > 0
>+  while (punit && punit->moves_left > 0 && count-- > 0
>          && ai_military_findvictim(punit, &x, &y) >= threshold) {
>     moves_left = punit->moves_left;
>     ai_unit_attack(punit, x, y);
>     punit = find_unit_by_id(id);
>-    if (punit) {
>-      if (moves_left == punit->moves_left) {
>-        /* We were unable to move - avoid infinite loop! */
>-        UNIT_LOG(LOG_ERROR, punit, "Unable to move/attack at (%d, %d)",
x, y);
>-        return punit;
>-      }
>-    }
>   }
>   return punit;
> }
>
>
>
>
>



[Prev in Thread] Current Thread [Next in Thread]