]> git.proxmox.com Git - mirror_frr.git/blobdiff - lib/hash.c
*: auto-convert to SPDX License IDs
[mirror_frr.git] / lib / hash.c
index 85982774ac8162c1d0c1ccdf2a9515fc44a0e303..97a77a2b9a10789869ebb804a65323066098666b 100644 (file)
@@ -1,21 +1,6 @@
+// SPDX-License-Identifier: GPL-2.0-or-later
 /* Hash routine.
  * Copyright (C) 1998 Kunihiro Ishiguro
- *
- * This file is part of GNU Zebra.
- *
- * GNU Zebra is free software; you can redistribute it and/or modify
- * it under the terms of the GNU General Public License as published
- * by the Free Software Foundation; either version 2, or (at your
- * option) any later version.
- *
- * GNU Zebra is distributed in the hope that it will be useful, but
- * WITHOUT ANY WARRANTY; without even the implied warranty of
- * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the GNU
- * General Public License for more details.
- *
- * You should have received a copy of the GNU General Public License along
- * with this program; see the file COPYING; if not, write to the Free Software
- * Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
  */
 
 #include <zebra.h>
 #include "command.h"
 #include "libfrr.h"
 #include "frr_pthread.h"
+#include "libfrr_trace.h"
 
-DEFINE_MTYPE_STATIC(LIB, HASH, "Hash")
-DEFINE_MTYPE_STATIC(LIB, HASH_BACKET, "Hash Bucket")
-DEFINE_MTYPE_STATIC(LIB, HASH_INDEX, "Hash Index")
+DEFINE_MTYPE_STATIC(LIB, HASH, "Hash");
+DEFINE_MTYPE_STATIC(LIB, HASH_BUCKET, "Hash Bucket");
+DEFINE_MTYPE_STATIC(LIB, HASH_INDEX, "Hash Index");
 
 static pthread_mutex_t _hashes_mtx = PTHREAD_MUTEX_INITIALIZER;
 static struct list *_hashes;
@@ -55,7 +41,7 @@ struct hash *hash_create_size(unsigned int size,
        hash->name = name ? XSTRDUP(MTYPE_HASH, name) : NULL;
        hash->stats.empty = hash->size;
 
-       frr_with_mutex(&_hashes_mtx) {
+       frr_with_mutex (&_hashes_mtx) {
                if (!_hashes)
                        _hashes = list_new();
 
@@ -138,6 +124,8 @@ static void hash_expand(struct hash *hash)
 
 void *hash_get(struct hash *hash, void *data, void *(*alloc_func)(void *))
 {
+       frrtrace(2, frr_libfrr, hash_get, hash, data);
+
        unsigned int key;
        unsigned int index;
        void *newdata;
@@ -165,13 +153,15 @@ void *hash_get(struct hash *hash, void *data, void *(*alloc_func)(void *))
                        index = key & (hash->size - 1);
                }
 
-               bucket = XCALLOC(MTYPE_HASH_BACKET, sizeof(struct hash_bucket));
+               bucket = XCALLOC(MTYPE_HASH_BUCKET, sizeof(struct hash_bucket));
                bucket->data = newdata;
                bucket->key = key;
                bucket->next = hash->index[index];
                hash->index[index] = bucket;
                hash->count++;
 
+               frrtrace(3, frr_libfrr, hash_insert, hash, data, key);
+
                int oldlen = bucket->next ? bucket->next->len : 0;
                int newlen = oldlen + 1;
 
@@ -206,7 +196,7 @@ unsigned int string_hash_make(const char *str)
 
 void *hash_release(struct hash *hash, void *data)
 {
-       void *ret;
+       void *ret = NULL;
        unsigned int key;
        unsigned int index;
        struct hash_bucket *bucket;
@@ -234,13 +224,16 @@ void *hash_release(struct hash *hash, void *data)
                        hash_update_ssq(hash, oldlen, newlen);
 
                        ret = bucket->data;
-                       XFREE(MTYPE_HASH_BACKET, bucket);
+                       XFREE(MTYPE_HASH_BUCKET, bucket);
                        hash->count--;
-                       return ret;
+                       break;
                }
                pp = bucket;
        }
-       return NULL;
+
+       frrtrace(3, frr_libfrr, hash_release, hash, data, ret);
+
+       return ret;
 }
 
 void hash_iterate(struct hash *hash, void (*func)(struct hash_bucket *, void *),
@@ -294,7 +287,7 @@ void hash_clean(struct hash *hash, void (*free_func)(void *))
                        if (free_func)
                                (*free_func)(hb->data);
 
-                       XFREE(MTYPE_HASH_BACKET, hb);
+                       XFREE(MTYPE_HASH_BUCKET, hb);
                        hash->count--;
                }
                hash->index[i] = NULL;
@@ -321,7 +314,7 @@ struct list *hash_to_list(struct hash *hash)
 
 void hash_free(struct hash *hash)
 {
-       frr_with_mutex(&_hashes_mtx) {
+       frr_with_mutex (&_hashes_mtx) {
                if (_hashes) {
                        listnode_delete(_hashes, hash);
                        if (_hashes->count == 0) {