X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=src%2Fappconfig.c;h=ae92ad0454a16444aeff44443913e6d79c5a5dfa;hb=909e26f825bc1f6f907231761412c885331fec7e;hp=4a0eb4de12b0fe0d6c657158e35b6dc55b7cc7d6;hpb=299a229c67fc74730317a4cf9a066de14ccf102c;p=netdata.git diff --git a/src/appconfig.c b/src/appconfig.c index 4a0eb4de..ae92ad04 100644 --- a/src/appconfig.c +++ b/src/appconfig.c @@ -36,7 +36,7 @@ struct section { struct config_option *values; avl_tree_lock values_index; - pthread_mutex_t mutex; // this locks only the writers, to ensure atomic updates + netdata_mutex_t mutex; // this locks only the writers, to ensure atomic updates // readers are protected using the rwlock in avl_tree_lock }; @@ -44,7 +44,7 @@ static int appconfig_section_compare(void *a, void *b); struct config netdata_config = { .sections = NULL, - .mutex = PTHREAD_MUTEX_INITIALIZER, + .mutex = NETDATA_MUTEX_INITIALIZER, .index = { { NULL, appconfig_section_compare }, AVL_LOCK_INITIALIZER @@ -53,7 +53,7 @@ struct config netdata_config = { struct config stream_config = { .sections = NULL, - .mutex = PTHREAD_MUTEX_INITIALIZER, + .mutex = NETDATA_MUTEX_INITIALIZER, .index = { { NULL, appconfig_section_compare }, AVL_LOCK_INITIALIZER @@ -64,19 +64,19 @@ struct config stream_config = { // locking static inline void appconfig_wrlock(struct config *root) { - pthread_mutex_lock(&root->mutex); + netdata_mutex_lock(&root->mutex); } static inline void appconfig_unlock(struct config *root) { - pthread_mutex_unlock(&root->mutex); + netdata_mutex_unlock(&root->mutex); } static inline void config_section_wrlock(struct section *co) { - pthread_mutex_lock(&co->mutex); + netdata_mutex_lock(&co->mutex); } static inline void config_section_unlock(struct section *co) { - pthread_mutex_unlock(&co->mutex); + netdata_mutex_unlock(&co->mutex); } @@ -157,8 +157,7 @@ static inline struct section *appconfig_section_create(struct config *root, cons // ---------------------------------------------------------------------------- // config name-value methods -static inline struct config_option *appconfig_value_create(struct section *co, const char *name, const char *value) -{ +static inline struct config_option *appconfig_value_create(struct section *co, const char *name, const char *value) { debug(D_CONFIG, "Creating config entry for name '%s', value '%s', in section '%s'.", name, value, co->name); struct config_option *cv = callocz(1, sizeof(struct config_option)); @@ -166,8 +165,14 @@ static inline struct config_option *appconfig_value_create(struct section *co, c cv->hash = simple_hash(cv->name); cv->value = strdupz(value); - if(unlikely(appconfig_option_index_add(co, cv) != cv)) - error("INTERNAL ERROR: indexing of config '%s' in section '%s': already exists.", cv->name, co->name); + struct config_option *found = appconfig_option_index_add(co, cv); + if(found != cv) { + error("indexing of config '%s' in section '%s': already exists - using the existing one.", cv->name, co->name); + freez(cv->value); + freez(cv->name); + freez(cv); + return found; + } config_section_wrlock(co); struct config_option *cv2 = co->values; @@ -202,7 +207,7 @@ int appconfig_move(struct config *root, const char *section_old, const char *nam debug(D_CONFIG, "request to rename config in section '%s', old name '%s', to section '%s', new name '%s'", section_old, name_old, section_new, name_new); struct section *co_old = appconfig_section_find(root, section_old); - if(!co_old) return -1; + if(!co_old) return ret; struct section *co_new = appconfig_section_find(root, section_new); if(!co_new) co_new = appconfig_section_create(root, section_new); @@ -235,11 +240,12 @@ int appconfig_move(struct config *root, const char *section_old, const char *nam cv_old->name = strdupz(name_new); cv_old->hash = simple_hash(cv_old->name); + cv_new = cv_old; cv_new->next = co_new->values; co_new->values = cv_new; if(unlikely(appconfig_option_index_add(co_new, cv_old) != cv_old)) - error("INTERNAL ERROR: indexing of config '%s' in section '%s', already exists.", cv_old->name, co_new->name); + error("INTERNAL ERROR: re-indexing of config '%s' in section '%s', already exists.", cv_old->name, co_new->name); ret = 0; @@ -331,7 +337,7 @@ const char *appconfig_set_default(struct config *root, const char *section, cons { struct config_option *cv; - debug(D_CONFIG, "request to set config in section '%s', name '%s', value '%s'", section, name, value); + debug(D_CONFIG, "request to set default config in section '%s', name '%s', value '%s'", section, name, value); struct section *co = appconfig_section_find(root, section); if(!co) return appconfig_set(root, section, name, value); @@ -524,7 +530,7 @@ void appconfig_generate(struct config *root, BUFFER *wb, int only_changed) appconfig_wrlock(root); for(co = root->sections; co ; co = co->next) { if(!strcmp(co->name, CONFIG_SECTION_GLOBAL) - || !strcmp(co->name, CONFIG_SECTION_API) + || !strcmp(co->name, CONFIG_SECTION_WEB) || !strcmp(co->name, CONFIG_SECTION_PLUGINS) || !strcmp(co->name, CONFIG_SECTION_REGISTRY) || !strcmp(co->name, CONFIG_SECTION_HEALTH) @@ -552,7 +558,7 @@ void appconfig_generate(struct config *root, BUFFER *wb, int only_changed) if(only_changed && !changed) continue; if(!used) { - buffer_sprintf(wb, "\n# node '%s' is not used.", co->name); + buffer_sprintf(wb, "\n# section '%s' is not used.", co->name); } buffer_sprintf(wb, "\n[%s]\n", co->name);