static inline void tc_device_classes_cleanup(struct tc_device *d) { static int cleanup_every = 999; if(unlikely(cleanup_every > 0)) { cleanup_every = (int) config_get_number("plugin:tc", "cleanup unused classes every", 120); if(cleanup_every < 0) cleanup_every = -cleanup_every; } d->name_updated = 0; d->family_updated = 0; struct tc_class *c = d->classes; while(c) { if(unlikely(cleanup_every && c->unupdated >= cleanup_every)) { struct tc_class *nc = c->next; tc_class_free(d, c); c = nc; } else { c->updated = 0; c->name_updated = 0; c = c->next; } } }
static inline void tc_device_free(struct tc_device *n) { if(n->next) n->next->prev = n->prev; if(n->prev) n->prev->next = n->next; if(tc_device_root == n) { if(n->next) tc_device_root = n->next; else tc_device_root = n->prev; } if(unlikely(tc_device_index_del(n) != n)) error("plugin_tc: INTERNAL ERROR: removing device '%s' removed a different device.", n->id); while(n->classes) tc_class_free(n, n->classes); freez(n->id); freez(n->name); freez(n->family); freez(n); }
static inline void tc_device_free(struct tc_device *n) { if(n->next) n->next->prev = n->prev; if(n->prev) n->prev->next = n->next; if(tc_device_root == n) { if(n->next) tc_device_root = n->next; else tc_device_root = n->prev; } tc_device_index_del(n); while(n->classes) tc_class_free(n, n->classes); if(n->id) free(n->id); if(n->name) free(n->name); if(n->family) free(n->family); free(n); }
static inline void tc_device_classes_cleanup(struct tc_device *d) { static int cleanup_every = 999; if(cleanup_every > 0) { cleanup_every = (int) -config_get_number("plugin:tc", "cleanup unused classes every", 60); if(cleanup_every > 0) cleanup_every = -cleanup_every; if(cleanup_every == 0) cleanup_every = -1; } struct tc_class *c = d->classes; while(c) { if(c->seen < cleanup_every) { struct tc_class *nc = c->next; tc_class_free(d, c); c = nc; } else c = c->next; if(c) { c->updated = 0; c->seen--; } } }