From ba30221f3588d75b3073cd737fbbf6d0c80e5906 Mon Sep 17 00:00:00 2001 From: Christian Grothoff Date: Sat, 11 Aug 2018 06:20:40 +0200 Subject: introduce allocation wrappers to improve libgcrypt performance --- src/util/common_logging.c | 51 +++++++++++++++++++++++++++-------------------- src/util/crypto_random.c | 31 +++++++++++++++++++++++++++- 2 files changed, 59 insertions(+), 23 deletions(-) (limited to 'src') diff --git a/src/util/common_logging.c b/src/util/common_logging.c index f875d165d..be2e084b5 100644 --- a/src/util/common_logging.c +++ b/src/util/common_logging.c @@ -11,7 +11,7 @@ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. - + You should have received a copy of the GNU Affero General Public License along with this program. If not, see . */ @@ -817,32 +817,39 @@ output_message (enum GNUNET_ErrorType kind, if ( (NULL != GNUNET_stderr) && (NULL == loggers) ) { - if (kind == GNUNET_ERROR_TYPE_MESSAGE) { - /* The idea here is to produce "normal" output messages - * for end users while still having the power of the - * logging engine for developer needs. So ideally this - * is what it should look like when CLI tools are used - * interactively, yet the same message shouldn't look - * this way if the output is going to logfiles or robots - * instead. Is this the right place to do this? --lynX - */ - FPRINTF (GNUNET_stderr, - "* %s", - msg); - } else { - FPRINTF (GNUNET_stderr, - "%s %s %s %s", - datestr, - comp, - GNUNET_error_type_to_string (kind), - msg); + if (kind == GNUNET_ERROR_TYPE_MESSAGE) + { + /* The idea here is to produce "normal" output messages + * for end users while still having the power of the + * logging engine for developer needs. So ideally this + * is what it should look like when CLI tools are used + * interactively, yet the same message shouldn't look + * this way if the output is going to logfiles or robots + * instead. + */ + FPRINTF (GNUNET_stderr, + "* %s", + msg); + } + else + { + FPRINTF (GNUNET_stderr, + "%s %s %s %s", + datestr, + comp, + GNUNET_error_type_to_string (kind), + msg); } fflush (GNUNET_stderr); } pos = loggers; - while (pos != NULL) + while (NULL != pos) { - pos->logger (pos->logger_cls, kind, comp, datestr, msg); + pos->logger (pos->logger_cls, + kind, + comp, + datestr, + msg); pos = pos->next; } #if WINDOWS diff --git a/src/util/crypto_random.c b/src/util/crypto_random.c index 2163a9731..df6d3fb9b 100644 --- a/src/util/crypto_random.c +++ b/src/util/crypto_random.c @@ -11,7 +11,7 @@ WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU Affero General Public License for more details. - + You should have received a copy of the GNU Affero General Public License along with this program. If not, see . @@ -268,6 +268,28 @@ GNUNET_CRYPTO_random_u64 (enum GNUNET_CRYPTO_Quality mode, uint64_t max) } +/** + * Allocation wrapper for libgcrypt, used to avoid bad locking + * strategy of libgcrypt implementation. + */ +static void * +w_malloc (size_t n) +{ + return calloc (n, 1); +} + + +/** + * Allocation wrapper for libgcrypt, used to avoid bad locking + * strategy of libgcrypt implementation. + */ +static int +w_check (const void *p) +{ + return 0; /* not secure memory */ +} + + /** * Initialize libgcrypt. */ @@ -283,6 +305,13 @@ GNUNET_CRYPTO_random_init () NEED_LIBGCRYPT_VERSION); GNUNET_assert (0); } + /* set custom allocators */ + gcry_set_allocation_handler (&w_malloc, + &w_malloc, + &w_check, + &realloc, + &free); + /* Disable use of secure memory */ if ((rc = gcry_control (GCRYCTL_DISABLE_SECMEM, 0))) FPRINTF (stderr, "Failed to set libgcrypt option %s: %s\n", -- cgit v1.2.3