Commit 4f2e348f authored by Daniel Stenberg's avatar Daniel Stenberg
Browse files

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
parent e60fe20f
Loading
Loading
Loading
Loading
+7 −19
Original line number Diff line number Diff line
@@ -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,24 +85,15 @@ 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;
    memcpy(he->key, key, key_len);
    he->key_len = key_len;
    he->ptr = (void *) p;
  }
    else {
      /* failed to duplicate the key, free memory and fail */
      free(he);
      he = NULL;
    }
  }
  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);
  }

+1 −1
Original line number Diff line number Diff line
@@ -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 {