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
This commit is contained in:
Daniel Stenberg 2017-04-01 01:12:32 +02:00
Родитель e60fe20fdf
Коммит 4f2e348f9b
2 изменённых файлов: 8 добавлений и 20 удалений

Просмотреть файл

@ -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);
}

Просмотреть файл

@ -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 {