httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From "Bill Stoddard" <b...@wstoddard.com>
Subject Re: problem with mod_cache
Date Sat, 15 Jun 2002 00:13:52 GMT
>
>
> --ian
>
> Oh.. is anyone using the new PQ code.. i'd like to know if it is working
> better than what was out there before
>
>

Jean-Jacques reports that the PQ code has introduced a seg fault. I haven't tested this
patch fully but I suspect it will fix the problem (or at least fix a problem).

Index: mod_mem_cache.c
===================================================================
RCS file: /home/cvs/httpd-2.0/modules/experimental/mod_mem_cache.c,v
retrieving revision 1.70
diff -u -r1.70 mod_mem_cache.c
--- mod_mem_cache.c 10 Jun 2002 21:10:08 -0000 1.70
+++ mod_mem_cache.c 14 Jun 2002 23:26:35 -0000
@@ -192,28 +192,52 @@
 }
 /**
  * callback to free an entry
- * XXX: just call cleanup_cache_object ?
+ * There is way too much magic in this code. Right now, this callback
+ * is only called out of cache_insert() which is called under protection
+ * of the sconf->lock, which means that we do not (and should not)
+ * attempt to obtain the lock recursively.
+ * The cache API needs some serious cleanup work...
  */
 static void memcache_cache_free(void*a)
 {
     cache_object_t *obj = (cache_object_t *)a;
-    cleanup_cache_object(obj);
+
+    /* Cleanup the cache object. Object should be removed from the cache
+     * now. Increment the refcount before setting cleanup to avoid a race
+     * condition. A similar pattern is used in remove_url()
+     */
+#ifdef USE_ATOMICS
+    apr_atomic_inc(&obj->refcount);
+#else
+    obj->refcount++;
+#endif
+
+    obj->cleanup = 1;
+
+#ifdef USE_ATOMICS
+    apr_atomic_dec(&obj->refcount);
+#else
+    obj->refcount--;
+#endif
+    if (!obj->refcount) {
+        cleanup_cache_object(obj);
+    }
 }
 /*
  * functions return a 'negative' score as lower is better in a priority Q



Mime
View raw message