Re: extract_char stuff.

From: Peter Ajamian (peter@pajamian.dhs.org)
Date: 03/18/01


George Greer wrote:
>
> [ Doh, take 3, it was originally a 204-line patch.  It's now missing the
> handler.h prototype for e_p_c, and the #defines for {PLR,MOB}_NOTDEADYET. ]
>
> Here's what I'm using for the 'extracting a dead character in the middle of
> a loop' fix.  Can anyone think of cases that this will either break or that
> will break this? You have 16 hours. :)

You forgot to check extractions_pending before looping through the entire
player base (you check for an invlid value but you don't check to see if
it's set).  Also, I would move the validity test to right before you
extract the character.  Test for 0 there, not -1, then you can make
extractions_pending unsigned (and effectively double its capacity).  See
below...

> +/* local vars */
- +int extractions_pending = 0;
+  unsigned int extractions_pending = 0;

> +void extract_pending_chars(void)
> +{
> +  struct char_data *vict, *next_vict;
+    int overflow = 0;
> +
- +  if (extractions_pending < 0)
- +    log("SYSERR: Negative (%d) extractions pending.",
extractions_pending);
+    if (!extractions_pending)
+      return;
> +
> +  for (vict = character_list; vict && extractions_pending; vict = next_vict) {
> +    next_vict = vict->next;
> +
> +    if (MOB_FLAGGED(vict, MOB_NOTDEADYET))
> +      REMOVE_BIT(MOB_FLAGS(vict), MOB_NOTDEADYET);
> +    else if (PLR_FLAGGED(vict, PLR_NOTDEADYET))
> +      REMOVE_BIT(PLR_FLAGS(vict), PLR_NOTDEADYET);
> +    else
> +      continue;
> +
> +    extract_char_final(vict);
+      if (extractions_pending)
> +    extractions_pending--;
+      else
+        overflow++;
> +  }
+    if (overflow)
+      log("SYSERR: %d more extractions than extractions_pending.",
overflow);
+    if (extractions_pending)
+      log("SYSERR: %d less extractions than extractions_pending",
extractions_pending);
> +  extractions_pending = 0;
> +}

Regards, Peter

--
   +---------------------------------------------------------------+
   | FAQ: http://qsilver.queensu.ca/~fletchra/Circle/list-faq.html |
   | Archives: http://post.queensu.ca/listserv/wwwarch/circle.html |
   +---------------------------------------------------------------+



This archive was generated by hypermail 2b30 : 12/04/01 PST