On 05/24/2008 02:26 PM, [EMAIL PROTECTED] wrote:
Author: niq
Date: Sat May 24 05:26:43 2008
New Revision: 659802

URL: http://svn.apache.org/viewvc?rev=659802&view=rev
Log:
Enforce ttl (where used) on individual resources in an apr_reslist
PR 42841

Modified:
    apr/apr-util/trunk/CHANGES
    apr/apr-util/trunk/misc/apr_reslist.c

Modified: apr/apr-util/trunk/CHANGES
URL: 
http://svn.apache.org/viewvc/apr/apr-util/trunk/CHANGES?rev=659802&r1=659801&r2=659802&view=diff
==============================================================================
--- apr/apr-util/trunk/CHANGES [utf-8] (original)
+++ apr/apr-util/trunk/CHANGES [utf-8] Sat May 24 05:26:43 2008
@@ -1,6 +1,9 @@
                                                      -*- coding: utf-8 -*-
 Changes with APR-util 1.4.0
+ *) Amend apr_reslist to expire resources whose idle time exceeds ttl.
+     PR 42841 [Tom Donovan, Nick Kew]
+
   *) Add DTrace Probes to Hooks, making it easier to inspect APR Hook based
      applications with DTrace. [Theo Schlossnagle <jesus omniti.com>]
Modified: apr/apr-util/trunk/misc/apr_reslist.c
URL: 
http://svn.apache.org/viewvc/apr/apr-util/trunk/misc/apr_reslist.c?rev=659802&r1=659801&r2=659802&view=diff
==============================================================================
--- apr/apr-util/trunk/misc/apr_reslist.c (original)
+++ apr/apr-util/trunk/misc/apr_reslist.c Sat May 24 05:26:43 2008
@@ -292,13 +292,24 @@
 {
     apr_status_t rv;
     apr_res_t *res;
+    apr_time_t now;
apr_thread_mutex_lock(reslist->listlock);
     /* If there are idle resources on the available list, use
      * them right away. */
-    if (reslist->nidle > 0) {
+    now = apr_time_now();
+    while (reslist->nidle > 0) {
         /* Pop off the first resource */
         res = pop_resource(reslist);
+        if (reslist->ttl && (now - res->freed >= reslist->ttl)) {
+            /* this res is expired - kill it */

Sorry for pointing out this that late. I just thought about it again and I 
guess we
have a leak here. I think the following two lines are missing here (before and 
after
destroy_resource):

        reslist->ntotal--;

+            rv = destroy_resource(reslist, res);

        free_container(reslist, res);

+            if (rv != APR_SUCCESS) {
+                apr_thread_mutex_unlock(reslist->listlock);
+                return rv;  /* FIXME: this might cause unnecessary fails */
+            }
+            continue;
+        }
         *resource = res->opaque;
         free_container(reslist, res);
         apr_thread_mutex_unlock(reslist->listlock);


Regards

RĂ¼diger

Reply via email to