]> arthur.barton.de Git - netdata.git/blobdiff - src/adaptive_resortable_list.h
Separate kern.ipc.sem module
[netdata.git] / src / adaptive_resortable_list.h
index 157e1f5e72f73719b346afda7cc0859cfc1c4320..609cd0c43a2c2e55342dbd56f6c3671d685beaa8 100644 (file)
@@ -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 && !strcmp(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