| 635 | } |
| 636 | |
| 637 | cs_error_t stats_map_track_add(const char *key_name, |
| 638 | int32_t track_type, |
| 639 | icmap_notify_fn_t notify_fn, |
| 640 | void *user_data, |
| 641 | icmap_track_t *icmap_track) |
| 642 | { |
| 643 | struct cs_stats_tracker *tracker; |
| 644 | size_t value_len; |
| 645 | icmap_value_types_t type; |
| 646 | cs_error_t err; |
| 647 | |
| 648 | /* We can track adding or deleting a key under a prefix */ |
| 649 | if ((track_type & ICMAP_TRACK_PREFIX) && |
| 650 | (!(track_type & ICMAP_TRACK_DELETE) || |
| 651 | !(track_type & ICMAP_TRACK_ADD))) { |
| 652 | return CS_ERR_NOT_SUPPORTED; |
| 653 | } |
| 654 | |
| 655 | tracker = malloc(sizeof(struct cs_stats_tracker)); |
| 656 | if (!tracker) { |
| 657 | return CS_ERR_NO_MEMORY; |
| 658 | } |
| 659 | |
| 660 | tracker->notify_fn = notify_fn; |
| 661 | tracker->user_data = user_data; |
| 662 | tracker->events = track_type; |
| 663 | if (key_name) { |
| 664 | tracker->key_name = strdup(key_name); |
| 665 | if (!tracker->key_name) { |
| 666 | free(tracker); |
| 667 | return CS_ERR_NO_MEMORY; |
| 668 | } |
| 669 | /* Get initial value */ |
| 670 | if (stats_map_get(tracker->key_name, |
| 671 | &tracker->old_value, &value_len, &type) != CS_OK) { |
| 672 | tracker->old_value = 0ULL; |
| 673 | } |
| 674 | } else { |
| 675 | tracker->key_name = NULL; |
| 676 | tracker->old_value = 0ULL; |
| 677 | } |
| 678 | |
| 679 | /* Add/delete trackers can use the qb_map tracking */ |
| 680 | if ((track_type & ICMAP_TRACK_ADD) || |
| 681 | (track_type & ICMAP_TRACK_DELETE)) { |
| 682 | err = qb_map_notify_add(stats_map, tracker->key_name, |
| 683 | stats_map_notify_fn, |
| 684 | icmap_tt_to_qbtt(track_type), |
| 685 | tracker); |
| 686 | if (err != 0) { |
| 687 | log_printf(LOGSYS_LEVEL_ERROR, "creating stats tracker %s failed. %d\n", tracker->key_name, err); |
| 688 | free(tracker->key_name); |
| 689 | free(tracker); |
| 690 | return (qb_to_cs_error(err)); |
| 691 | } |
| 692 | } |
| 693 | |
| 694 | qb_list_add (&tracker->list, &stats_tracker_list_head); |
nothing calls this directly
no test coverage detected