]> jfr.im git - irc/quakenet/newserv.git/commitdiff
patricia trie changes
authorPaul <redacted>
Thu, 29 May 2008 17:48:08 +0000 (18:48 +0100)
committerPaul <redacted>
Thu, 29 May 2008 17:48:08 +0000 (18:48 +0100)
localuser/localuser.c
nick/nick.c
nick/nickhandlers.c
patricia/patricia.h
patricia/patricia_commands.c
patricia/patricialib.c

index f3d6170d0fbe365df669ec9f67800ea3b182a431..94062d0429a2e2d174d4f313e4ef0fe0807e7e01 100644 (file)
@@ -109,7 +109,7 @@ nick *registerlocaluserwithuseridflags(char *nickname, char *ident, char *host,
   ((unsigned char *)(ipaddress.in6_16))[15] = (currentlocalunum%253)+1;
 
   newuser->ipnode = refnode(iptree, &ipaddress, PATRICIA_MAXBITS);
-  newuser->ipnode->usercount++;
+  node_increment_usercount(newuser->ipnode);
 
   newuser->timestamp=getnettime();
   newuser->shident=NULL;
index 679f05549859b6bf03ad232135c1cd8813abc0ae..e7ecf4e19ed02ba742876e53c2d8a5b9792f5ece 100644 (file)
@@ -190,7 +190,7 @@ void deletenick(nick *np) {
   freesstring(np->shident); /* freesstring(NULL) is OK */
   freesstring(np->sethost); 
 
-  np->ipnode->usercount--;
+  node_decrement_usercount(np->ipnode);
   derefnode(iptree, np->ipnode);
   
   /* TODO: figure out how to cleanly remove nodes without affecting other modules */
index 3c514e410f1a1b3f3857011aa6bbc4aafe43b487..7a7cfacefa10b329d46cf286fa31eb0d9845bb80 100644 (file)
@@ -141,7 +141,7 @@ int handlenickmsg(void *source, int cargc, char **cargv) {
     base64toip(cargv[cargc-3], &ipaddress);
     /* todo: use a single node for /64 prefixes */
     np->ipnode = refnode(iptree, &ipaddress, irc_in_addr_is_ipv4(&ipaddress) ? PATRICIA_MAXBITS : 64);
-    np->ipnode->usercount++;
+    node_increment_usercount(np->ipnode);
 
     np->shident=NULL;
     np->sethost=NULL;
index 8ea603586a217e08e2a863a8d0025d04d7cddd89..2f6b66c4035d73654adc10a27224c8c90ed220d8 100644 (file)
@@ -96,6 +96,9 @@ int registernodeext(const char *name);
 int findnodeext(const char *name);
 void releasenodeext(int index);
 
+void node_increment_usercount( patricia_node_t *node);
+void node_decrement_usercount( patricia_node_t *node);
+
 /* alloc */
 void freeprefix (prefix_t *prefix);
 prefix_t *newprefix();
index 6abc4214f8ea442d357a3308be6d2ffaac99bc9e..82821786c4df9e6912f9aaed65225ff71d31eea6 100644 (file)
@@ -71,7 +71,7 @@ int nc_cmd_dumptree(void *source, int cargc, char **cargv) {
           controlreply(np,"%p: bit: %d, usercount: %d, IP: %s", node, node->bit, node->usercount, IPtostr(node->prefix->sin));
           break;
         case 3: 
-          controlreply(np,"%p: L: %p, R: %p", node, node->l, node->r);
+          controlreply(np,"%p: L: %p, R: %p P: %p", node, node->l, node->r, node->parent);
           break;
         case 4: 
           controlreply(np,"%p: 0: %p, 1: %p, 2: %p, 3: %p, 4: %p", node, 
@@ -104,7 +104,7 @@ int nc_cmd_dumptree(void *source, int cargc, char **cargv) {
           controlreply(np,"%p: bit: %d, usercount: %d, IP: %s", node, node->bit, node->usercount, node->prefix?IPtostr(node->prefix->sin):"");
           break;
         case 13:
-          controlreply(np,"%p: L: %p, R: %p", node, node->l, node->r);
+          controlreply(np,"%p: L: %p, R: %p P: %p", node, node->l, node->r, node->parent);
           break;
         case 14:
           controlreply(np,"%p%s 0: %p, 1: %p, 2: %p, 3: %p, 4: %p", node, node->prefix?"-":":",
@@ -144,11 +144,7 @@ int nc_cmd_nodecount(void *source, int cargc, char **cargv) {
 
   head = refnode(iptree, &sin, bits);
 
-  count = 0;
-
-  PATRICIA_WALK(head, node) {
-    count += node->usercount;
-  } PATRICIA_WALK_END;
+  count = head->usercount;
 
   derefnode(iptree, head);
 
index 0752016cf9129c5f63b5dd3f20bedc78f5ce5b30..460685c10440a2e74fe8359442df026a2e7cf679 100644 (file)
@@ -374,7 +374,6 @@ patricia_lookup (patricia_tree_t *patricia, prefix_t *prefix)
     }
 
     new_node = patricia_new_node(patricia, prefix->bitlen, patricia_ref_prefix (prefix));
-
     if (node->bit == differ_bit) {
        new_node->parent = node;
        if (node->bit < patricia->maxbits &&
@@ -391,7 +390,7 @@ patricia_lookup (patricia_tree_t *patricia, prefix_t *prefix)
 
     if (bitlen == differ_bit) {
        if (bitlen < patricia->maxbits &&
-           (is_bit_set(addr,bitlen))) {
+           (is_bit_set(test_addr,bitlen))) {
            new_node->r = node;
        }
        else {
@@ -409,11 +408,11 @@ patricia_lookup (patricia_tree_t *patricia, prefix_t *prefix)
            node->parent->l = new_node;
        }
        node->parent = new_node;
+        new_node->usercount = node->usercount;
     }
     else {
         glue = patricia_new_node(patricia, differ_bit, NULL);
         glue->parent = node->parent;
-        
        if (differ_bit < patricia->maxbits &&
            (is_bit_set(addr, differ_bit))) {
            glue->r = new_node;
@@ -436,7 +435,9 @@ patricia_lookup (patricia_tree_t *patricia, prefix_t *prefix)
            node->parent->l = glue;
        }
        node->parent = glue;
+        glue->usercount = node->usercount;
     }
+
     return (new_node);
 }
 
@@ -572,3 +573,16 @@ patricia_node_t *patricia_new_node(patricia_tree_t *patricia, unsigned char bit,
   return new_node;  
 }
 
+void node_increment_usercount( patricia_node_t *node) {
+  while(node) {
+    node->usercount++;
+    node=node->parent;
+  }
+}
+
+void node_decrement_usercount( patricia_node_t *node) {
+  while(node) {
+    node->usercount--;
+    node=node->parent;
+  }
+}