diff --git a/include/osmocom/core/stat_item.h b/include/osmocom/core/stat_item.h index 003c9e07a..0786a3ba5 100644 --- a/include/osmocom/core/stat_item.h +++ b/include/osmocom/core/stat_item.h @@ -107,6 +107,20 @@ int stat_item_discard(const struct stat_item *item, int32_t *idx); /*! \brief Skip all values of all items and update idx accordingly */ int stat_item_discard_all(int32_t *idx); +typedef int (*stat_item_handler_t)( + struct stat_item_group *, struct stat_item *, void *); + +typedef int (*stat_item_group_handler_t)(struct stat_item_group *, void *); + +/*! \brief Iteate over all items + * \param[in] handle_item Call-back function, aborts if rc < 0 + * \param[in] data Private data handed through to \a handle_item + */ +int stat_item_for_each_item(struct stat_item_group *statg, + stat_item_handler_t handle_item, void *data); + +int stat_item_for_each_group(stat_item_group_handler_t handle_group, void *data); + static inline int32_t stat_item_get_last(const struct stat_item *item) { return item->values[item->last_offs].value; diff --git a/src/stat_item.c b/src/stat_item.c index 1e283d481..525a94b9c 100644 --- a/src/stat_item.c +++ b/src/stat_item.c @@ -235,4 +235,34 @@ const struct stat_item *stat_item_get_by_name( return NULL; } +int stat_item_for_each_item(struct stat_item_group *statg, + stat_item_handler_t handle_item, void *data) +{ + int rc = 0; + int i; + + for (i = 0; i < statg->desc->num_items; i++) { + struct stat_item *item = statg->items[i]; + rc = handle_item(statg, item, data); + if (rc < 0) + return rc; + } + + return rc; +} + +int stat_item_for_each_group(stat_item_group_handler_t handle_group, void *data) +{ + struct stat_item_group *statg; + int rc = 0; + + llist_for_each_entry(statg, &stat_item_groups, list) { + rc = handle_group(statg, data); + if (rc < 0) + return rc; + } + + return rc; +} + /*! @} */