X-Git-Url: https://jfr.im/git/solanum.git/blobdiff_plain/ff12cc94790de2e87e78ee7aa378f21fa415d73c..e8f1c19e7b8fb83623e5f36aa55b5cbd3acc5eea:/ircd/monitor.c diff --git a/ircd/monitor.c b/ircd/monitor.c index 25df1793..bab371ed 100644 --- a/ircd/monitor.c +++ b/ircd/monitor.c @@ -37,44 +37,31 @@ #include "hash.h" #include "numeric.h" #include "send.h" +#include "irc_radixtree.h" -static rb_dlink_list monitorTable[MONITOR_HASH_SIZE]; -static rb_bh *monitor_heap; +static struct irc_radixtree *monitor_tree; void init_monitor(void) { - monitor_heap = rb_bh_create(sizeof(struct monitor), MONITOR_HEAP_SIZE, "monitor_heap"); -} - -static inline unsigned int -hash_monitor_nick(const char *name) -{ - return fnv_hash_upper((const unsigned char *)name, MONITOR_HASH_BITS); + monitor_tree = irc_radixtree_create("monitor lists", irc_radixtree_irccasecanon); } struct monitor * find_monitor(const char *name, int add) { struct monitor *monptr; - rb_dlink_node *ptr; - - unsigned int hashv = hash_monitor_nick(name); - RB_DLINK_FOREACH(ptr, monitorTable[hashv].head) - { - monptr = ptr->data; - if(!irccmp(monptr->name, name)) - return monptr; - } + monptr = irc_radixtree_retrieve(monitor_tree, name); + if (monptr != NULL) + return monptr; if(add) { - monptr = rb_bh_alloc(monitor_heap); + monptr = rb_malloc(sizeof(*monptr)); rb_strlcpy(monptr->name, name, sizeof(monptr->name)); - monptr->hashv = hashv; + irc_radixtree_add(monitor_tree, monptr->name, monptr); - rb_dlinkAdd(monptr, &monptr->node, &monitorTable[hashv]); return monptr; } @@ -87,8 +74,8 @@ free_monitor(struct monitor *monptr) if (rb_dlink_list_length(&monptr->users) > 0) return; - rb_dlinkDelete(&monptr->node, &monitorTable[monptr->hashv]); - rb_bh_free(monitor_heap, monptr); + irc_radixtree_delete(monitor_tree, monptr->name); + rb_free(monptr); } /* monitor_signon() @@ -108,7 +95,7 @@ monitor_signon(struct Client *client_p) if(monptr == NULL) return; - rb_snprintf(buf, sizeof(buf), "%s!%s@%s", client_p->name, client_p->username, client_p->host); + snprintf(buf, sizeof(buf), "%s!%s@%s", client_p->name, client_p->username, client_p->host); sendto_monitor(monptr, form_str(RPL_MONONLINE), me.name, "*", buf); }