[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [libmicrohttpd] 02/10: memorypool: round mmap allocation fo
From: |
gnunet |
Subject: |
[GNUnet-SVN] [libmicrohttpd] 02/10: memorypool: round mmap allocation for page size |
Date: |
Mon, 17 Jun 2019 20:35:45 +0200 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit 8646d3e461b4803d8d100096ff247919bf9fc571
Author: Evgeny Grin (Karlson2k) <address@hidden>
AuthorDate: Sat Jun 15 20:22:55 2019 +0300
memorypool: round mmap allocation for page size
---
configure.ac | 2 ++
src/microhttpd/daemon.c | 1 +
src/microhttpd/memorypool.c | 87 +++++++++++++++++++++++++++++++++++----------
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
])
AC_MSG_RESULT($have_inet6)
+MHD_CHECK_FUNC([[sysconf]], [[#include <unitstd.h>]], [[long a = sysconf(0);
if (a) return 1;]])
+
HIDDEN_VISIBILITY_CFLAGS=""
AS_CASE(["$host"],
[*-*-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)
#ifdef HAVE_FREEBSD_SENDFILE
MHD_conn_init_static_ ();
#endif /* HAVE_FREEBSD_SENDFILE */
+ MHD_init_mem_pools_ ();
}
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 @@
#ifdef _WIN32
#include <windows.h>
#endif
+#ifdef HAVE_SYSCONF
+#include <unistd.h>
+#if defined(_SC_PAGE_SIZE)
+#define MHD_SC_PAGESIZE _SC_PAGE_SIZE
+#elif defined(_SC_PAGESIZE)
+#define MHD_SC_PAGESIZE _SC_PAGESIZE
+#endif /* _SC_PAGESIZE */
+#endif /* HAVE_SYSCONF */
/* define MAP_ANONYMOUS for Mac OS X */
#if defined(MAP_ANON) && !defined(MAP_ANONYMOUS)
@@ -56,6 +64,40 @@
*/
#define ROUND_TO_ALIGN(n) (((n)+(ALIGN_SIZE-1)) / (ALIGN_SIZE) * (ALIGN_SIZE))
+#if defined(PAGE_SIZE)
+#define MHD_DEF_PAGE_SIZE_ PAGE_SIZE
+#elif defined(PAGESIZE)
+#define MHD_DEF_PAGE_SIZE_ PAGE_SIZE
+#else /* ! PAGESIZE */
+#define MHD_DEF_PAGE_SIZE_ (4096)
+#endif /* ! PAGESIZE */
+
+/**
+ * Size of memory page
+ */
+static size_t MHD_sys_page_size_ = MHD_DEF_PAGE_SIZE_; /* Default fallback
value */
+
+/**
+ * Initilise values for memory pools
+ */
+void
+MHD_init_mem_pools_ (void)
+{
+#ifdef MHD_SC_PAGESIZE
+ long result;
+ result = sysconf (MHD_SC_PAGESIZE);
+ if (-1 != result)
+ MHD_sys_page_size_ = (size_t) result;
+ else
+ MHD_sys_page_size_ = MHD_DEF_PAGE_SIZE_;
+#elif defined(_WIN32)
+ SYSTEM_INFO si;
+ GetSystemInfo (&si);
+ MHD_sys_page_size_ = (size_t)si.dwPageSize;
+#else
+ MHD_sys_page_size_ = MHD_DEF_PAGE_SIZE_;
+#endif /* _WIN32 */
+}
/**
* Handle for a memory pool. Pools are not reentrant and must not be
@@ -101,34 +143,41 @@ struct MemoryPool *
MHD_pool_create (size_t max)
{
struct MemoryPool *pool;
+ size_t alloc_size;
- max = ROUND_TO_ALIGN(max);
pool = malloc (sizeof (struct MemoryPool));
if (NULL == pool)
return NULL;
#if defined(MAP_ANONYMOUS) || defined(_WIN32)
- if (max <= 32 * 1024)
+ if ( (max <= 32 * 1024) ||
+ (max < MHD_sys_page_size_ * 4 / 3) )
pool->memory = MAP_FAILED;
else
+ {
+ /* Round up allocation to page granularity. */
+ alloc_size = max + MHD_sys_page_size_ - 1;
+ alloc_size -= alloc_size % MHD_sys_page_size_;
#if defined(MAP_ANONYMOUS) && !defined(_WIN32)
- pool->memory = mmap (NULL,
- max,
- PROT_READ | PROT_WRITE,
- MAP_PRIVATE | MAP_ANONYMOUS,
- -1,
- 0);
+ pool->memory = mmap (NULL,
+ alloc_size,
+ PROT_READ | PROT_WRITE,
+ MAP_PRIVATE | MAP_ANONYMOUS,
+ -1,
+ 0);
#elif defined(_WIN32)
- pool->memory = VirtualAlloc (NULL,
- max,
- MEM_COMMIT | MEM_RESERVE,
- PAGE_READWRITE);
-#endif
-#else
+ pool->memory = VirtualAlloc (NULL,
+ alloc_size,
+ MEM_COMMIT | MEM_RESERVE,
+ PAGE_READWRITE);
+#endif /* _WIN32 */
+ }
+#else /* ! _WIN32 && ! MAP_ANONYMOUS */
pool->memory = MAP_FAILED;
-#endif
+#endif /* ! _WIN32 && ! MAP_ANONYMOUS */
if (MAP_FAILED == pool->memory)
{
- pool->memory = malloc (max);
+ alloc_size = ROUND_TO_ALIGN(max);
+ pool->memory = malloc (alloc_size);
if (NULL == pool->memory)
{
free (pool);
@@ -136,13 +185,15 @@ MHD_pool_create (size_t max)
}
pool->is_mmap = false;
}
+#if defined(MAP_ANONYMOUS) || defined(_WIN32)
else
{
pool->is_mmap = true;
}
+#endif /* _WIN32 || MAP_ANONYMOUS */
pool->pos = 0;
- pool->end = max;
- pool->size = max;
+ pool->end = alloc_size;
+ pool->size = alloc_size;
return pool;
}
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 @@
*/
struct MemoryPool;
+/**
+ * Initilise values for memory pools
+ */
+void
+MHD_init_mem_pools_ (void);
+
/**
* Create a memory pool.
--
To stop receiving notification emails like this one, please contact
address@hidden.
- [GNUnet-SVN] [libmicrohttpd] branch master updated (d12ed49f -> 55dc42e6), gnunet, 2019/06/17
- [GNUnet-SVN] [libmicrohttpd] 04/10: memorypool: comments minor improvements, gnunet, 2019/06/17
- [GNUnet-SVN] [libmicrohttpd] 05/10: MHD_pool_reallocate(): never allocate additional buffer when shrinking, gnunet, 2019/06/17
- [GNUnet-SVN] [libmicrohttpd] 07/10: transmit_error_response(): discard read buffer to free space for error response, gnunet, 2019/06/17
- [GNUnet-SVN] [libmicrohttpd] 09/10: try_ready_chunked_body(): remove useless loop, use know free memory size instead of guessing, gnunet, 2019/06/17
- [GNUnet-SVN] [libmicrohttpd] 01/10: memorypool: fixed MHD_pool_reset(), gnunet, 2019/06/17
- [GNUnet-SVN] [libmicrohttpd] 03/10: memorypool: re-commit memory on W32 when resetting pool, gnunet, 2019/06/17
- [GNUnet-SVN] [libmicrohttpd] 06/10: test_long_header: use power of two for size to properly test allocations, test various buffer sizes, gnunet, 2019/06/17
- [GNUnet-SVN] [libmicrohttpd] 02/10: memorypool: round mmap allocation for page size,
gnunet <=
- [GNUnet-SVN] [libmicrohttpd] 10/10: Optimised read buffer allocation, gnunet, 2019/06/17
- [GNUnet-SVN] [libmicrohttpd] 08/10: process_request_body(): do not move data if nothing was processed, gnunet, 2019/06/17