diff options
author | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2019-06-15 20:22:55 +0300 |
---|---|---|
committer | Evgeny Grin (Karlson2k) <k2k@narod.ru> | 2019-06-16 21:42:46 +0300 |
commit | 8646d3e461b4803d8d100096ff247919bf9fc571 (patch) | |
tree | a2854c8cd85f540e3086f7bcb7c773d175c04966 | |
parent | c98aa3d33472f82014e9cd80d1a3bf0ee9fe80c1 (diff) | |
download | libmicrohttpd-8646d3e461b4803d8d100096ff247919bf9fc571.tar.gz libmicrohttpd-8646d3e461b4803d8d100096ff247919bf9fc571.zip |
memorypool: round mmap allocation for page size
-rw-r--r-- | configure.ac | 2 | ||||
-rw-r--r-- | src/microhttpd/daemon.c | 1 | ||||
-rw-r--r-- | src/microhttpd/memorypool.c | 87 | ||||
-rw-r--r-- | src/microhttpd/memorypool.h | 6 |
4 files changed, 78 insertions, 18 deletions
diff --git a/configure.ac b/configure.ac index 92d59f1b..5c68b1be 100644 --- a/configure.ac +++ b/configure.ac | |||
@@ -1202,6 +1202,8 @@ have_inet6=no | |||
1202 | ]) | 1202 | ]) |
1203 | AC_MSG_RESULT($have_inet6) | 1203 | AC_MSG_RESULT($have_inet6) |
1204 | 1204 | ||
1205 | MHD_CHECK_FUNC([[sysconf]], [[#include <unitstd.h>]], [[long a = sysconf(0); if (a) return 1;]]) | ||
1206 | |||
1205 | HIDDEN_VISIBILITY_CFLAGS="" | 1207 | HIDDEN_VISIBILITY_CFLAGS="" |
1206 | AS_CASE(["$host"], | 1208 | AS_CASE(["$host"], |
1207 | [*-*-mingw*],[ | 1209 | [*-*-mingw*],[ |
diff --git a/src/microhttpd/daemon.c b/src/microhttpd/daemon.c index 2729bb21..b5d151b4 100644 --- a/src/microhttpd/daemon.c +++ b/src/microhttpd/daemon.c | |||
@@ -7185,6 +7185,7 @@ MHD_init(void) | |||
7185 | #ifdef HAVE_FREEBSD_SENDFILE | 7185 | #ifdef HAVE_FREEBSD_SENDFILE |
7186 | MHD_conn_init_static_ (); | 7186 | MHD_conn_init_static_ (); |
7187 | #endif /* HAVE_FREEBSD_SENDFILE */ | 7187 | #endif /* HAVE_FREEBSD_SENDFILE */ |
7188 | MHD_init_mem_pools_ (); | ||
7188 | } | 7189 | } |
7189 | 7190 | ||
7190 | 7191 | ||
diff --git a/src/microhttpd/memorypool.c b/src/microhttpd/memorypool.c index a6053fb2..5067e950 100644 --- a/src/microhttpd/memorypool.c +++ b/src/microhttpd/memorypool.c | |||
@@ -35,6 +35,14 @@ | |||
35 | #ifdef _WIN32 | 35 | #ifdef _WIN32 |
36 | #include <windows.h> | 36 | #include <windows.h> |
37 | #endif | 37 | #endif |
38 | #ifdef HAVE_SYSCONF | ||
39 | #include <unistd.h> | ||
40 | #if defined(_SC_PAGE_SIZE) | ||
41 | #define MHD_SC_PAGESIZE _SC_PAGE_SIZE | ||
42 | #elif defined(_SC_PAGESIZE) | ||
43 | #define MHD_SC_PAGESIZE _SC_PAGESIZE | ||
44 | #endif /* _SC_PAGESIZE */ | ||
45 | #endif /* HAVE_SYSCONF */ | ||
38 | 46 | ||
39 | /* define MAP_ANONYMOUS for Mac OS X */ | 47 | /* define MAP_ANONYMOUS for Mac OS X */ |
40 | #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS) | 48 | #if defined(MAP_ANON) && !defined(MAP_ANONYMOUS) |
@@ -56,6 +64,40 @@ | |||
56 | */ | 64 | */ |
57 | #define ROUND_TO_ALIGN(n) (((n)+(ALIGN_SIZE-1)) / (ALIGN_SIZE) * (ALIGN_SIZE)) | 65 | #define ROUND_TO_ALIGN(n) (((n)+(ALIGN_SIZE-1)) / (ALIGN_SIZE) * (ALIGN_SIZE)) |
58 | 66 | ||
67 | #if defined(PAGE_SIZE) | ||
68 | #define MHD_DEF_PAGE_SIZE_ PAGE_SIZE | ||
69 | #elif defined(PAGESIZE) | ||
70 | #define MHD_DEF_PAGE_SIZE_ PAGE_SIZE | ||
71 | #else /* ! PAGESIZE */ | ||
72 | #define MHD_DEF_PAGE_SIZE_ (4096) | ||
73 | #endif /* ! PAGESIZE */ | ||
74 | |||
75 | /** | ||
76 | * Size of memory page | ||
77 | */ | ||
78 | static size_t MHD_sys_page_size_ = MHD_DEF_PAGE_SIZE_; /* Default fallback value */ | ||
79 | |||
80 | /** | ||
81 | * Initilise values for memory pools | ||
82 | */ | ||
83 | void | ||
84 | MHD_init_mem_pools_ (void) | ||
85 | { | ||
86 | #ifdef MHD_SC_PAGESIZE | ||
87 | long result; | ||
88 | result = sysconf (MHD_SC_PAGESIZE); | ||
89 | if (-1 != result) | ||
90 | MHD_sys_page_size_ = (size_t) result; | ||
91 | else | ||
92 | MHD_sys_page_size_ = MHD_DEF_PAGE_SIZE_; | ||
93 | #elif defined(_WIN32) | ||
94 | SYSTEM_INFO si; | ||
95 | GetSystemInfo (&si); | ||
96 | MHD_sys_page_size_ = (size_t)si.dwPageSize; | ||
97 | #else | ||
98 | MHD_sys_page_size_ = MHD_DEF_PAGE_SIZE_; | ||
99 | #endif /* _WIN32 */ | ||
100 | } | ||
59 | 101 | ||
60 | /** | 102 | /** |
61 | * Handle for a memory pool. Pools are not reentrant and must not be | 103 | * Handle for a memory pool. Pools are not reentrant and must not be |
@@ -101,34 +143,41 @@ struct MemoryPool * | |||
101 | MHD_pool_create (size_t max) | 143 | MHD_pool_create (size_t max) |
102 | { | 144 | { |
103 | struct MemoryPool *pool; | 145 | struct MemoryPool *pool; |
146 | size_t alloc_size; | ||
104 | 147 | ||
105 | max = ROUND_TO_ALIGN(max); | ||
106 | pool = malloc (sizeof (struct MemoryPool)); | 148 | pool = malloc (sizeof (struct MemoryPool)); |
107 | if (NULL == pool) | 149 | if (NULL == pool) |
108 | return NULL; | 150 | return NULL; |
109 | #if defined(MAP_ANONYMOUS) || defined(_WIN32) | 151 | #if defined(MAP_ANONYMOUS) || defined(_WIN32) |
110 | if (max <= 32 * 1024) | 152 | if ( (max <= 32 * 1024) || |
153 | (max < MHD_sys_page_size_ * 4 / 3) ) | ||
111 | pool->memory = MAP_FAILED; | 154 | pool->memory = MAP_FAILED; |
112 | else | 155 | else |
156 | { | ||
157 | /* Round up allocation to page granularity. */ | ||
158 | alloc_size = max + MHD_sys_page_size_ - 1; | ||
159 | alloc_size -= alloc_size % MHD_sys_page_size_; | ||
113 | #if defined(MAP_ANONYMOUS) && !defined(_WIN32) | 160 | #if defined(MAP_ANONYMOUS) && !defined(_WIN32) |
114 | pool->memory = mmap (NULL, | 161 | pool->memory = mmap (NULL, |
115 | max, | 162 | alloc_size, |
116 | PROT_READ | PROT_WRITE, | 163 | PROT_READ | PROT_WRITE, |
117 | MAP_PRIVATE | MAP_ANONYMOUS, | 164 | MAP_PRIVATE | MAP_ANONYMOUS, |
118 | -1, | 165 | -1, |
119 | 0); | 166 | 0); |
120 | #elif defined(_WIN32) | 167 | #elif defined(_WIN32) |
121 | pool->memory = VirtualAlloc (NULL, | 168 | pool->memory = VirtualAlloc (NULL, |
122 | max, | 169 | alloc_size, |
123 | MEM_COMMIT | MEM_RESERVE, | 170 | MEM_COMMIT | MEM_RESERVE, |
124 | PAGE_READWRITE); | 171 | PAGE_READWRITE); |
125 | #endif | 172 | #endif /* _WIN32 */ |
126 | #else | 173 | } |
174 | #else /* ! _WIN32 && ! MAP_ANONYMOUS */ | ||
127 | pool->memory = MAP_FAILED; | 175 | pool->memory = MAP_FAILED; |
128 | #endif | 176 | #endif /* ! _WIN32 && ! MAP_ANONYMOUS */ |
129 | if (MAP_FAILED == pool->memory) | 177 | if (MAP_FAILED == pool->memory) |
130 | { | 178 | { |
131 | pool->memory = malloc (max); | 179 | alloc_size = ROUND_TO_ALIGN(max); |
180 | pool->memory = malloc (alloc_size); | ||
132 | if (NULL == pool->memory) | 181 | if (NULL == pool->memory) |
133 | { | 182 | { |
134 | free (pool); | 183 | free (pool); |
@@ -136,13 +185,15 @@ MHD_pool_create (size_t max) | |||
136 | } | 185 | } |
137 | pool->is_mmap = false; | 186 | pool->is_mmap = false; |
138 | } | 187 | } |
188 | #if defined(MAP_ANONYMOUS) || defined(_WIN32) | ||
139 | else | 189 | else |
140 | { | 190 | { |
141 | pool->is_mmap = true; | 191 | pool->is_mmap = true; |
142 | } | 192 | } |
193 | #endif /* _WIN32 || MAP_ANONYMOUS */ | ||
143 | pool->pos = 0; | 194 | pool->pos = 0; |
144 | pool->end = max; | 195 | pool->end = alloc_size; |
145 | pool->size = max; | 196 | pool->size = alloc_size; |
146 | return pool; | 197 | return pool; |
147 | } | 198 | } |
148 | 199 | ||
diff --git a/src/microhttpd/memorypool.h b/src/microhttpd/memorypool.h index c5fe7ada..abd53365 100644 --- a/src/microhttpd/memorypool.h +++ b/src/microhttpd/memorypool.h | |||
@@ -43,6 +43,12 @@ | |||
43 | */ | 43 | */ |
44 | struct MemoryPool; | 44 | struct MemoryPool; |
45 | 45 | ||
46 | /** | ||
47 | * Initilise values for memory pools | ||
48 | */ | ||
49 | void | ||
50 | MHD_init_mem_pools_ (void); | ||
51 | |||
46 | 52 | ||
47 | /** | 53 | /** |
48 | * Create a memory pool. | 54 | * Create a memory pool. |