httpd-dev mailing list archives

Site index · List index
Message view « Date » · « Thread »
Top « Date » · « Thread »
From Davi Arnaut <d...@haxent.com.br>
Subject [patch 15/16] fix a FIXME (clean cache_object_t)
Date Wed, 20 Sep 2006 02:34:08 GMT
Move members from cache_object_t to mem_cache_object_t that are only
required for mod_mem_cache.

Index: modules/cache/mod_cache.h
===================================================================
--- modules/cache/mod_cache.h.orig
+++ modules/cache/mod_cache.h
@@ -181,23 +181,12 @@
 
 /* cache handle information */
 
-/* XXX TODO On the next structure change/MMN bump, 
- * count must become an apr_off_t, representing
- * the potential size of disk cached objects.
- * Then dig for
- * "XXX Bad Temporary Cast - see cache_object_t notes" 
- */
 typedef struct cache_object cache_object_t;
 struct cache_object {
     const char *key;
-    cache_object_t *next;
     cache_info info;
     /* Opaque portion (specific to the implementation) of the cache object */
     void *vobj;
-    /* FIXME: These are only required for mod_mem_cache. */
-    apr_size_t count;   /* Number of body bytes written to the cache so far */
-    int complete;
-    apr_uint32_t refcount;  /* refcount and bit flag to cleanup object */
 };
 
 typedef struct cache_handle cache_handle_t;
Index: modules/cache/mod_mem_cache.c
===================================================================
--- modules/cache/mod_mem_cache.c.orig
+++ modules/cache/mod_mem_cache.c
@@ -71,9 +71,10 @@
     apr_int32_t flags;          /* File open flags */
     long priority;      /**< the priority of this entry */
     long total_refs;          /**< total number of references this entry has had */
-
     apr_uint32_t pos;   /**< the position of this entry in the cache */
-
+    apr_off_t count;   /* Number of body bytes written to the cache so far */
+    int complete;
+    apr_uint32_t refcount;  /* refcount and bit flag to cleanup object */
 } mem_cache_object_t;
 
 typedef struct
