gnunet-svn
[Top][All Lists]
Advanced

[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[libmicrohttpd] branch master updated: perf_replies: added various respo


From: gnunet
Subject: [libmicrohttpd] branch master updated: perf_replies: added various response sizes, minor fixes
Date: Tue, 04 Jul 2023 22:03:21 +0200

This is an automated email from the git hooks/post-receive script.

karlson2k pushed a commit to branch master
in repository libmicrohttpd.

The following commit(s) were added to refs/heads/master by this push:
     new 72d1acb3 perf_replies: added various response sizes, minor fixes
72d1acb3 is described below

commit 72d1acb323bed49921f1cd9f890e919c874aa1c7
Author: Evgeny Grin (Karlson2k) <k2k@narod.ru>
AuthorDate: Tue Jul 4 22:35:38 2023 +0300

    perf_replies: added various response sizes, minor fixes
---
 src/tools/perf_replies.c | 280 +++++++++++++++++++++++++++++++++++++++++++++--
 1 file changed, 270 insertions(+), 10 deletions(-)

diff --git a/src/tools/perf_replies.c b/src/tools/perf_replies.c
index 0f890941..2fd58c12 100644
--- a/src/tools/perf_replies.c
+++ b/src/tools/perf_replies.c
@@ -73,6 +73,7 @@ static char self_name[500] = "perf_replies";
 static uint16_t mhd_port = 0;
 static struct MHD_Response **resps = NULL;
 static unsigned int num_resps = 0;
+static char *body_dyn = NULL; /* Non-static body data */
 
 static void
 set_self_name (int argc, char *const *argv)
@@ -340,11 +341,17 @@ show_help (void)
     printf ("          --poll            use poll() function\n");
   printf ("          --select          use select() function\n");
   printf ("\n");
+  printf ("Response size options (mutually exclusive):\n");
+  printf ("  -E,     --empty           empty response, 0 bytes\n");
+  printf ("  -T,     --tiny            tiny response, 3 bytes (default)\n");
+  printf ("  -M,     --medium          medium response, 8 KB\n");
+  printf ("  -L,     --large           large response, 1 MB\n");
+  printf ("\n");
   printf ("Other options:\n");
   printf ("  -c NUM, --connections=NUM reject more than NUM client \n"
           "                            connections\n");
   printf ("  -O NUM, --timeout=NUM     set connection timeout to NUM 
seconds,\n"
-          "                            zero means no timeout");
+          "                            zero means no timeout\n");
   printf ("          --date-header     use the 'Date:' header in every\n"
           "                            reply\n");
   printf ("          --help            display this help and exit\n");
@@ -363,6 +370,10 @@ struct PerfRepl_parameters
   int epoll;
   int poll;
   int select;
+  int empty;
+  int tiny;
+  int medium;
+  int large;
   unsigned int connections;
   unsigned int timeout;
   int date_header;
@@ -381,6 +392,10 @@ static struct PerfRepl_parameters tool_params = {
   0,
   0,
   0,
+  0,
+  0,
+  0,
+  0,
   0
 };
 
@@ -500,6 +515,114 @@ process_param__select (const char *param_name)
 }
 
 
