X-Git-Url: http://git.efficios.com/?p=lttng-tools.git;a=blobdiff_plain;f=src%2Fcommon%2Fhashtable%2Fhashtable.c;h=3a38cbf0f83e20a6d6c315d5fc0c3deef5843a87;hp=8c26ebe15b63d3a71f2efd40398e2781e5ddbb59;hb=6c1c0768320135c6936c371b09731851b508c023;hpb=42305b3673038da331e5a65093a803f9a9da9946 diff --git a/src/common/hashtable/hashtable.c b/src/common/hashtable/hashtable.c index 8c26ebe15..3a38cbf0f 100644 --- a/src/common/hashtable/hashtable.c +++ b/src/common/hashtable/hashtable.c @@ -16,6 +16,7 @@ */ #define _GNU_SOURCE +#define _LGPL_SOURCE #include #include #include @@ -65,6 +66,17 @@ static int match_u64(struct cds_lfht_node *node, const void *key) return hash_match_key_u64(&match_node->key, (void *) key); } +/* + * Match function for two uint64_t node. + */ +static int match_two_u64(struct cds_lfht_node *node, const void *key) +{ + struct lttng_ht_node_two_u64 *match_node = + caa_container_of(node, struct lttng_ht_node_two_u64, node); + + return hash_match_key_two_u64((void *) &match_node->key, (void *) key); +} + /* * Return an allocated lttng hashtable. */ @@ -103,6 +115,10 @@ struct lttng_ht *lttng_ht_new(unsigned long size, int type) ht->match_fct = match_u64; ht->hash_fct = hash_key_u64; break; + case LTTNG_HT_TYPE_TWO_U64: + ht->match_fct = match_two_u64; + ht->hash_fct = hash_key_two_u64; + break; default: ERR("Unknown lttng hashtable type %d", type); lttng_ht_destroy(ht); @@ -164,6 +180,19 @@ void lttng_ht_node_init_u64(struct lttng_ht_node_u64 *node, cds_lfht_node_init(&node->node); } +/* + * Init lttng ht node with two uint64_t. + */ +void lttng_ht_node_init_two_u64(struct lttng_ht_node_two_u64 *node, + uint64_t key1, uint64_t key2) +{ + assert(node); + + node->key.key1 = key1; + node->key.key2 = key2; + cds_lfht_node_init(&node->node); +} + /* * Free lttng ht node string. */ @@ -191,6 +220,15 @@ void lttng_ht_node_free_u64(struct lttng_ht_node_u64 *node) free(node); } +/* + * Free lttng ht node two uint64_t. + */ +void lttng_ht_node_free_two_u64(struct lttng_ht_node_two_u64 *node) +{ + assert(node); + free(node); +} + /* * Lookup function in hashtable. */ @@ -220,6 +258,20 @@ void lttng_ht_add_unique_str(struct lttng_ht *ht, assert(node_ptr == &node->node); } +/* + * Add string node to hashtable. + */ +void lttng_ht_add_str(struct lttng_ht *ht, + struct lttng_ht_node_str *node) +{ + assert(ht); + assert(ht->ht); + assert(node); + + cds_lfht_add(ht->ht, ht->hash_fct(node->key, lttng_ht_seed), + &node->node); +} + /* * Add unsigned long node to hashtable. */ @@ -281,6 +333,23 @@ void lttng_ht_add_unique_u64(struct lttng_ht *ht, assert(node_ptr == &node->node); } +/* + * Add unique two uint64_t node to hashtable. + */ +void lttng_ht_add_unique_two_u64(struct lttng_ht *ht, + struct lttng_ht_node_two_u64 *node) +{ + struct cds_lfht_node *node_ptr; + assert(ht); + assert(ht->ht); + assert(node); + + node_ptr = cds_lfht_add_unique(ht->ht, + ht->hash_fct((void *) &node->key, lttng_ht_seed), ht->match_fct, + (void *) &node->key, &node->node); + assert(node_ptr == &node->node); +} + /* * Add replace unsigned long node to hashtable. */ @@ -425,6 +494,22 @@ struct lttng_ht_node_u64 *lttng_ht_iter_get_node_u64( return caa_container_of(node, struct lttng_ht_node_u64, node); } +/* + * Return lttng ht stream and index id node from iterator. + */ +struct lttng_ht_node_two_u64 *lttng_ht_iter_get_node_two_u64( + struct lttng_ht_iter *iter) +{ + struct cds_lfht_node *node; + + assert(iter); + node = cds_lfht_iter_get_node(&iter->iter); + if (!node) { + return NULL; + } + return caa_container_of(node, struct lttng_ht_node_two_u64, node); +} + /* * lib constructor */