} ARL_ENTRY;
typedef struct arl_base {
+ char *name;
+
size_t iteration; // incremented on each iteration (arl_begin())
size_t found; // the number of expected keywords found in this iteration
size_t expected; // the number of expected keywords
} ARL_BASE;
// create a new ARL
-extern ARL_BASE *arl_create(void (*processor)(const char *, uint32_t, const char *, void *), size_t rechecks);
+extern ARL_BASE *arl_create(const char *name, void (*processor)(const char *, uint32_t, const char *, void *), size_t rechecks);
// free an ARL
extern void arl_free(ARL_BASE *arl_base);
extern ARL_ENTRY *arl_expect(ARL_BASE *base, const char *keyword, void *dst);
// an internal call to complete the check() call
-extern int arl_find_or_create_and_relink(ARL_BASE *base, const char *s, uint32_t hash, const char *value);
+extern int arl_find_or_create_and_relink(ARL_BASE *base, const char *s, const char *value);
// begin an ARL iteration
extern void arl_begin(ARL_BASE *base);
// it is defined in the header file in order to be inlined
static inline int arl_check(ARL_BASE *base, const char *keyword, const char *value) {
ARL_ENTRY *e = base->next_keyword;
- uint32_t hash = simple_hash(keyword);
+
+#ifdef NETDATA_INTERNAL_CHECKS
+ if(unlikely((base->fast + base->slow) % (base->expected + base->allocated) == 0 && (base->fast + base->slow) > (base->expected + base->allocated) * base->iteration))
+ info("ARL '%s': Did you forget to call arl_begin()?", base->name);
+#endif
// it should be the first entry (pointed by base->next_keyword)
- if(likely(hash == e->hash && !strsame(keyword, e->name))) {
+ if(likely(!strcmp(keyword, e->name))) {
// it is
#ifdef NETDATA_INTERNAL_CHECKS
#endif
// we read from source, a not-expected keyword
- return arl_find_or_create_and_relink(base, keyword, hash, value);
+ return arl_find_or_create_and_relink(base, keyword, value);
}
#endif //NETDATA_ADAPTIVE_RESORTABLE_LIST_H