+static enum PerfRepl_param_result
+process_param__empty (const char *param_name)
+{
+  if (tool_params.tiny)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-T' or '--tiny'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  if (tool_params.medium)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-M' or '--medium'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  if (tool_params.large)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-L' or '--large'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  tool_params.empty = ! 0;
+  return '-' == param_name[1] ?
+         PERF_RPL_PARAM_FULL_STR :PERF_RPL_PARAM_ONE_CHAR;
+}
+
+
+static enum PerfRepl_param_result
+process_param__tiny (const char *param_name)
+{
+  if (tool_params.empty)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-E' or '--empty'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  if (tool_params.medium)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-M' or '--medium'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  if (tool_params.large)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-L' or '--large'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  tool_params.tiny = ! 0;
+  return '-' == param_name[1] ?
+         PERF_RPL_PARAM_FULL_STR :PERF_RPL_PARAM_ONE_CHAR;
+}
+
+
+static enum PerfRepl_param_result
+process_param__medium (const char *param_name)
+{
+  if (tool_params.empty)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-E' or '--empty'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  if (tool_params.tiny)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-T' or '--tiny'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  if (tool_params.large)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-L' or '--large'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  tool_params.medium = ! 0;
+  return '-' == param_name[1] ?
+         PERF_RPL_PARAM_FULL_STR :PERF_RPL_PARAM_ONE_CHAR;
+}
+
+
+static enum PerfRepl_param_result
+process_param__large (const char *param_name)
+{
+  if (tool_params.empty)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-E' or '--empty'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  if (tool_params.tiny)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-T' or '--tiny'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  if (tool_params.medium)
+  {
+    fprintf (stderr, "Parameter '%s' cannot be used together "
+             "with '-M' or '--medium'.\n", param_name);
+    return PERF_RPL_PARAM_ERROR;
+  }
+  tool_params.large = ! 0;
+  return '-' == param_name[1] ?
+         PERF_RPL_PARAM_FULL_STR :PERF_RPL_PARAM_ONE_CHAR;
+}
+
+
 /**
  * Process parameter '-c' or '--connections'
  * @param param_name the name of the parameter as specified in command line
@@ -605,6 +728,14 @@ process_short_param (const char *param, const char 
*next_param)
     return process_param__all_cpus ("-A");
   else if ('t' == param_chr)
     return process_param__threads ("-t", param + 1, next_param);
+  else if ('E' == param_chr)
+    return process_param__empty ("-E");
+  else if ('T' == param_chr)
+    return process_param__tiny ("-T");
+  else if ('M' == param_chr)
+    return process_param__medium ("-M");
+  else if ('L' == param_chr)
+    return process_param__large ("-L");
   else if ('c' == param_chr)
     return process_param__connections ("-c", param + 1, next_param);
   else if ('O' == param_chr)
@@ -673,6 +804,18 @@ process_long_param (const char *param, const char 
*next_param)
   else if ((MHD_STATICSTR_LEN_ ("select") == param_len) &&
            (0 == memcmp (param, "select", MHD_STATICSTR_LEN_ ("select"))))
     return process_param__select ("--select");
+  else if ((MHD_STATICSTR_LEN_ ("empty") == param_len) &&
+           (0 == memcmp (param, "empty", MHD_STATICSTR_LEN_ ("empty"))))
+    return process_param__empty ("--empty");
+  else if ((MHD_STATICSTR_LEN_ ("tiny") == param_len) &&
+           (0 == memcmp (param, "tiny", MHD_STATICSTR_LEN_ ("tiny"))))
+    return process_param__tiny ("--tiny");
+  else if ((MHD_STATICSTR_LEN_ ("medium") == param_len) &&
+           (0 == memcmp (param, "medium", MHD_STATICSTR_LEN_ ("medium"))))
+    return process_param__medium ("--medium");
+  else if ((MHD_STATICSTR_LEN_ ("large") == param_len) &&
+           (0 == memcmp (param, "large", MHD_STATICSTR_LEN_ ("large"))))
+    return process_param__large ("--large");
   else if ((MHD_STATICSTR_LEN_ ("connections") <= param_len) &&
            (0 == memcmp (param, "connections",
                          MHD_STATICSTR_LEN_ ("connections"))))
@@ -877,6 +1020,15 @@ check_param__poll (void)
 }
 
 
+static void
+check_param__empty_tiny_medium_large (void)
+{
+  if (0 == (tool_params.empty | tool_params.tiny | tool_params.medium
+            | tool_params.large))
+    tool_params.tiny = ! 0;
+}
+
+
 /* Must be called after 'check_apply_param__threads()' and
    'check_apply_param__all_cpus()' */
 /* non-zero - OK, zero - error */
@@ -922,6 +1074,7 @@ check_apply_params (void)
     return PERF_RPL_ERR_CODE_BAD_PARAM;
   if (! check_param__poll ())
     return PERF_RPL_ERR_CODE_BAD_PARAM;
+  check_param__empty_tiny_medium_large ();
   if (! check_param__connections ())
     return PERF_RPL_ERR_CODE_BAD_PARAM;
   return 0;
@@ -935,23 +1088,106 @@ init_data (void)
      The system will keep it in cache. */
   static const char tiny_body[] = "Hi!";
   unsigned int i;
+  size_t body_dyn_size;
+
+  if (tool_params.medium)
+    body_dyn_size = 8U * 1024U;
+  else if (tool_params.large)
+    body_dyn_size = 1024U * 1024U;
+  else
+    body_dyn_size = 0;
+
+  if (0 != body_dyn_size)
+  {
+    body_dyn = (char *) malloc (body_dyn_size);
+    if (NULL == body_dyn)
+    {
+      fprintf (stderr, "Failed to allocate memory.\n");
+      return 25;
+    }
+    if (tool_params.medium)
+    {
+      /* Fill the body with HTML-like content */
+      size_t pos;
+      size_t filler_pos;
+      static const char body_header[] =
+        "<html>\n"
+        "<head>\n<title>Sample page title</title>\n<head>\n"
+        "<body>\n";
+      static const char body_filler[] =
+        "The quick brown fox jumps over the lazy dog.<br>\n";
+      static const char body_footer[] =
+        "</body>\n"
+        "</html>\n";
+      pos = 0;
+      memcpy (body_dyn + pos, body_header, MHD_STATICSTR_LEN_ (body_header));
+      pos += MHD_STATICSTR_LEN_ (body_header);
+      for (filler_pos = 0;
+           filler_pos < (body_dyn_size - (MHD_STATICSTR_LEN_ (body_header)
+                                          + MHD_STATICSTR_LEN_ (body_footer)));
+           ++filler_pos)
+      {
+        body_dyn[pos + filler_pos] =
+          body_filler[filler_pos % MHD_STATICSTR_LEN_ (body_filler)];
+      }
+      pos += filler_pos;
+      memcpy (body_dyn + pos, body_footer, MHD_STATICSTR_LEN_ (body_footer));
+    }
+    else
+    {
+      /* Fill the body with binary-like content */
+      size_t pos;
+      for (pos = 0; pos < body_dyn_size; ++pos)
+      {
+        body_dyn[pos] = (char) (unsigned char) (255U - pos % 256U);
+      }
+    }
+  }
+
   /* Use more responses to minimise waiting in threads to unlock
      the response used by other thread. */
   num_resps = 16 * get_num_threads ();
   resps = (struct MHD_Response **)
           malloc ((sizeof(struct MHD_Response *)) * num_resps);
   if (NULL == resps)
