X-Git-Url: https://arthur.barton.de/gitweb/?a=blobdiff_plain;f=src%2Fappconfig.c;h=71ff4b75e255a36977685aa049e6d28d43da7691;hb=fa57c9e50d49f3b51dcd9a5f7ec8798153af5992;hp=2de6f69c085af1f138d45a1db6dc70eb14c6bb61;hpb=62796ac50b1ae2807a187ac39855762fd3aefdc7;p=netdata.git diff --git a/src/appconfig.c b/src/appconfig.c index 2de6f69c..71ff4b75 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; @@ -240,7 +245,7 @@ int appconfig_move(struct config *root, const char *section_old, const char *nam 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; @@ -525,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)