ngx_open_file_cache.h revision e18a033b
1
2/*
3 * Copyright (C) Igor Sysoev
4 * Copyright (C) Nginx, Inc.
5 */
6
7
8#include <ngx_config.h>
9#include <ngx_core.h>
10
11
12#ifndef _NGX_OPEN_FILE_CACHE_H_INCLUDED_
13#define _NGX_OPEN_FILE_CACHE_H_INCLUDED_
14
15
16#define NGX_OPEN_FILE_DIRECTIO_OFF  NGX_MAX_OFF_T_VALUE
17
18
19typedef struct {
20    ngx_fd_t                 fd;
21    ngx_file_uniq_t          uniq;
22    time_t                   mtime;
23    off_t                    size;
24    off_t                    fs_size;
25    off_t                    directio;
26    size_t                   read_ahead;
27
28    ngx_err_t                err;
29    char                    *failed;
30
31    time_t                   valid;
32
33    ngx_uint_t               min_uses;
34
35#if (NGX_HAVE_OPENAT)
36    size_t                   disable_symlinks_from;
37    unsigned                 disable_symlinks:2;
38#endif
39
40    unsigned                 test_dir:1;
41    unsigned                 test_only:1;
42    unsigned                 log:1;
43    unsigned                 errors:1;
44    unsigned                 events:1;
45
46    unsigned                 is_dir:1;
47    unsigned                 is_file:1;
48    unsigned                 is_link:1;
49    unsigned                 is_exec:1;
50    unsigned                 is_directio:1;
51} ngx_open_file_info_t;
52
53
54typedef struct ngx_cached_open_file_s  ngx_cached_open_file_t;
55
56struct ngx_cached_open_file_s {
57    ngx_rbtree_node_t        node;
58    ngx_queue_t              queue;
59
60    u_char                  *name;
61    time_t                   created;
62    time_t                   accessed;
63
64    ngx_fd_t                 fd;
65    ngx_file_uniq_t          uniq;
66    time_t                   mtime;
67    off_t                    size;
68    ngx_err_t                err;
69
70    uint32_t                 uses;
71
72#if (NGX_HAVE_OPENAT)
73    size_t                   disable_symlinks_from;
74    unsigned                 disable_symlinks:2;
75#endif
76
77    unsigned                 count:24;
78    unsigned                 close:1;
79    unsigned                 use_event:1;
80
81    unsigned                 is_dir:1;
82    unsigned                 is_file:1;
83    unsigned                 is_link:1;
84    unsigned                 is_exec:1;
85    unsigned                 is_directio:1;
86
87    ngx_event_t             *event;
88};
89
90
91typedef struct {
92    ngx_rbtree_t             rbtree;
93    ngx_rbtree_node_t        sentinel;
94    ngx_queue_t              expire_queue;
95
96    ngx_uint_t               current;
97    ngx_uint_t               max;
98    time_t                   inactive;
99} ngx_open_file_cache_t;
100
101
102typedef struct {
103    ngx_open_file_cache_t   *cache;
104    ngx_cached_open_file_t  *file;
105    ngx_uint_t               min_uses;
106    ngx_log_t               *log;
107} ngx_open_file_cache_cleanup_t;
108
109
110typedef struct {
111
112    /* ngx_connection_t stub to allow use c->fd as event ident */
113    void                    *data;
114    ngx_event_t             *read;
115    ngx_event_t             *write;
116    ngx_fd_t                 fd;
117
118    ngx_cached_open_file_t  *file;
119    ngx_open_file_cache_t   *cache;
120} ngx_open_file_cache_event_t;
121
122
123ngx_open_file_cache_t *ngx_open_file_cache_init(ngx_pool_t *pool,
124    ngx_uint_t max, time_t inactive);
125ngx_int_t ngx_open_cached_file(ngx_open_file_cache_t *cache, ngx_str_t *name,
126    ngx_open_file_info_t *of, ngx_pool_t *pool);
127
128
129#endif /* _NGX_OPEN_FILE_CACHE_H_INCLUDED_ */
130