changeset 1765:b0cbe16febaf

use ngx_queue.h
author Igor Sysoev <igor@sysoev.ru>
date Fri, 21 Dec 2007 15:33:15 +0000
parents bead8ca82404
children 111eb827ed44
files src/core/ngx_open_file_cache.c src/core/ngx_open_file_cache.h
diffstat 2 files changed, 24 insertions(+), 44 deletions(-) [+]
line wrap: on
line diff
--- a/src/core/ngx_open_file_cache.c
+++ b/src/core/ngx_open_file_cache.c
@@ -41,15 +41,11 @@ ngx_open_file_cache_init(ngx_pool_t *poo
         return NULL;
     }
 
-    cache->list_head.prev = NULL;
-    cache->list_head.next = &cache->list_tail;
-
-    cache->list_tail.prev = &cache->list_head;
-    cache->list_tail.next = NULL;
-
     ngx_rbtree_init(&cache->rbtree, &cache->sentinel,
                     ngx_open_file_cache_rbtree_insert_value);
 
+    ngx_queue_init(&cache->expire_queue);
+
     cache->current = 0;
     cache->max = max;
     cache->inactive = inactive;
@@ -71,6 +67,7 @@ ngx_open_file_cache_cleanup(void *data)
 {
     ngx_open_file_cache_t  *cache = data;
 
+    ngx_queue_t             *q;
     ngx_cached_open_file_t  *file;
 
     ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
@@ -78,14 +75,15 @@ ngx_open_file_cache_cleanup(void *data)
 
     for ( ;; ) {
 
-        file = cache->list_tail.prev;
-
-        if (file == &cache->list_head) {
-            break;
+        if (ngx_queue_empty(&cache->expire_queue)) {
+            return;
         }
 
-        file->next->prev = file->prev;
-        file->prev->next = file->next;
+        q = ngx_queue_last(&cache->expire_queue);
+
+        file = ngx_queue_data(q, ngx_cached_open_file_t, queue);
+
+        ngx_queue_remove(q);
 
         ngx_rbtree_delete(&cache->rbtree, &file->node);
 
@@ -189,8 +187,7 @@ ngx_open_cached_file(ngx_open_file_cache
 
             if (rc == 0) {
 
-                file->next->prev = file->prev;
-                file->prev->next = file->next;
+                ngx_queue_remove(&file->queue);
 
                 if (file->event || now - file->created < of->retest) {
                     if (file->err == 0) {
@@ -413,12 +410,7 @@ found:
 
     file->accessed = now;
 
-    /* add to the inactive list head */
-
-    file->next = cache->list_head.next;
-    file->next->prev = file;
-    file->prev = &cache->list_head;
-    cache->list_head.next = file;
+    ngx_queue_insert_head(&cache->expire_queue, &file->queue);
 
     ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0,
                    "cached open file: %s, fd:%d, c:%d, e:%d",
@@ -563,20 +555,9 @@ ngx_close_cached_file(ngx_open_file_cach
 
         file->accessed = ngx_time();
 
-        if (cache->list_head.next != file) {
-
-            /* delete from inactive list */
-
-            file->next->prev = file->prev;
-            file->prev->next = file->next;
+        ngx_queue_remove(&file->queue);
 
-            /* add to the inactive list head */
-
-            file->next = cache->list_head.next;
-            file->next->prev = file;
-            file->prev = &cache->list_head;
-            cache->list_head.next = file;
-        }
+        ngx_queue_insert_head(&cache->expire_queue, &file->queue);
 
         return;
     }
@@ -609,6 +590,7 @@ ngx_expire_old_cached_files(ngx_open_fil
     ngx_log_t *log)
 {
     time_t                   now;
+    ngx_queue_t             *q;
     ngx_cached_open_file_t  *file;
 
     now = ngx_time();
@@ -621,18 +603,19 @@ ngx_expire_old_cached_files(ngx_open_fil
 
     while (n < 3) {
 
-        file = cache->list_tail.prev;
-
-        if (file == &cache->list_head) {
+        if (ngx_queue_empty(&cache->expire_queue)) {
             return;
         }
 
+        q = ngx_queue_last(&cache->expire_queue);
+
+        file = ngx_queue_data(q, ngx_cached_open_file_t, queue);
+
         if (n++ != 0 && now - file->accessed <= cache->inactive) {
             return;
         }
 
-        file->next->prev = file->prev;
-        file->prev->next = file->next;
+        ngx_queue_remove(q);
 
         ngx_rbtree_delete(&cache->rbtree, &file->node);
 
@@ -703,8 +686,7 @@ ngx_open_file_cache_remove(ngx_event_t *
     fev = ev->data;
     file = fev->file;
 
-    file->next->prev = file->prev;
-    file->prev->next = file->next;
+    ngx_queue_remove(&file->queue);
 
     ngx_rbtree_delete(&fev->cache->rbtree, &file->node);
 
--- a/src/core/ngx_open_file_cache.h
+++ b/src/core/ngx_open_file_cache.h
@@ -36,8 +36,7 @@ typedef struct ngx_cached_open_file_s  n
 
 struct ngx_cached_open_file_s {
     ngx_rbtree_node_t        node;
-    ngx_cached_open_file_t  *prev;
-    ngx_cached_open_file_t  *next;
+    ngx_queue_t              queue;
 
     u_char                  *name;
     time_t                   created;
@@ -64,8 +63,7 @@ struct ngx_cached_open_file_s {
 typedef struct {
     ngx_rbtree_t             rbtree;
     ngx_rbtree_node_t        sentinel;
-    ngx_cached_open_file_t   list_head;
-    ngx_cached_open_file_t   list_tail;
+    ngx_queue_t              expire_queue;
 
     ngx_uint_t               current;
     ngx_uint_t               max;