|  | 
 | /* | 
 |  * Copyright (C) Igor Sysoev | 
 |  * Copyright (C) Nginx, Inc. | 
 |  */ | 
 |  | 
 |  | 
 | #ifndef _NGX_HTTP_CACHE_H_INCLUDED_ | 
 | #define _NGX_HTTP_CACHE_H_INCLUDED_ | 
 |  | 
 |  | 
 | #include <ngx_config.h> | 
 | #include <ngx_core.h> | 
 | #include <ngx_http.h> | 
 |  | 
 |  | 
 | #define NGX_HTTP_CACHE_MISS          1 | 
 | #define NGX_HTTP_CACHE_BYPASS        2 | 
 | #define NGX_HTTP_CACHE_EXPIRED       3 | 
 | #define NGX_HTTP_CACHE_STALE         4 | 
 | #define NGX_HTTP_CACHE_UPDATING      5 | 
 | #define NGX_HTTP_CACHE_REVALIDATED   6 | 
 | #define NGX_HTTP_CACHE_HIT           7 | 
 | #define NGX_HTTP_CACHE_SCARCE        8 | 
 |  | 
 | #define NGX_HTTP_CACHE_KEY_LEN       16 | 
 | #define NGX_HTTP_CACHE_ETAG_LEN      128 | 
 | #define NGX_HTTP_CACHE_VARY_LEN      128 | 
 |  | 
 | #define NGX_HTTP_CACHE_VERSION       5 | 
 |  | 
 |  | 
 | typedef struct { | 
 |     ngx_uint_t                       status; | 
 |     time_t                           valid; | 
 | } ngx_http_cache_valid_t; | 
 |  | 
 |  | 
 | typedef struct { | 
 |     ngx_rbtree_node_t                node; | 
 |     ngx_queue_t                      queue; | 
 |  | 
 |     u_char                           key[NGX_HTTP_CACHE_KEY_LEN | 
 |                                          - sizeof(ngx_rbtree_key_t)]; | 
 |  | 
 |     unsigned                         count:20; | 
 |     unsigned                         uses:10; | 
 |     unsigned                         valid_msec:10; | 
 |     unsigned                         error:10; | 
 |     unsigned                         exists:1; | 
 |     unsigned                         updating:1; | 
 |     unsigned                         deleting:1; | 
 |     unsigned                         purged:1; | 
 |                                      /* 10 unused bits */ | 
 |  | 
 |     ngx_file_uniq_t                  uniq; | 
 |     time_t                           expire; | 
 |     time_t                           valid_sec; | 
 |     size_t                           body_start; | 
 |     off_t                            fs_size; | 
 |     ngx_msec_t                       lock_time; | 
 | } ngx_http_file_cache_node_t; | 
 |  | 
 |  | 
 | struct ngx_http_cache_s { | 
 |     ngx_file_t                       file; | 
 |     ngx_array_t                      keys; | 
 |     uint32_t                         crc32; | 
 |     u_char                           key[NGX_HTTP_CACHE_KEY_LEN]; | 
 |     u_char                           main[NGX_HTTP_CACHE_KEY_LEN]; | 
 |  | 
 |     ngx_file_uniq_t                  uniq; | 
 |     time_t                           valid_sec; | 
 |     time_t                           updating_sec; | 
 |     time_t                           error_sec; | 
 |     time_t                           last_modified; | 
 |     time_t                           date; | 
 |  | 
 |     ngx_str_t                        etag; | 
 |     ngx_str_t                        vary; | 
 |     u_char                           variant[NGX_HTTP_CACHE_KEY_LEN]; | 
 |  | 
 |     size_t                           header_start; | 
 |     size_t                           body_start; | 
 |     off_t                            length; | 
 |     off_t                            fs_size; | 
 |  | 
 |     ngx_uint_t                       min_uses; | 
 |     ngx_uint_t                       error; | 
 |     ngx_uint_t                       valid_msec; | 
 |     ngx_uint_t                       vary_tag; | 
 |  | 
 |     ngx_buf_t                       *buf; | 
 |  | 
 |     ngx_http_file_cache_t           *file_cache; | 
 |     ngx_http_file_cache_node_t      *node; | 
 |  | 
 | #if (NGX_THREADS || NGX_COMPAT) | 
 |     ngx_thread_task_t               *thread_task; | 
 | #endif | 
 |  | 
 |     ngx_msec_t                       lock_timeout; | 
 |     ngx_msec_t                       lock_age; | 
 |     ngx_msec_t                       lock_time; | 
 |     ngx_msec_t                       wait_time; | 
 |  | 
 |     ngx_event_t                      wait_event; | 
 |  | 
 |     unsigned                         lock:1; | 
 |     unsigned                         waiting:1; | 
 |  | 
 |     unsigned                         updated:1; | 
 |     unsigned                         updating:1; | 
 |     unsigned                         exists:1; | 
 |     unsigned                         temp_file:1; | 
 |     unsigned                         purged:1; | 
 |     unsigned                         reading:1; | 
 |     unsigned                         secondary:1; | 
 |     unsigned                         background:1; | 
 |  | 
 |     unsigned                         stale_updating:1; | 
 |     unsigned                         stale_error:1; | 
 | }; | 
 |  | 
 |  | 
 | typedef struct { | 
 |     ngx_uint_t                       version; | 
 |     time_t                           valid_sec; | 
 |     time_t                           updating_sec; | 
 |     time_t                           error_sec; | 
 |     time_t                           last_modified; | 
 |     time_t                           date; | 
 |     uint32_t                         crc32; | 
 |     u_short                          valid_msec; | 
 |     u_short                          header_start; | 
 |     u_short                          body_start; | 
 |     u_char                           etag_len; | 
 |     u_char                           etag[NGX_HTTP_CACHE_ETAG_LEN]; | 
 |     u_char                           vary_len; | 
 |     u_char                           vary[NGX_HTTP_CACHE_VARY_LEN]; | 
 |     u_char                           variant[NGX_HTTP_CACHE_KEY_LEN]; | 
 | } ngx_http_file_cache_header_t; | 
 |  | 
 |  | 
 | typedef struct { | 
 |     ngx_rbtree_t                     rbtree; | 
 |     ngx_rbtree_node_t                sentinel; | 
 |     ngx_queue_t                      queue; | 
 |     ngx_atomic_t                     cold; | 
 |     ngx_atomic_t                     loading; | 
 |     off_t                            size; | 
 |     ngx_uint_t                       count; | 
 |     ngx_uint_t                       watermark; | 
 | } ngx_http_file_cache_sh_t; | 
 |  | 
 |  | 
 | struct ngx_http_file_cache_s { | 
 |     ngx_http_file_cache_sh_t        *sh; | 
 |     ngx_slab_pool_t                 *shpool; | 
 |  | 
 |     ngx_path_t                      *path; | 
 |  | 
 |     off_t                            max_size; | 
 |     size_t                           bsize; | 
 |  | 
 |     time_t                           inactive; | 
 |  | 
 |     time_t                           fail_time; | 
 |  | 
 |     ngx_uint_t                       files; | 
 |     ngx_uint_t                       loader_files; | 
 |     ngx_msec_t                       last; | 
 |     ngx_msec_t                       loader_sleep; | 
 |     ngx_msec_t                       loader_threshold; | 
 |  | 
 |     ngx_uint_t                       manager_files; | 
 |     ngx_msec_t                       manager_sleep; | 
 |     ngx_msec_t                       manager_threshold; | 
 |  | 
 |     ngx_shm_zone_t                  *shm_zone; | 
 |  | 
 |     ngx_uint_t                       use_temp_path; | 
 |                                      /* unsigned use_temp_path:1 */ | 
 | }; | 
 |  | 
 |  | 
 | ngx_int_t ngx_http_file_cache_new(ngx_http_request_t *r); | 
 | ngx_int_t ngx_http_file_cache_create(ngx_http_request_t *r); | 
 | void ngx_http_file_cache_create_key(ngx_http_request_t *r); | 
 | ngx_int_t ngx_http_file_cache_open(ngx_http_request_t *r); | 
 | ngx_int_t ngx_http_file_cache_set_header(ngx_http_request_t *r, u_char *buf); | 
 | void ngx_http_file_cache_update(ngx_http_request_t *r, ngx_temp_file_t *tf); | 
 | void ngx_http_file_cache_update_header(ngx_http_request_t *r); | 
 | ngx_int_t ngx_http_cache_send(ngx_http_request_t *); | 
 | void ngx_http_file_cache_free(ngx_http_cache_t *c, ngx_temp_file_t *tf); | 
 | time_t ngx_http_file_cache_valid(ngx_array_t *cache_valid, ngx_uint_t status); | 
 |  | 
 | char *ngx_http_file_cache_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, | 
 |     void *conf); | 
 | char *ngx_http_file_cache_valid_set_slot(ngx_conf_t *cf, ngx_command_t *cmd, | 
 |     void *conf); | 
 |  | 
 |  | 
 | extern ngx_str_t  ngx_http_cache_status[]; | 
 |  | 
 |  | 
 | #endif /* _NGX_HTTP_CACHE_H_INCLUDED_ */ |