summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorChristian Grothoff <christian@grothoff.org>2018-08-11 06:20:40 +0200
committerChristian Grothoff <christian@grothoff.org>2018-08-11 06:20:40 +0200
commitba30221f3588d75b3073cd737fbbf6d0c80e5906 (patch)
treeaf268deae97db1d58c5f84381d15e49740484753
parent0f54ff0768d776d07231418e6370602c3789ee56 (diff)
introduce allocation wrappers to improve libgcrypt performance
-rw-r--r--src/util/common_logging.c51
-rw-r--r--src/util/crypto_random.c31
2 files changed, 59 insertions, 23 deletions
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 <http://www.gnu.org/licenses/>.
*/
@@ -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 <http://www.gnu.org/licenses/>.
@@ -269,6 +269,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.
*/
void __attribute__ ((constructor))
@@ -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",