// assume source stats are write locked void stats_set (long handle, const char *name, const char *value) { if (handle) { stats_source_t *src_stats = (stats_source_t *)handle; stats_event_t event; build_event (&event, src_stats->source, name, (char *)value); process_source_stat (src_stats, &event); } }
void stats_set_flags (long handle, const char *name, const char *value, int flags) { stats_source_t *src_stats = (stats_source_t *)handle; stats_event_t event; build_event (&event, src_stats->source, name, value); event.flags = flags; if (value) event.action |= STATS_EVENT_HIDDEN; else event.action = STATS_EVENT_HIDDEN; process_source_stat (src_stats, &event); }
static void process_source_event (stats_event_t *event) { stats_source_t *snode; avl_tree_wlock (_stats.source_tree); snode = _find_source(_stats.source_tree, event->source); if (snode == NULL) { if (event->action == STATS_EVENT_REMOVE) { avl_tree_unlock (_stats.source_tree); return; } snode = (stats_source_t *)calloc(1,sizeof(stats_source_t)); if (snode == NULL) abort(); DEBUG1 ("new source stat %s", event->source); snode->source = (char *)strdup(event->source); snode->stats_tree = avl_tree_new(_compare_stats, NULL); snode->flags = STATS_SLAVE|STATS_GENERAL|STATS_HIDDEN; avl_insert(_stats.source_tree, (void *)snode); } if (event->action == STATS_EVENT_REMOVE && event->name == NULL) { int fallback_stream = 0; avl_tree_wlock (snode->stats_tree); fallback_stream = _find_node (snode->stats_tree, "fallback") == NULL ? 1 : 0; if (fallback_stream) avl_delete(_stats.source_tree, (void *)snode, _free_source_stats); else avl_tree_unlock (snode->stats_tree); avl_tree_unlock (_stats.source_tree); return; } avl_tree_wlock (snode->stats_tree); avl_tree_unlock (_stats.source_tree); process_source_stat (snode, event); avl_tree_unlock (snode->stats_tree); }