@@ -162,11 +163,12 @@
 static void memcache_cache_free(void *a)
 {
     cache_object_t *obj = (cache_object_t *) a;
+    mem_cache_object_t *mobj = obj->vobj;
 
     /* Decrement the refcount to account for the object being ejected
      * from the cache. If the refcount is 0, free the object.
      */
-    if (!apr_atomic_dec32(&obj->refcount)) {
+    if (!apr_atomic_dec32(&mobj->refcount)) {
         cleanup_cache_object(obj);
     }
 }
@@ -225,6 +227,7 @@
 static apr_status_t decrement_refcount(void *arg)
 {
     cache_object_t *obj = (cache_object_t *) arg;
+    mem_cache_object_t *mobj = obj->vobj;
 
     /* If obj->complete is not set, the cache update failed and the
      * object needs to be removed from the cache then cleaned up.
@@ -232,7 +235,7 @@
      * cache already, so make sure it is really still in the cache
      * before attempting to remove it.
      */
-    if (!obj->complete) {
+    if (!mobj->complete) {
         cache_object_t *tobj = NULL;
         if (sconf->lock) {
             apr_thread_mutex_lock(sconf->lock);
@@ -240,7 +243,7 @@
         tobj = cache_find(sconf->cache_cache, obj->key);
         if (tobj == obj) {
             cache_remove(sconf->cache_cache, obj);
-            apr_atomic_dec32(&obj->refcount);
+            apr_atomic_dec32(&mobj->refcount);
         }
         if (sconf->lock) {
             apr_thread_mutex_unlock(sconf->lock);
@@ -248,7 +251,7 @@
     }
 
     /* If the refcount drops to 0, cleanup the cache object */
-    if (!apr_atomic_dec32(&obj->refcount)) {
+    if (!apr_atomic_dec32(&mobj->refcount)) {
         cleanup_cache_object(obj);
     }
     return APR_SUCCESS;
@@ -257,6 +260,7 @@
 static apr_status_t cleanup_cache_mem(void *sconfv)
 {
     cache_object_t *obj;
+    mem_cache_object_t *mobj;
     mem_cache_conf *co = (mem_cache_conf *) sconfv;
 
     if (!co) {
@@ -271,8 +275,9 @@
     }
     obj = cache_pop(co->cache_cache);
     while (obj) {
+        mobj = obj->vobj;
         /* Iterate over the cache and clean up each unreferenced entry */
-        if (!apr_atomic_dec32(&obj->refcount)) {
+        if (!apr_atomic_dec32(&mobj->refcount)) {
             cleanup_cache_object(obj);
         }
         obj = cache_pop(co->cache_cache);
@@ -364,9 +369,9 @@
     mobj->pool = pool;
 
     /* Finish initing the cache object */
-    apr_atomic_set32(&obj->refcount, 1);
+    apr_atomic_set32(&mobj->refcount, 1);
     mobj->total_refs = 1;
-    obj->complete = 0;
+    mobj->complete = 0;
     obj->vobj = mobj;
     /* Safe cast: We tested < sconf->max_cache_object_size above */
     mobj->m_len = (apr_size_t) len;
@@ -390,12 +395,13 @@
     tmp_obj = (cache_object_t *) cache_find(sconf->cache_cache, key);
 
     if (!tmp_obj) {
+        mem_cache_object_t *tmp_mobj = obj->vobj;
         cache_insert(sconf->cache_cache, obj);
         /* Add a refcount to account for the reference by the
          * hashtable in the cache. Refcount should be 2 now, one
          * for this thread, and one for the cache.
          */
-        apr_atomic_inc32(&obj->refcount);
+        apr_atomic_inc32(&tmp_mobj->refcount);
     }
     if (sconf->lock) {
         apr_thread_mutex_unlock(sconf->lock);
@@ -434,6 +440,7 @@
 static int open_entity(cache_handle_t * h, request_rec *r, const char *key)
 {
     cache_object_t *obj;
+    mem_cache_object_t *mobj;
 
     /* Look up entity keyed to 'url' */
     if (sconf->lock) {
@@ -441,9 +448,10 @@
     }
     obj = (cache_object_t *) cache_find(sconf->cache_cache, key);
     if (obj) {
-        if (obj->complete) {
+        mobj = obj->vobj;
+        if (mobj->complete) {
             request_rec *rmain = r, *rtmp;
-            apr_atomic_inc32(&obj->refcount);
+            apr_atomic_inc32(&mobj->refcount);
             /* cache is worried about overall counts, not 'open' ones */
             cache_update(sconf->cache_cache, obj);
 
@@ -502,8 +510,9 @@
      */
     tobj = cache_find(sconf->cache_cache, obj->key);
     if (tobj == obj) {
+        mem_cache_object_t *mobj = obj->vobj;
         cache_remove(sconf->cache_cache, obj);
-        apr_atomic_dec32(&obj->refcount);
+        apr_atomic_dec32(&mobj->refcount);
     }
 
     if (sconf->lock) {
@@ -525,9 +534,10 @@
 
     obj = h->cache_obj;
     if (obj) {
+        mem_cache_object_t *mobj = obj->vobj;
         cache_remove(sconf->cache_cache, obj);
         /* For performance, cleanup cache object after releasing the lock */
-        cleanup = !apr_atomic_dec32(&obj->refcount);
+        cleanup = !apr_atomic_dec32(&mobj->refcount);
     }
     if (sconf->lock) {
         apr_thread_mutex_unlock(sconf->lock);
@@ -651,7 +661,7 @@
          * so decrement the refcount
          * apr_atomic_dec32(&obj->refcount);
          */
-        mobj->m_len = obj->count;
+        mobj->m_len = mobj->count;
 
         cache_insert(sconf->cache_cache, obj);
         /* For illustration, cache now has reference to the object, so
@@ -668,9 +678,9 @@
     }
     else {
         /* Object has been ejected from the cache, add it back to the cache */
-        mobj->m_len = obj->count;
+        mobj->m_len = mobj->count;
         cache_insert(sconf->cache_cache, obj);
-        apr_atomic_inc32(&obj->refcount);
+        apr_atomic_inc32(&mobj->refcount);
     }
 
     if (sconf->lock) {
@@ -733,7 +743,7 @@
             ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
                          "mem_cache: Cached file: %s with key: %s", name,
                          obj->key);
-            obj->complete = 1;
+            mobj->complete = 1;
             return APR_SUCCESS;
         }
 
@@ -750,9 +760,9 @@
         if (mobj->m == NULL) {
             return APR_ENOMEM;
         }
-        obj->count = 0;
+        mobj->count = 0;
     }
-    cur = (char *) mobj->m + obj->count;
+    cur = (char *) mobj->m + mobj->count;
 
     /* Iterate accross the brigade and populate the cache storage */
     for (e = APR_BRIGADE_FIRST(b);
@@ -761,11 +771,11 @@
         apr_size_t len;
 
         if (APR_BUCKET_IS_EOS(e)) {
-            if (mobj->m_len > obj->count) {
+            if (mobj->m_len > mobj->count) {
                 /* Caching a streamed response. Reallocate a buffer of the
                  * correct size and copy the streamed response into that
                  * buffer */
-                mobj->m = realloc(mobj->m, obj->count);
+                mobj->m = realloc(mobj->m, mobj->count);
 
                 if (!mobj->m) {
                     return APR_ENOMEM;
@@ -776,7 +786,7 @@
             /* Open for business */
             ap_log_error(APLOG_MARK, APLOG_INFO, 0, r->server,
                          "mem_cache: Cached url: %s", obj->key);
-            obj->complete = 1;
+            mobj->complete = 1;
             break;
         }
         rv = apr_bucket_read(e, &s, &len, eblock);
@@ -785,19 +795,19 @@
         }
         if (len) {
             /* Check for buffer overflow */
-            if ((obj->count + len) > mobj->m_len) {
+            if ((mobj->count + len) > mobj->m_len) {
                 return APR_ENOMEM;
             }
             else {
                 memcpy(cur, s, len);
                 cur += len;
-                obj->count += len;
+                mobj->count += len;
             }
         }
         /* This should not fail, but if it does, we are in BIG trouble
          * cause we just stomped all over the heap.
          */
-        AP_DEBUG_ASSERT(obj->count <= mobj->m_len);
+        AP_DEBUG_ASSERT(mobj->count <= mobj->m_len);
     }
     return APR_SUCCESS;
 }
Index: include/ap_mmn.h
===================================================================
--- include/ap_mmn.h.orig
+++ include/ap_mmn.h
@@ -123,12 +123,14 @@
  * 20060110.4 (2.3.0-dev)  Added server_scheme member to server_rec (minor)
  * 20060905.0 (2.3.0-dev)  Replaced ap_get_server_version() with
  *                         ap_get_server_banner() and ap_get_server_description()
+ * 20060917.0 (2.3.0-dev)  Moved members from cache_object_t to mem_cache_object_t
+ *                         that are only required for mod_mem_cache
  */
 
 #define MODULE_MAGIC_COOKIE 0x41503234UL /* "AP24" */
 
 #ifndef MODULE_MAGIC_NUMBER_MAJOR
-#define MODULE_MAGIC_NUMBER_MAJOR 20060905
+#define MODULE_MAGIC_NUMBER_MAJOR 20060917
 #endif
 #define MODULE_MAGIC_NUMBER_MINOR 0                     /* 0...n */
 

--

Mime
View raw message