Mercurial > hg > nginx
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 |