gnunet-svn
[Top][All Lists]
Advanced

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

[GNUnet-SVN] [gnurl] 152/205: hash: move key into hash struct to reduce


From: gnunet
Subject: [GNUnet-SVN] [gnurl] 152/205: hash: move key into hash struct to reduce mallocs
Date: Thu, 20 Apr 2017 16:21:32 +0200

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

ng0 pushed a commit to annotated tag gnurl-7.54.0
in repository gnurl.

commit 4f2e348f9b42c69c480bffd0188502167cf4ad07
Author: Daniel Stenberg <address@hidden>
AuthorDate: Sat Apr 1 01:12:32 2017 +0200

    hash: move key into hash struct to reduce mallocs
    
    This removes one tiny malloc for each hash struct allocated. In a simple
    case like "curl localhost", this save three mallocs.
    
    Closes #1376
---
 lib/hash.c | 26 +++++++-------------------
 lib/hash.h |  2 +-
 2 files changed, 8 insertions(+), 20 deletions(-)

diff --git a/lib/hash.c b/lib/hash.c
index c76bc1d95..b7305a572 100644
--- a/lib/hash.c
+++ b/lib/hash.c
@@ -37,8 +37,6 @@ hash_element_dtor(void *user, void *element)
   struct curl_hash *h = (struct curl_hash *) user;
   struct curl_hash_element *e = (struct curl_hash_element *) element;
 
-  Curl_safefree(e->key);
-
   if(e->ptr) {
     h->dtor(e->ptr);
     e->ptr = NULL;
@@ -87,23 +85,14 @@ Curl_hash_init(struct curl_hash *h,
 static struct curl_hash_element *
 mk_hash_element(const void *key, size_t key_len, const void *p)
 {
-  struct curl_hash_element *he = malloc(sizeof(struct curl_hash_element));
-
+  /* allocate the struct plus memory after it to store the key */
+  struct curl_hash_element *he = malloc(sizeof(struct curl_hash_element) +
+                                        key_len);
   if(he) {
-    void *dupkey = malloc(key_len);
-    if(dupkey) {
-      /* copy the key */
-      memcpy(dupkey, key, key_len);
-
-      he->key = dupkey;
-      he->key_len = key_len;
-      he->ptr = (void *) p;
-    }
-    else {
-      /* failed to duplicate the key, free memory and fail */
-      free(he);
-      he = NULL;
-    }
+    /* copy the key */
+    memcpy(he->key, key, key_len);
+    he->key_len = key_len;
+    he->ptr = (void *) p;
   }
   return he;
 }
@@ -145,7 +134,6 @@ Curl_hash_add(struct curl_hash *h, void *key, size_t 
key_len, void *p)
      * "destructor" for the actual data 'p'. When we fail, we shall not touch
      * that data.
      */
-    free(he->key);
     free(he);
   }
 
diff --git a/lib/hash.h b/lib/hash.h
index 5929fc264..a345c8c87 100644
--- a/lib/hash.h
+++ b/lib/hash.h
@@ -58,8 +58,8 @@ struct curl_hash {
 
 struct curl_hash_element {
   void   *ptr;
-  char   *key;
   size_t key_len;
+  char   key[1]; /* allocated memory following the struct */
 };
 
 struct curl_hash_iterator {

-- 
To stop receiving notification emails like this one, please contact
address@hidden



reply via email to

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