X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=src%2Fadaptive_resortable_list.h;h=609cd0c43a2c2e55342dbd56f6c3671d685beaa8;hb=35843ec9e77b2593c476108558eb1eff4a39078a;hp=f27cccfd5369dd2edcf079310c7a783b2ac8dc0a;hpb=655715342478c5da5d43c5a8e619bd214585db4d;p=netdata.git diff --git a/src/adaptive_resortable_list.h b/src/adaptive_resortable_list.h index f27cccfd..609cd0c4 100644 --- a/src/adaptive_resortable_list.h +++ b/src/adaptive_resortable_list.h @@ -56,6 +56,8 @@ typedef struct arl_entry { } 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 @@ -93,7 +95,7 @@ typedef struct arl_base { } 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); @@ -103,7 +105,7 @@ 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); @@ -115,10 +117,14 @@ 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 @@ -150,7 +156,7 @@ static inline int arl_check(ARL_BASE *base, const char *keyword, const char *val #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