[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]
[GNUnet-SVN] [libmicrohttpd] 10/10: Optimised read buffer allocation
From: |
gnunet |
Subject: |
[GNUnet-SVN] [libmicrohttpd] 10/10: Optimised read buffer allocation |
Date: |
Mon, 17 Jun 2019 20:35:53 +0200 |
This is an automated email from the git hooks/post-receive script.
karlson2k pushed a commit to branch master
in repository libmicrohttpd.
commit 55dc42e6045022da41c538d226874dbf563a85ed
Author: Evgeny Grin (Karlson2k) <address@hidden>
AuthorDate: Sun Jun 16 23:15:13 2019 +0300
Optimised read buffer allocation
---
src/microhttpd/connection.c | 66 ++++++++++++++++++++++++++++++---------------
src/microhttpd/internal.h | 2 +-
2 files changed, 46 insertions(+), 22 deletions(-)
diff --git a/src/microhttpd/connection.c b/src/microhttpd/connection.c
index a97844c2..877f514b 100644
--- a/src/microhttpd/connection.c
+++ b/src/microhttpd/connection.c
@@ -1575,28 +1575,51 @@ get_date_string (char *date,
* minimum necessary at that point.
*
* @param connection the connection
- * @return #MHD_YES on success, #MHD_NO on failure
+ * @param required set to 'true' if grow is required, i.e. connection
+ * will fail if no additional space is granted
+ * @return 'true' on success, 'false' on failure
*/
-static int
-try_grow_read_buffer (struct MHD_Connection *connection)
+static bool
+try_grow_read_buffer (struct MHD_Connection *connection,
+ bool required)
{
- void *buf;
size_t new_size;
+ size_t avail_size;
+ avail_size = MHD_pool_get_free (connection->pool);
+ if (0 == avail_size)
+ return false; /* No more space available */
if (0 == connection->read_buffer_size)
- new_size = connection->daemon->pool_size / 2;
+ new_size = avail_size / 2; /* Use half of available buffer for reading */
else
- new_size = connection->read_buffer_size + MHD_BUF_INC_SIZE;
- buf = MHD_pool_reallocate (connection->pool,
- connection->read_buffer,
- connection->read_buffer_size,
- new_size);
- if (NULL == buf)
- return MHD_NO;
+ {
+ size_t grow_size;
+
+ grow_size = avail_size / 8;
+ if (MHD_BUF_INC_SIZE > grow_size)
+ { /* Shortage of space */
+ if (!required)
+ return false; /* Grow is not mandatory, leave some space in pool */
+ else
+ {
+ /* Shortage of space, but grow is mandatory */
+ static const size_t small_inc = MHD_BUF_INC_SIZE / 8;
+ if (small_inc < avail_size)
+ grow_size = small_inc;
+ else
+ grow_size = avail_size;
+ }
+ }
+ new_size = connection->read_buffer_size + grow_size;
+ }
/* we can actually grow the buffer, do it! */
- connection->read_buffer = buf;
+ connection->read_buffer = MHD_pool_reallocate (connection->pool,
+ connection->read_buffer,
+ connection->read_buffer_size,
+ new_size);
+ mhd_assert (NULL != connection->read_buffer);
connection->read_buffer_size = new_size;
- return MHD_YES;
+ return true;
}
@@ -2097,7 +2120,7 @@ MHD_connection_update_event_loop_info (struct
MHD_Connection *connection)
/* while reading headers, we always grow the
read buffer if needed, no size-check required */
if ( (connection->read_buffer_offset ==
connection->read_buffer_size) &&
- (MHD_NO == try_grow_read_buffer (connection)) )
+ (!try_grow_read_buffer (connection, true)) )
{
transmit_error_response (connection,
(connection->url != NULL)
@@ -2123,9 +2146,10 @@ MHD_connection_update_event_loop_info (struct
MHD_Connection *connection)
case MHD_CONNECTION_CONTINUE_SENT:
if (connection->read_buffer_offset == connection->read_buffer_size)
{
- if ((MHD_YES != try_grow_read_buffer (connection)) &&
- (0 != (connection->daemon->options &
- MHD_USE_INTERNAL_POLLING_THREAD)))
+ const bool internal_poll = (0 != (connection->daemon->options &
+ MHD_USE_INTERNAL_POLLING_THREAD));
+ if ( (!try_grow_read_buffer (connection, true)) &&
+ internal_poll)
{
/* failed to grow the read buffer, and the
client which is supposed to handle the
@@ -2244,8 +2268,7 @@ get_next_header_line (struct MHD_Connection *connection,
{
/* not found, consider growing... */
if ( (connection->read_buffer_offset == connection->read_buffer_size) &&
- (MHD_NO ==
- try_grow_read_buffer (connection)) )
+ (!try_grow_read_buffer (connection, true)) )
{
transmit_error_response (connection,
(NULL != connection->url)
@@ -3157,7 +3180,8 @@ MHD_connection_handle_read (struct MHD_Connection
*connection)
in buffer to use per system call (if possible) */
if (connection->read_buffer_offset + connection->daemon->pool_increment >
connection->read_buffer_size)
- try_grow_read_buffer (connection);
+ try_grow_read_buffer (connection,
+ (connection->read_buffer_size ==
connection->read_buffer_offset));
if (connection->read_buffer_size == connection->read_buffer_offset)
return; /* No space for receiving data. */
diff --git a/src/microhttpd/internal.h b/src/microhttpd/internal.h
index 97ac050f..8dc813a2 100644
--- a/src/microhttpd/internal.h
+++ b/src/microhttpd/internal.h
@@ -93,7 +93,7 @@
/**
- * Minimum size by which MHD tries to increment read/write buffers.
+ * Minimum reasonable size by which MHD tries to increment read/write buffers.
* We usually begin with half the available pool space for the
* IO-buffer, but if absolutely needed we additively grow by the
* number of bytes given here (up to -- theoretically -- the full 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, 2019/06/17
- [GNUnet-SVN] [libmicrohttpd] 10/10: Optimised read buffer allocation,
gnunet <=
- [GNUnet-SVN] [libmicrohttpd] 08/10: process_request_body(): do not move data if nothing was processed, gnunet, 2019/06/17