+  {
+    if (NULL != body_dyn)
+    {
+      free (body_dyn);
+      body_dyn = NULL;
+    }
+    fprintf (stderr, "Failed to allocate memory.\n");
     return 25;
+  }
   for (i = 0; i < num_resps; ++i)
   {
 #if MHD_VERSION >= 0x00097701
-    resps[i] = MHD_create_response_from_buffer_static (sizeof(tiny_body) - 1,
-                                                       tiny_body);
-#else /* MHD_VERSION < 0x00097701 */
-    resps[i] = MHD_create_response_from_buffer (sizeof(tiny_body) - 1,
-                                                (void *) tiny_body,
-                                                MHD_RESPMEM_PERSISTENT);
-#endif
+    if (NULL != body_dyn)
+      resps[i] = MHD_create_response_from_buffer_static (body_dyn_size,
+                                                         body_dyn);
+    else if (tool_params.empty)
+      resps[i] = MHD_create_response_empty (MHD_RF_NONE);
+    else
+      resps[i] =
+        MHD_create_response_from_buffer_static (MHD_STATICSTR_LEN_ (tiny_body),
+                                                tiny_body);
+
+#else  /* MHD_VERSION < 0x00097701 */
+    if (NULL != body_dyn)
+      resps[i] = MHD_create_response_from_buffer (body_dyn_size,
+                                                  (void *) body_dyn,
+                                                  MHD_RESPMEM_PERSISTENT);
+    else if (tool_params.empty)
+      resps[i] = MHD_create_response_from_buffer (0,
+                                                  (void *) tiny_body,
+                                                  MHD_RESPMEM_PERSISTENT);
+    else if (tool_params.tiny)
+      resps[i] =
+        MHD_create_response_from_buffer (MHD_STATICSTR_LEN_ (tiny_body),
+                                         (void *) tiny_body,
+                                         MHD_RESPMEM_PERSISTENT);
+    else
+#endif /* MHD_VERSION < 0x00097701 */
     if (NULL == resps[i])
     {
       fprintf (stderr, "Failed to create responses.\n");
@@ -967,6 +1203,9 @@ init_data (void)
   free (resps);
   resps = NULL;
   num_resps = 0;
+  if (NULL != body_dyn)
+    free (body_dyn);
+  body_dyn = NULL;
   return 32;
 }
 
@@ -981,6 +1220,9 @@ deinit_data (void)
   free (resps);
   resps = NULL;
   num_resps = 0;
+  if (NULL != body_dyn)
+    free (body_dyn);
+  body_dyn = NULL;
 }
 
 
@@ -1043,6 +1285,22 @@ get_mhd_conn_limit (struct MHD_Daemon *d)
 }
 
 
+static const char *
+get_mhd_response_size (void)
+{
+  if (tool_params.empty)
+    return "0 bytes (empty)";
+  else if (tool_params.tiny)
+    return "3 bytes (tiny)";
+  else if (tool_params.medium)
+    return "8 KB (medium)";
+  else if (tool_params.large)
+    return "1 MB (large)";
+  abort ();
+  return "";
+}
+
+
 static int
 run_mhd (void)
 {
@@ -1066,11 +1324,11 @@ run_mhd (void)
   fprintf (stderr, "WARNING: The tools is compiled with size-optimisations, "
            "the performance is suboptimal.\n");
 #endif /* __GNUC__ && ! __OPTIMIZE__ */
-#if MHD_VERSION >= 0x00097703
+#if MHD_VERSION >= 0x00097701
   if (MHD_NO != MHD_is_feature_supported (MHD_FEATURE_DEBUG_BUILD))
     fprintf (stderr, "WARNING: The libmicrohttpd is compiled with "
              "debug asserts enabled, the performance is suboptimal.\n");
-#endif /* MHD_VERSION >= 0x00097703 */
+#endif /* MHD_VERSION >= 0x00097701 */
   flags |= MHD_USE_ERROR_LOG;
   flags |= MHD_USE_INTERNAL_POLLING_THREAD;
   if (tool_params.epoll)
@@ -1148,6 +1406,8 @@ run_mhd (void)
           0 == tool_params.timeout ? " (no timeout)" : "");
   printf ("  'Date:' header:     %s\n",
           tool_params.date_header ? "Yes" : "No");
+  printf ("  Response size:      %s\n",
+          get_mhd_response_size ());
   printf ("To test with remote client use            "
           "http://HOST_IP:%u/\n";, (unsigned int) port);
   printf ("To test with client on the same host use  "

-- 
To stop receiving notification emails like this one, please contact
gnunet@gnunet.org.



reply via email to

[Prev in Thread] Current Thread [Next in Thread]