Index: third_party/grpc/src/core/statistics/hash_table.h |
diff --git a/third_party/grpc/src/core/statistics/hash_table.h b/third_party/grpc/src/core/statistics/hash_table.h |
new file mode 100644 |
index 0000000000000000000000000000000000000000..d9860a909f0afda7ed56816904521dbfc8922116 |
--- /dev/null |
+++ b/third_party/grpc/src/core/statistics/hash_table.h |
@@ -0,0 +1,131 @@ |
+/* |
+ * |
+ * Copyright 2015, Google Inc. |
+ * All rights reserved. |
+ * |
+ * Redistribution and use in source and binary forms, with or without |
+ * modification, are permitted provided that the following conditions are |
+ * met: |
+ * |
+ * * Redistributions of source code must retain the above copyright |
+ * notice, this list of conditions and the following disclaimer. |
+ * * Redistributions in binary form must reproduce the above |
+ * copyright notice, this list of conditions and the following disclaimer |
+ * in the documentation and/or other materials provided with the |
+ * distribution. |
+ * * Neither the name of Google Inc. nor the names of its |
+ * contributors may be used to endorse or promote products derived from |
+ * this software without specific prior written permission. |
+ * |
+ * THIS SOFTWARE IS PROVIDED BY THE COPYRIGHT HOLDERS AND CONTRIBUTORS |
+ * "AS IS" AND ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT |
+ * LIMITED TO, THE IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR |
+ * A PARTICULAR PURPOSE ARE DISCLAIMED. IN NO EVENT SHALL THE COPYRIGHT |
+ * OWNER OR CONTRIBUTORS BE LIABLE FOR ANY DIRECT, INDIRECT, INCIDENTAL, |
+ * SPECIAL, EXEMPLARY, OR CONSEQUENTIAL DAMAGES (INCLUDING, BUT NOT |
+ * LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS OR SERVICES; LOSS OF USE, |
+ * DATA, OR PROFITS; OR BUSINESS INTERRUPTION) HOWEVER CAUSED AND ON ANY |
+ * THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT LIABILITY, OR TORT |
+ * (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY OUT OF THE USE |
+ * OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF SUCH DAMAGE. |
+ * |
+ */ |
+ |
+#ifndef GRPC_INTERNAL_CORE_STATISTICS_HASH_TABLE_H |
+#define GRPC_INTERNAL_CORE_STATISTICS_HASH_TABLE_H |
+ |
+#include <stddef.h> |
+ |
+#include <grpc/support/port_platform.h> |
+ |
+/* A chain based hash table with fixed number of buckets. |
+ Your probably shouldn't use this code directly. It is implemented for the |
+ use case in census trace store and stats store, where number of entries in |
+ the table is in the scale of upto several thousands, entries are added and |
+ removed from the table very frequently (~100k/s), the frequency of find() |
+ operations is roughly several times of the frequency of insert() and erase() |
+ Comparing to find(), the insert(), erase() and get_all_entries() operations |
+ are much less freqent (<1/s). |
+ |
+ Per bucket memory overhead is about (8 + sizeof(intptr_t) bytes. |
+ Per entry memory overhead is about (8 + 2 * sizeof(intptr_t) bytes. |
+ |
+ All functions are not thread-safe. Synchronization will be provided in the |
+ upper layer (in trace store and stats store). |
+*/ |
+ |
+/* Opaque hash table struct */ |
+typedef struct unresizable_hash_table census_ht; |
+ |
+/* Currently, the hash_table can take two types of keys. (uint64 for trace |
+ store and const char* for stats store). */ |
+typedef union { |
+ uint64_t val; |
+ void *ptr; |
+} census_ht_key; |
+ |
+typedef enum census_ht_key_type { |
+ CENSUS_HT_UINT64 = 0, |
+ CENSUS_HT_POINTER = 1 |
+} census_ht_key_type; |
+ |
+typedef struct census_ht_option { |
+ /* Type of hash key */ |
+ census_ht_key_type key_type; |
+ /* Desired number of buckets, preferably a prime number */ |
+ int32_t num_buckets; |
+ /* Fucntion to calculate uint64 hash value of the key. Only takes effect if |
+ key_type is POINTER. */ |
+ uint64_t (*hash)(const void *); |
+ /* Function to compare two keys, returns 0 iff equal. Only takes effect if |
+ key_type is POINTER */ |
+ int (*compare_keys)(const void *k1, const void *k2); |
+ /* Value deleter. NULL if no specialized delete function is needed. */ |
+ void (*delete_data)(void *); |
+ /* Key deleter. NULL if table does not own the key. (e.g. key is part of the |
+ value or key is not owned by the table.) */ |
+ void (*delete_key)(void *); |
+} census_ht_option; |
+ |
+/* Creates a hashtable with fixed number of buckets according to the settings |
+ specified in 'options' arg. Function pointers "hash" and "compare_keys" must |
+ be provided if key_type is POINTER. Asserts if fail to create. */ |
+census_ht *census_ht_create(const census_ht_option *options); |
+ |
+/* Deletes hash table instance. Frees all dynamic memory owned by ht.*/ |
+void census_ht_destroy(census_ht *ht); |
+ |
+/* Inserts the input key-val pair into hash_table. If an entry with the same key |
+ exists in the table, the corresponding value will be overwritten by the input |
+ val. */ |
+void census_ht_insert(census_ht *ht, census_ht_key key, void *val); |
+ |
+/* Returns pointer to data, returns NULL if not found. */ |
+void *census_ht_find(const census_ht *ht, census_ht_key key); |
+ |
+/* Erase hash table entry with input key. Noop if key is not found. */ |
+void census_ht_erase(census_ht *ht, census_ht_key key); |
+ |
+typedef struct census_ht_kv { |
+ census_ht_key k; |
+ void *v; |
+} census_ht_kv; |
+ |
+/* Returns an array of pointers to all values in the hash table. Order of the |
+ elements can be arbitrary. Sets 'num' to the size of returned array. Caller |
+ owns returned array. */ |
+census_ht_kv *census_ht_get_all_elements(const census_ht *ht, size_t *num); |
+ |
+/* Returns number of elements kept. */ |
+size_t census_ht_get_size(const census_ht *ht); |
+ |
+/* Functor applied on each key-value pair while iterating through entries in the |
+ table. The functor should not mutate data. */ |
+typedef void (*census_ht_itr_cb)(census_ht_key key, const void *val_ptr, |
+ void *state); |
+ |
+/* Iterates through all key-value pairs in the hash_table. The callback function |
+ should not invalidate data entries. */ |
+uint64_t census_ht_for_all(const census_ht *ht, census_ht_itr_cb); |
+ |
+#endif /* GRPC_INTERNAL_CORE_STATISTICS_HASH_TABLE_H */ |