1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
|
/*
* Copyright (C) Igor Sysoev
*/
#ifndef _NGX_HTTP_CACHE_H_INCLUDED_
#define _NGX_HTTP_CACHE_H_INCLUDED_
#include <ngx_config.h>
#include <ngx_core.h>
#include <ngx_http.h>
/*
* The 3 bits allows the 7 uses before the cache entry allocation.
* We can use maximum 7 bits, i.e up to the 127 uses.
*/
#define NGX_HTTP_CACHE_LAZY_ALLOCATION_BITS 3
typedef struct {
uint32_t crc;
ngx_str_t key;
time_t accessed;
unsigned refs:20; /* 1048576 references */
unsigned count:NGX_HTTP_CACHE_LAZY_ALLOCATION_BITS;
unsigned deleted:1;
unsigned expired:1;
unsigned memory:1;
unsigned mmap:1;
unsigned notify:1;
ngx_fd_t fd;
#if (NGX_USE_HTTP_FILE_CACHE_UNIQ)
ngx_file_uniq_t uniq; /* no needed with kqueue */
#endif
time_t last_modified;
time_t updated;
union {
off_t size;
ngx_str_t value;
} data;
} ngx_http_cache_entry_t;
typedef struct {
time_t expires;
time_t last_modified;
time_t date;
off_t length;
size_t key_len;
char key[1];
} ngx_http_cache_header_t;
#define NGX_HTTP_CACHE_HASH 7
#define NGX_HTTP_CACHE_NELTS 4
typedef struct {
ngx_http_cache_entry_t *elts;
size_t hash;
size_t nelts;
time_t life;
time_t update;
#if (NGX_THREADS)
ngx_mutex_t mutex;
#endif
ngx_pool_t *pool;
} ngx_http_cache_hash_t;
typedef struct {
ngx_http_cache_hash_t *hash;
ngx_http_cache_entry_t *cache;
ngx_file_t file;
ngx_array_t key;
uint32_t crc;
u_char md5[16];
ngx_path_t *path;
ngx_buf_t *buf;
time_t expires;
time_t last_modified;
time_t date;
off_t length;
size_t key_len;
size_t file_start;
ngx_file_uniq_t uniq;
ngx_log_t *log;
/* STUB */
ssize_t header_size;
ngx_str_t key0;
} ngx_http_cache_t;
typedef struct {
ngx_path_t *path;
ngx_str_t key;
ngx_buf_t *buf;
unsigned file:1;
unsigned memory:1;
unsigned primary:1;
} ngx_http_cache_ctx_t;
#define NGX_HTTP_CACHE_STALE 1
#define NGX_HTTP_CACHE_AGED 2
#define NGX_HTTP_CACHE_THE_SAME 3
ngx_int_t ngx_http_cache_get(ngx_http_request_t *r, ngx_http_cache_ctx_t *ctx);
ngx_int_t ngx_http_file_cache_get(ngx_http_request_t *r,
ngx_http_cache_ctx_t *ctx);
ngx_int_t ngx_http_file_cache_open(ngx_http_cache_t *c);
ngx_int_t ngx_http_cache_cleaner_handler(ngx_gc_t *gc, ngx_str_t *name,
ngx_dir_t *dir);
#if 0
ngx_http_cache_t *ngx_http_cache_get(ngx_http_cache_hash_t *cache,
ngx_http_cleanup_t *cleanup,
ngx_str_t *key, uint32_t *crc);
ngx_http_cache_t *ngx_http_cache_alloc(ngx_http_cache_hash_t *hash,
ngx_http_cache_t *cache,
ngx_http_cleanup_t *cleanup,
ngx_str_t *key, uint32_t crc,
ngx_str_t *value, ngx_log_t *log);
void ngx_http_cache_free(ngx_http_cache_t *cache,
ngx_str_t *key, ngx_str_t *value, ngx_log_t *log);
void ngx_http_cache_lock(ngx_http_cache_hash_t *hash, ngx_http_cache_t *cache);
void ngx_http_cache_unlock(ngx_http_cache_hash_t *hash,
ngx_http_cache_t *cache, ngx_log_t *log);
int ngx_http_cache_update_file(ngx_http_request_t *r,ngx_http_cache_ctx_t *ctx,
ngx_str_t *temp_file);
int ngx_http_send_cached(ngx_http_request_t *r);
char *ngx_http_set_cache_slot(ngx_conf_t *cf, ngx_command_t *cmd, void *conf);
#endif
#endif /* _NGX_HTTP_CACHE_H_INCLUDED_ */
|