]>
Commit | Line | Data |
---|---|---|
1 | /* | |
2 | * Copyright (C) 1996-2021 The Squid Software Foundation and contributors | |
3 | * | |
4 | * Squid software is distributed under GPLv2+ license and includes | |
5 | * contributions from numerous individuals and organizations. | |
6 | * Please see the COPYING and CONTRIBUTORS files for details. | |
7 | */ | |
8 | ||
9 | /* | |
10 | * DiskThreads.h | |
11 | * | |
12 | * Internal declarations for the DiskThreads routines | |
13 | */ | |
14 | ||
15 | #ifndef __DISKTHREADS_H__ | |
16 | #define __DISKTHREADS_H__ | |
17 | ||
18 | #include "dlink.h" | |
19 | #include "mem/forward.h" | |
20 | ||
21 | /* this non-standard-conformant include is needed in order to have stat(2) and struct stat | |
22 | properly defined on some systems (e.g. OpenBSD 5.4) */ | |
23 | #if HAVE_SYS_STAT_H | |
24 | #include <sys/stat.h> | |
25 | #endif | |
26 | ||
27 | #if AUFS_IO_THREADS | |
28 | #define NUMTHREADS AUFS_IO_THREADS | |
29 | #else | |
30 | #define NUMTHREADS (Config.cacheSwap.n_configured*16) | |
31 | #endif | |
32 | ||
33 | /* Queue limit where swapouts are deferred (load calculation) */ | |
34 | #define MAGIC1 (NUMTHREADS*Config.cacheSwap.n_configured*5) | |
35 | /* Queue limit where swapins are deferred (open/create fails) */ | |
36 | #define MAGIC2 (NUMTHREADS*Config.cacheSwap.n_configured*20) | |
37 | ||
38 | /* Which operations to run async */ | |
39 | #define ASYNC_OPEN 1 | |
40 | #define ASYNC_CLOSE 0 | |
41 | #define ASYNC_CREATE 1 | |
42 | #define ASYNC_WRITE 0 | |
43 | #define ASYNC_READ 1 | |
44 | ||
45 | enum _squidaio_request_type { | |
46 | _AIO_OP_NONE = 0, | |
47 | _AIO_OP_OPEN, | |
48 | _AIO_OP_READ, | |
49 | _AIO_OP_WRITE, | |
50 | _AIO_OP_CLOSE, | |
51 | _AIO_OP_UNLINK, | |
52 | _AIO_OP_OPENDIR, | |
53 | _AIO_OP_STAT | |
54 | }; | |
55 | typedef enum _squidaio_request_type squidaio_request_type; | |
56 | ||
57 | typedef void AIOCB(int fd, void *cbdata, const char *buf, int aio_return, int aio_errno); | |
58 | ||
59 | class squidaio_result_t | |
60 | { | |
61 | public: | |
62 | int aio_return = 0; | |
63 | int aio_errno = 0; | |
64 | enum _squidaio_request_type result_type = _AIO_OP_NONE; | |
65 | void *_data = nullptr; /* Internal housekeeping */ | |
66 | void *data = nullptr; /* Available to the caller */ | |
67 | }; | |
68 | ||
69 | class squidaio_ctrl_t | |
70 | { | |
71 | MEMPROXY_CLASS(squidaio_ctrl_t); | |
72 | public: | |
73 | squidaio_ctrl_t() : done_handler(NULL), free_func(NULL) {} | |
74 | ||
75 | squidaio_ctrl_t *next = nullptr; | |
76 | int fd = 0; | |
77 | int operation = 0; | |
78 | AIOCB *done_handler; | |
79 | void *done_handler_data = nullptr; | |
80 | squidaio_result_t result; | |
81 | int len = 0; | |
82 | char *bufp = nullptr; | |
83 | FREE *free_func; | |
84 | dlink_node node; | |
85 | }; | |
86 | ||
87 | void squidaio_init(void); | |
88 | void squidaio_shutdown(void); | |
89 | int squidaio_cancel(squidaio_result_t *); | |
90 | int squidaio_open(const char *, int, mode_t, squidaio_result_t *); | |
91 | int squidaio_read(int, char *, size_t, off_t, int, squidaio_result_t *); | |
92 | int squidaio_write(int, char *, size_t, off_t, int, squidaio_result_t *); | |
93 | int squidaio_close(int, squidaio_result_t *); | |
94 | ||
95 | int squidaio_stat(const char *, struct stat *, squidaio_result_t *); | |
96 | int squidaio_unlink(const char *, squidaio_result_t *); | |
97 | int squidaio_opendir(const char *, squidaio_result_t *); | |
98 | squidaio_result_t *squidaio_poll_done(void); | |
99 | int squidaio_operations_pending(void); | |
100 | int squidaio_sync(void); | |
101 | int squidaio_get_queue_len(void); | |
102 | void *squidaio_xmalloc(int size); | |
103 | void squidaio_xfree(void *p, int size); | |
104 | void squidaio_stats(StoreEntry *); | |
105 | ||
106 | void aioInit(void); | |
107 | void aioDone(void); | |
108 | void aioCancel(int); | |
109 | void aioOpen(const char *, int, mode_t, AIOCB *, void *); | |
110 | void aioClose(int); | |
111 | void aioWrite(int, off_t offset, char *, size_t size, AIOCB *, void *, FREE *); | |
112 | void aioRead(int, off_t offset, size_t size, AIOCB *, void *); | |
113 | ||
114 | void aioStat(char *, struct stat *, AIOCB *, void *); | |
115 | void aioUnlink(const char *, AIOCB *, void *); | |
116 | int aioQueueSize(void); | |
117 | ||
118 | #include "DiskIO/DiskFile.h" | |
119 | ||
120 | class DiskThreadsIOStrategy; | |
121 | ||
122 | class AIOCounts | |
123 | { | |
124 | public: | |
125 | uint64_t open_start = 0; | |
126 | uint64_t open_finish = 0; | |
127 | uint64_t close_start = 0; | |
128 | uint64_t close_finish = 0; | |
129 | uint64_t cancel = 0; | |
130 | uint64_t write_start = 0; | |
131 | uint64_t write_finish = 0; | |
132 | uint64_t read_start = 0; | |
133 | uint64_t read_finish = 0; | |
134 | uint64_t stat_start = 0; | |
135 | uint64_t stat_finish = 0; | |
136 | uint64_t unlink_start = 0; | |
137 | uint64_t unlink_finish = 0; | |
138 | uint64_t check_callback = 0; | |
139 | }; | |
140 | ||
141 | extern AIOCounts squidaio_counts; | |
142 | extern dlink_list used_list; | |
143 | ||
144 | #endif | |
145 |