use ngx_queue.h
diff --git a/src/event/ngx_event_openssl.c b/src/event/ngx_event_openssl.c
index ce65ccc..b6b7014 100644
--- a/src/event/ngx_event_openssl.c
+++ b/src/event/ngx_event_openssl.c
@@ -1234,11 +1234,7 @@
ngx_rbtree_init(&cache->session_rbtree, &cache->sentinel,
ngx_ssl_session_rbtree_insert_value);
- cache->session_cache_head.prev = NULL;
- cache->session_cache_head.next = &cache->session_cache_tail;
-
- cache->session_cache_tail.prev = &cache->session_cache_head;
- cache->session_cache_tail.next = NULL;
+ ngx_queue_init(&cache->expire_queue);
shm_zone->data = cache;
@@ -1353,10 +1349,7 @@
sess_id->expire = ngx_time() + SSL_CTX_get_timeout(ssl_ctx);
- sess_id->next = cache->session_cache_head.next;
- sess_id->next->prev = sess_id;
- sess_id->prev = &cache->session_cache_head;
- cache->session_cache_head.next = sess_id;
+ ngx_queue_insert_head(&cache->expire_queue, &sess_id->queue);
ngx_rbtree_insert(&cache->session_rbtree, &sess_id->node);
@@ -1456,8 +1449,7 @@
return sess;
}
- sess_id->next->prev = sess_id->prev;
- sess_id->prev->next = sess_id->next;
+ ngx_queue_remove(&sess_id->queue);
ngx_rbtree_delete(&cache->session_rbtree, node);
@@ -1539,8 +1531,8 @@
rc = ngx_memn2cmp(id, sess_id->id, len, (size_t) node->data);
if (rc == 0) {
- sess_id->next->prev = sess_id->prev;
- sess_id->prev->next = sess_id->next;
+
+ ngx_queue_remove(&sess_id->queue);
ngx_rbtree_delete(&cache->session_rbtree, node);
@@ -1571,30 +1563,32 @@
ngx_slab_pool_t *shpool, ngx_uint_t n)
{
time_t now;
+ ngx_queue_t *q;
ngx_ssl_sess_id_t *sess_id;
now = ngx_time();
while (n < 3) {
- sess_id = cache->session_cache_tail.prev;
-
- if (sess_id == &cache->session_cache_head) {
+ if (ngx_queue_empty(&cache->expire_queue)) {
return;
}
+ q = ngx_queue_last(&cache->expire_queue);
+
+ sess_id = ngx_queue_data(q, ngx_ssl_sess_id_t, queue);
+
if (n++ != 0 && sess_id->expire > now) {
return;
}
- sess_id->next->prev = sess_id->prev;
- sess_id->prev->next = sess_id->next;
-
- ngx_rbtree_delete(&cache->session_rbtree, &sess_id->node);
+ ngx_queue_remove(q);
ngx_log_debug1(NGX_LOG_DEBUG_EVENT, ngx_cycle->log, 0,
"expire session: %08Xi", sess_id->node.key);
+ ngx_rbtree_delete(&cache->session_rbtree, &sess_id->node);
+
ngx_slab_free_locked(shpool, sess_id->session);
#if (NGX_PTR_SIZE == 4)
ngx_slab_free_locked(shpool, sess_id->id);
diff --git a/src/event/ngx_event_openssl.h b/src/event/ngx_event_openssl.h
index 504cc67..05d6014 100644
--- a/src/event/ngx_event_openssl.h
+++ b/src/event/ngx_event_openssl.h
@@ -64,8 +64,7 @@
u_char *id;
size_t len;
u_char *session;
- ngx_ssl_sess_id_t *prev;
- ngx_ssl_sess_id_t *next;
+ ngx_queue_t queue;
time_t expire;
#if (NGX_PTR_SIZE == 8)
void *stub;
@@ -77,8 +76,7 @@
typedef struct {
ngx_rbtree_t session_rbtree;
ngx_rbtree_node_t sentinel;
- ngx_ssl_sess_id_t session_cache_head;
- ngx_ssl_sess_id_t session_cache_tail;
+ ngx_queue_t expire_queue;
} ngx_ssl_session_cache_t;