ircd: irc_radixtree: add some convenience functions for tracking radix tree stats
This commit is contained in:
parent
8e6ba6f9ce
commit
325cc939b7
2 changed files with 22 additions and 41 deletions
|
@ -60,7 +60,7 @@ struct irc_radixtree_iteration_state
|
|||
* compare_cb is the canonizing function.
|
||||
*/
|
||||
|
||||
extern struct irc_radixtree *irc_radixtree_create(void (*canonize_cb)(char *key));
|
||||
extern struct irc_radixtree *irc_radixtree_create(const char *name, void (*canonize_cb)(char *key));
|
||||
|
||||
/*
|
||||
* irc_radixtree_shutdown() deallocates all heaps used in patricia trees. This is
|
||||
|
@ -136,5 +136,6 @@ void *irc_radixtree_elem_get_data(struct irc_radixtree_leaf *elem);
|
|||
|
||||
unsigned int irc_radixtree_size(struct irc_radixtree *dict);
|
||||
void irc_radixtree_stats(struct irc_radixtree *dict, void (*cb)(const char *line, void *privdata), void *privdata);
|
||||
void irc_radixtree_stats_walk(void (*cb)(const char *line, void *privdata), void *privdata);
|
||||
|
||||
#endif
|
||||
|
|
|
@ -36,6 +36,8 @@
|
|||
#include "s_assert.h"
|
||||
#include "irc_radixtree.h"
|
||||
|
||||
rb_dlink_list radixtree_list = {NULL, NULL, 0};
|
||||
|
||||
/*
|
||||
* Patricia tree.
|
||||
*
|
||||
|
@ -59,6 +61,8 @@ struct irc_radixtree
|
|||
|
||||
unsigned int count;
|
||||
char *id;
|
||||
|
||||
rb_dlink_node node;
|
||||
};
|
||||
|
||||
#define POINTERS_PER_NODE 16
|
||||
|
@ -137,34 +141,6 @@ first_leaf(union irc_radixtree_elem *delem)
|
|||
return delem;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_radixtree_create(void (*canonize_cb)(char *key))
|
||||
*
|
||||
* Dictionary object factory.
|
||||
*
|
||||
* Inputs:
|
||||
* - function to use for canonizing keys (for example, use
|
||||
* a function that makes the string upper case to create
|
||||
* a patricia with case-insensitive matching)
|
||||
*
|
||||
* Outputs:
|
||||
* - on success, a new patricia object.
|
||||
*
|
||||
* Side Effects:
|
||||
* - if services runs out of memory and cannot allocate the object,
|
||||
* the program will abort.
|
||||
*/
|
||||
struct irc_radixtree *
|
||||
irc_radixtree_create(void (*canonize_cb)(char *key))
|
||||
{
|
||||
struct irc_radixtree *dtree = (struct irc_radixtree *) rb_malloc(sizeof(struct irc_radixtree));
|
||||
|
||||
dtree->canonize_cb = canonize_cb;
|
||||
dtree->root = NULL;
|
||||
|
||||
return dtree;
|
||||
}
|
||||
|
||||
/*
|
||||
* irc_radixtree_create_named(const char *name,
|
||||
* void (*canonize_cb)(char *key))
|
||||
|
@ -185,7 +161,7 @@ irc_radixtree_create(void (*canonize_cb)(char *key))
|
|||
* the program will abort.
|
||||
*/
|
||||
struct irc_radixtree *
|
||||
irc_radixtree_create_named(const char *name, void (*canonize_cb)(char *key))
|
||||
irc_radixtree_create(const char *name, void (*canonize_cb)(char *key))
|
||||
{
|
||||
struct irc_radixtree *dtree = (struct irc_radixtree *) rb_malloc(sizeof(struct irc_radixtree));
|
||||
|
||||
|
@ -193,6 +169,8 @@ irc_radixtree_create_named(const char *name, void (*canonize_cb)(char *key))
|
|||
dtree->id = rb_strdup(name);
|
||||
dtree->root = NULL;
|
||||
|
||||
rb_dlinkAdd(dtree, &dtree->node, &radixtree_list);
|
||||
|
||||
return dtree;
|
||||
}
|
||||
|
||||
|
@ -1053,26 +1031,28 @@ irc_radixtree_stats(struct irc_radixtree *dict, void (*cb)(const char *line, voi
|
|||
|
||||
s_assert(dict != NULL);
|
||||
|
||||
if (dict->id != NULL)
|
||||
snprintf(str, sizeof str, "Dictionary stats for %s (%d)",
|
||||
dict->id, dict->count);
|
||||
else
|
||||
snprintf(str, sizeof str, "Dictionary stats for <%p> (%d)",
|
||||
(void *) dict, dict->count);
|
||||
|
||||
cb(str, privdata);
|
||||
maxdepth = 0;
|
||||
|
||||
if (dict->count > 0)
|
||||
{
|
||||
sum = stats_recurse(dict->root, 0, &maxdepth);
|
||||
snprintf(str, sizeof str, "Depth sum %d Avg depth %d Max depth %d", sum, sum / dict->count, maxdepth);
|
||||
snprintf(str, sizeof str, "%s: Objects: %d, Depth sum: %d, Avg depth: %d, Max depth: %d.", dict->id, dict->count, sum, sum / dict->count, maxdepth);
|
||||
}
|
||||
else
|
||||
{
|
||||
snprintf(str, sizeof str, "Depth sum 0 Avg depth 0 Max depth 0");
|
||||
snprintf(str, sizeof str, "%s: Objects: 0, Depth sum: 0, Avg depth: 0, Max depth: 0.", dict->id);
|
||||
}
|
||||
|
||||
cb(str, privdata);
|
||||
return;
|
||||
}
|
||||
|
||||
void
|
||||
irc_radixtree_stats_walk(void (*cb)(const char *line, void *privdata), void *privdata)
|
||||
{
|
||||
rb_dlink_node *ptr;
|
||||
|
||||
RB_DLINK_FOREACH(ptr, radixtree_list.head)
|
||||
{
|
||||
irc_radixtree_stats(ptr->data, cb, privdata);
|
||||
}
|
||||
}
|
||||
|
|
Loading…
Reference in a new issue