/* * Return an allocated lttng hashtable. */ LTTNG_HIDDEN struct lttng_ht *lttng_ht_new(unsigned long size, int type) { struct lttng_ht *ht; /* Test size */ if (!size) size = DEFAULT_HT_SIZE; pthread_mutex_lock(&seed_lock); if (!seed_init) { lttng_ht_seed = (unsigned long) time(NULL); seed_init = true; } pthread_mutex_unlock(&seed_lock); ht = zmalloc(sizeof(*ht)); if (ht == NULL) { PERROR("zmalloc lttng_ht"); goto error; } ht->ht = cds_lfht_new(size, min_hash_alloc_size, max_hash_buckets_size, CDS_LFHT_AUTO_RESIZE | CDS_LFHT_ACCOUNTING, NULL); /* * There is already an assert in the RCU hashtable code so if the ht is * NULL here there is a *huge* problem. */ assert(ht->ht); switch (type) { case LTTNG_HT_TYPE_STRING: ht->match_fct = match_str; ht->hash_fct = hash_key_str; break; case LTTNG_HT_TYPE_ULONG: ht->match_fct = match_ulong; ht->hash_fct = hash_key_ulong; break; case LTTNG_HT_TYPE_U64: 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); goto error; } DBG3("Created hashtable size %lu at %p of type %d", size, ht->ht, type); return ht; error: return NULL; }
UA_NodeStore * UA_NodeStore_new() { UA_NodeStore *ns; if(!(ns = UA_malloc(sizeof(UA_NodeStore)))) return NULL; /* 32 is the minimum size for the hashtable. */ ns->ht = cds_lfht_new(32, 32, 0, CDS_LFHT_AUTO_RESIZE, NULL); if(!ns->ht) { UA_free(ns); return NULL; } return ns; }