Fixed delayed/incomplete freeing of client resources and
authoroes <oes@users.sourceforge.net>
Wed, 20 Nov 2002 14:38:15 +0000 (14:38 +0000)
committeroes <oes@users.sourceforge.net>
Wed, 20 Nov 2002 14:38:15 +0000 (14:38 +0000)
simplified loop structure in sweep.
Thanks to Oliver Stoeneberg for the hint.

loaders.c

index f2055fb..3221812 100644 (file)
--- a/loaders.c
+++ b/loaders.c
@@ -1,4 +1,4 @@
-const char loaders_rcs[] = "$Id: loaders.c,v 1.50 2002/04/24 02:12:16 oes Exp $";
+const char loaders_rcs[] = "$Id: loaders.c,v 1.50.2.1 2002/07/26 15:19:24 oes Exp $";
 /*********************************************************************
  *
  * File        :  $Source: /cvsroot/ijbswa/current/Attic/loaders.c,v $
@@ -35,6 +35,12 @@ const char loaders_rcs[] = "$Id: loaders.c,v 1.50 2002/04/24 02:12:16 oes Exp $"
  *
  * Revisions   :
  *    $Log: loaders.c,v $
+ *    Revision 1.50.2.1  2002/07/26 15:19:24  oes
+ *    - PCRS jobs now chained in order of appearance. Previous
+ *      reverse chaining was counter-intuitive.
+ *    - Changed loglevel of PCRS job compile errors to
+ *      LOG_LEVEL_ERROR
+ *
  *    Revision 1.50  2002/04/24 02:12:16  oes
  *    Jon's multiple AF patch: Sweep now takes care of all AFs
  *
@@ -336,7 +342,7 @@ static struct file_list *current_re_filterfile  = NULL;
 void sweep(void)
 {
    struct file_list *fl, *nfl;
-   struct client_state *csp, *ncsp;
+   struct client_state *csp, *last_active;
    int i;
 
    /* clear all of the file's active flags */
@@ -345,78 +351,83 @@ void sweep(void)
       fl->active = 0;
    }
 
-   for (csp = clients; csp && (NULL != (ncsp = csp->next)) ; csp = csp->next)
+   last_active = clients;
+   csp = clients->next;
+
+   while (NULL != csp)
    {
-      if (ncsp->flags & CSP_FLAG_ACTIVE)
+      if (csp->flags & CSP_FLAG_ACTIVE)
       {
-         /* mark this client's files as active */
+         /* Mark this client's files as active */
 
          /*
           * Always have a configuration file.
           * (Also note the slightly non-standard extra
           * indirection here.)
           */
-         ncsp->config->config_file_list->active = 1;
+         csp->config->config_file_list->active = 1;
 
+         /* 
+          * Actions files
+          */
          for (i = 0; i < MAX_ACTION_FILES; i++)
          {
-            if (ncsp->actions_list[i])     /* actions files */
+            if (csp->actions_list[i])     
             {
-               ncsp->actions_list[i]->active = 1;
+               csp->actions_list[i]->active = 1;
             }
          }
 
-         if (ncsp->rlist)     /* pcrsjob files */
+         /*
+          * Filter file
+          */
+         if (csp->rlist)
          {
-            ncsp->rlist->active = 1;
+            csp->rlist->active = 1;
          }
 
+         /*
+          * Trust file
+          */
 #ifdef FEATURE_TRUST
-         if (ncsp->tlist)     /* trust files */
+         if (csp->tlist)
          {
-            ncsp->tlist->active = 1;
+            csp->tlist->active = 1;
          }
 #endif /* def FEATURE_TRUST */
 
       }
-      else
+      else 
       /*
-       * this client is not active, release its resources
-       * and the ones of all inactive clients that might
-       * follow it
+       * This client is not active. Free its resources.
        */
       {
-         while (!(ncsp->flags & CSP_FLAG_ACTIVE))
-         {
-            csp->next = ncsp->next;
+         last_active->next = csp->next;
 
-            freez(ncsp->ip_addr_str);
-            freez(ncsp->my_ip_addr_str);
-            freez(ncsp->my_hostname);
-            freez(ncsp->x_forwarded);
-            freez(ncsp->iob->buf);
+         freez(csp->ip_addr_str);
+         freez(csp->my_ip_addr_str);
+         freez(csp->my_hostname);
+         freez(csp->x_forwarded);
+         freez(csp->iob->buf);
 
-            free_http_request(ncsp->http);
+         free_http_request(csp->http);
 
-            destroy_list(ncsp->headers);
-            destroy_list(ncsp->cookie_list);
+         destroy_list(csp->headers);
+         destroy_list(csp->cookie_list);
 
-            free_current_action(ncsp->action);
+         free_current_action(csp->action);
 
 #ifdef FEATURE_STATISTICS
-            urls_read++;
-            if (ncsp->flags & CSP_FLAG_REJECTED)
-            {
-               urls_rejected++;
-            }
+         urls_read++;
+         if (csp->flags & CSP_FLAG_REJECTED)
+         {
+            urls_rejected++;
+         }
 #endif /* def FEATURE_STATISTICS */
 
-            freez(ncsp);
-
-            /* are there any more in sequence after it? */
-            if( (ncsp = csp->next) == NULL)
-               break;
-         }
+         freez(csp);
+         
+         csp = last_active->next;
       }
    }