comparison src/core/ngx_open_file_cache.c @ 1765:b0cbe16febaf

use ngx_queue.h
author Igor Sysoev <igor@sysoev.ru>
date Fri, 21 Dec 2007 15:33:15 +0000
parents 1c4b231ba90c
children 111eb827ed44
comparison
equal deleted inserted replaced
1764:bead8ca82404 1765:b0cbe16febaf
39 cache = ngx_palloc(pool, sizeof(ngx_open_file_cache_t)); 39 cache = ngx_palloc(pool, sizeof(ngx_open_file_cache_t));
40 if (cache == NULL) { 40 if (cache == NULL) {
41 return NULL; 41 return NULL;
42 } 42 }
43 43
44 cache->list_head.prev = NULL;
45 cache->list_head.next = &cache->list_tail;
46
47 cache->list_tail.prev = &cache->list_head;
48 cache->list_tail.next = NULL;
49
50 ngx_rbtree_init(&cache->rbtree, &cache->sentinel, 44 ngx_rbtree_init(&cache->rbtree, &cache->sentinel,
51 ngx_open_file_cache_rbtree_insert_value); 45 ngx_open_file_cache_rbtree_insert_value);
46
47 ngx_queue_init(&cache->expire_queue);
52 48
53 cache->current = 0; 49 cache->current = 0;
54 cache->max = max; 50 cache->max = max;
55 cache->inactive = inactive; 51 cache->inactive = inactive;
56 52
69 static void 65 static void
70 ngx_open_file_cache_cleanup(void *data) 66 ngx_open_file_cache_cleanup(void *data)
71 { 67 {
72 ngx_open_file_cache_t *cache = data; 68 ngx_open_file_cache_t *cache = data;
73 69
70 ngx_queue_t *q;
74 ngx_cached_open_file_t *file; 71 ngx_cached_open_file_t *file;
75 72
76 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0, 73 ngx_log_debug0(NGX_LOG_DEBUG_CORE, ngx_cycle->log, 0,
77 "open file cache cleanup"); 74 "open file cache cleanup");
78 75
79 for ( ;; ) { 76 for ( ;; ) {
80 77
81 file = cache->list_tail.prev; 78 if (ngx_queue_empty(&cache->expire_queue)) {
82 79 return;
83 if (file == &cache->list_head) { 80 }
84 break; 81
85 } 82 q = ngx_queue_last(&cache->expire_queue);
86 83
87 file->next->prev = file->prev; 84 file = ngx_queue_data(q, ngx_cached_open_file_t, queue);
88 file->prev->next = file->next; 85
86 ngx_queue_remove(q);
89 87
90 ngx_rbtree_delete(&cache->rbtree, &file->node); 88 ngx_rbtree_delete(&cache->rbtree, &file->node);
91 89
92 cache->current--; 90 cache->current--;
93 91
187 185
188 rc = ngx_strcmp(name->data, file->name); 186 rc = ngx_strcmp(name->data, file->name);
189 187
190 if (rc == 0) { 188 if (rc == 0) {
191 189
192 file->next->prev = file->prev; 190 ngx_queue_remove(&file->queue);
193 file->prev->next = file->next;
194 191
195 if (file->event || now - file->created < of->retest) { 192 if (file->event || now - file->created < of->retest) {
196 if (file->err == 0) { 193 if (file->err == 0) {
197 of->fd = file->fd; 194 of->fd = file->fd;
198 of->uniq = file->uniq; 195 of->uniq = file->uniq;
411 408
412 found: 409 found:
413 410
414 file->accessed = now; 411 file->accessed = now;
415 412
416 /* add to the inactive list head */ 413 ngx_queue_insert_head(&cache->expire_queue, &file->queue);
417
418 file->next = cache->list_head.next;
419 file->next->prev = file;
420 file->prev = &cache->list_head;
421 cache->list_head.next = file;
422 414
423 ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0, 415 ngx_log_debug4(NGX_LOG_DEBUG_CORE, pool->log, 0,
424 "cached open file: %s, fd:%d, c:%d, e:%d", 416 "cached open file: %s, fd:%d, c:%d, e:%d",
425 file->name, file->fd, file->count, file->err); 417 file->name, file->fd, file->count, file->err);
426 418
561 553
562 if (!file->close) { 554 if (!file->close) {
563 555
564 file->accessed = ngx_time(); 556 file->accessed = ngx_time();
565 557
566 if (cache->list_head.next != file) { 558 ngx_queue_remove(&file->queue);
567 559
568 /* delete from inactive list */ 560 ngx_queue_insert_head(&cache->expire_queue, &file->queue);
569
570 file->next->prev = file->prev;
571 file->prev->next = file->next;
572
573 /* add to the inactive list head */
574
575 file->next = cache->list_head.next;
576 file->next->prev = file;
577 file->prev = &cache->list_head;
578 cache->list_head.next = file;
579 }
580 561
581 return; 562 return;
582 } 563 }
583 564
584 if (file->event) { 565 if (file->event) {
607 static void 588 static void
608 ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, ngx_uint_t n, 589 ngx_expire_old_cached_files(ngx_open_file_cache_t *cache, ngx_uint_t n,
609 ngx_log_t *log) 590 ngx_log_t *log)
610 { 591 {
611 time_t now; 592 time_t now;
593 ngx_queue_t *q;
612 ngx_cached_open_file_t *file; 594 ngx_cached_open_file_t *file;
613 595
614 now = ngx_time(); 596 now = ngx_time();
615 597
616 /* 598 /*
619 * and one or two inactive files 601 * and one or two inactive files
620 */ 602 */
621 603
622 while (n < 3) { 604 while (n < 3) {
623 605
624 file = cache->list_tail.prev; 606 if (ngx_queue_empty(&cache->expire_queue)) {
625
626 if (file == &cache->list_head) {
627 return; 607 return;
628 } 608 }
609
610 q = ngx_queue_last(&cache->expire_queue);
611
612 file = ngx_queue_data(q, ngx_cached_open_file_t, queue);
629 613
630 if (n++ != 0 && now - file->accessed <= cache->inactive) { 614 if (n++ != 0 && now - file->accessed <= cache->inactive) {
631 return; 615 return;
632 } 616 }
633 617
634 file->next->prev = file->prev; 618 ngx_queue_remove(q);
635 file->prev->next = file->next;
636 619
637 ngx_rbtree_delete(&cache->rbtree, &file->node); 620 ngx_rbtree_delete(&cache->rbtree, &file->node);
638 621
639 cache->current--; 622 cache->current--;
640 623
701 ngx_open_file_cache_event_t *fev; 684 ngx_open_file_cache_event_t *fev;
702 685
703 fev = ev->data; 686 fev = ev->data;
704 file = fev->file; 687 file = fev->file;
705 688
706 file->next->prev = file->prev; 689 ngx_queue_remove(&file->queue);
707 file->prev->next = file->next;
708 690
709 ngx_rbtree_delete(&fev->cache->rbtree, &file->node); 691 ngx_rbtree_delete(&fev->cache->rbtree, &file->node);
710 692
711 fev->cache->current--; 693 fev->cache->current--;
712 694