Преглед изворни кода

client: FrameDecider: port multicast tree to CAvl

ambrop7 пре 13 година
родитељ
комит
8802e52497
3 измењених фајлова са 44 додато и 27 уклоњено
  1. 18 24
      client/FrameDecider.c
  2. 11 3
      client/FrameDecider.h
  3. 15 0
      client/FrameDecider_multicast_tree.h

+ 18 - 24
client/FrameDecider.c

@@ -63,16 +63,8 @@ static int compare_macs (const uint8_t *mac1, const uint8_t *mac2)
 #include "FrameDecider_groups_tree.h"
 #include "FrameDecider_groups_tree.h"
 #include <structure/CAvl_impl.h>
 #include <structure/CAvl_impl.h>
 
 
-static int uint32_comparator (void *user, uint32_t *v1, uint32_t *v2)
-{
-    if (*v1 < *v2) {
-        return -1;
-    }
-    if (*v1 > *v2) {
-        return 1;
-    }
-    return 0;
-}
+#include "FrameDecider_multicast_tree.h"
+#include <structure/CAvl_impl.h>
 
 
 static void add_mac_to_peer (FrameDeciderPeer *o, uint8_t *mac)
 static void add_mac_to_peer (FrameDeciderPeer *o, uint8_t *mac)
 {
 {
@@ -145,10 +137,10 @@ static void add_to_multicast (FrameDecider *d, struct _FrameDecider_group_entry
     // compute sig
     // compute sig
     uint32_t sig = compute_sig_for_group(group_entry->group);
     uint32_t sig = compute_sig_for_group(group_entry->group);
     
     
-    BAVLNode *node;
-    if (node = BAVL_LookupExact(&d->multicast_tree, &sig)) {
+    FDMulticastTreeRef ref = FDMulticastTree_LookupExact(&d->multicast_tree, 0, sig);
+    if (FDMulticastTreeIsValidRef(ref)) {
         // use existing master
         // use existing master
-        struct _FrameDecider_group_entry *master = UPPER_OBJECT(node, struct _FrameDecider_group_entry, master.tree_node);
+        struct _FrameDecider_group_entry *master = ref.ptr;
         ASSERT(master->is_master)
         ASSERT(master->is_master)
         
         
         // set not master
         // set not master
@@ -166,7 +158,8 @@ static void add_to_multicast (FrameDecider *d, struct _FrameDecider_group_entry
         group_entry->master.sig = sig;
         group_entry->master.sig = sig;
         
         
         // insert to multicast tree
         // insert to multicast tree
-        ASSERT_EXECUTE(BAVL_Insert(&d->multicast_tree, &group_entry->master.tree_node, NULL))
+        int res = FDMulticastTree_Insert(&d->multicast_tree, 0, FDMulticastTreeDeref(0, group_entry), NULL);
+        ASSERT(res)
         
         
         // init list node
         // init list node
         LinkedList3Node_InitLonely(&group_entry->sig_list_node);
         LinkedList3Node_InitLonely(&group_entry->sig_list_node);
@@ -180,7 +173,7 @@ static void remove_from_multicast (FrameDecider *d, struct _FrameDecider_group_e
     
     
     if (group_entry->is_master) {
     if (group_entry->is_master) {
         // remove master from multicast tree
         // remove master from multicast tree
-        BAVL_Remove(&d->multicast_tree, &group_entry->master.tree_node);
+        FDMulticastTree_Remove(&d->multicast_tree, 0, FDMulticastTreeDeref(0, group_entry));
         
         
         if (!LinkedList3Node_IsLonely(&group_entry->sig_list_node)) {
         if (!LinkedList3Node_IsLonely(&group_entry->sig_list_node)) {
             // at least one more group entry for this sig; make another entry the master
             // at least one more group entry for this sig; make another entry the master
@@ -197,7 +190,8 @@ static void remove_from_multicast (FrameDecider *d, struct _FrameDecider_group_e
             newmaster->master.sig = sig;
             newmaster->master.sig = sig;
             
             
             // insert to multicast tree
             // insert to multicast tree
-            ASSERT_EXECUTE(BAVL_Insert(&d->multicast_tree, &newmaster->master.tree_node, NULL))
+            int res = FDMulticastTree_Insert(&d->multicast_tree, 0, FDMulticastTreeDeref(0, newmaster), NULL);
+            ASSERT(res)
         }
         }
     }
     }
     
     
@@ -300,11 +294,11 @@ static void lower_group_timers_to_lmqt (FrameDecider *d, uint32_t group)
     uint32_t sig = compute_sig_for_group(group);
     uint32_t sig = compute_sig_for_group(group);
     
     
     // look up the sig in multicast tree
     // look up the sig in multicast tree
-    BAVLNode *tree_node;
-    if (!(tree_node = BAVL_LookupExact(&d->multicast_tree, &sig))) {
+    FDMulticastTreeRef ref = FDMulticastTree_LookupExact(&d->multicast_tree, 0, sig);
+    if (FDMulticastTreeIsNullRef(ref)) {
         return;
         return;
     }
     }
-    struct _FrameDecider_group_entry *master = UPPER_OBJECT(tree_node, struct _FrameDecider_group_entry, master.tree_node);
+    struct _FrameDecider_group_entry *master = ref.ptr;
     ASSERT(master->is_master)
     ASSERT(master->is_master)
     
     
     // iterate all group entries with this sig
     // iterate all group entries with this sig
@@ -354,7 +348,7 @@ void FrameDecider_Init (FrameDecider *o, int max_peer_macs, int max_peer_groups,
     FDMacsTree_Init(&o->macs_tree);
     FDMacsTree_Init(&o->macs_tree);
     
     
     // init multicast tree
     // init multicast tree
-    BAVL_Init(&o->multicast_tree, OFFSET_DIFF(struct _FrameDecider_group_entry, master.sig, master.tree_node), (BAVL_comparator)uint32_comparator, NULL);
+    FDMulticastTree_Init(&o->multicast_tree);
     
     
     // init decide state
     // init decide state
     o->decide_state = DECIDE_STATE_NONE;
     o->decide_state = DECIDE_STATE_NONE;
@@ -364,7 +358,7 @@ void FrameDecider_Init (FrameDecider *o, int max_peer_macs, int max_peer_groups,
 
 
 void FrameDecider_Free (FrameDecider *o)
 void FrameDecider_Free (FrameDecider *o)
 {
 {
-    ASSERT(BAVL_IsEmpty(&o->multicast_tree))
+    ASSERT(FDMulticastTree_IsEmpty(&o->multicast_tree))
     ASSERT(FDMacsTree_IsEmpty(&o->macs_tree))
     ASSERT(FDMacsTree_IsEmpty(&o->macs_tree))
     ASSERT(LinkedList2_IsEmpty(&o->peers_list))
     ASSERT(LinkedList2_IsEmpty(&o->peers_list))
     DebugObject_Free(&o->d_obj);
     DebugObject_Free(&o->d_obj);
@@ -492,9 +486,9 @@ out:;
         uint32_t sig = compute_sig_for_mac(eh->dest);
         uint32_t sig = compute_sig_for_mac(eh->dest);
         
         
         // look up the sig in multicast tree
         // look up the sig in multicast tree
-        BAVLNode *node;
-        if (node = BAVL_LookupExact(&o->multicast_tree, &sig)) {
-            struct _FrameDecider_group_entry *master = UPPER_OBJECT(node, struct _FrameDecider_group_entry, master.tree_node);
+        FDMulticastTreeRef ref = FDMulticastTree_LookupExact(&o->multicast_tree, 0, sig);
+        if (FDMulticastTreeIsValidRef(ref)) {
+            struct _FrameDecider_group_entry *master = ref.ptr;
             ASSERT(master->is_master)
             ASSERT(master->is_master)
             
             
             o->decide_state = DECIDE_STATE_MULTICAST;
             o->decide_state = DECIDE_STATE_MULTICAST;

+ 11 - 3
client/FrameDecider.h

@@ -37,7 +37,6 @@
 
 
 #include <stdint.h>
 #include <stdint.h>
 
 
-#include <structure/BAVL.h>
 #include <structure/LinkedList2.h>
 #include <structure/LinkedList2.h>
 #include <structure/LinkedList3.h>
 #include <structure/LinkedList3.h>
 #include <structure/CAvl.h>
 #include <structure/CAvl.h>
@@ -76,7 +75,10 @@ struct _FrameDecider_group_entry {
     // defined when used and we are master:
     // defined when used and we are master:
     struct {
     struct {
         uint32_t sig; // last 23 bits of group address
         uint32_t sig; // last 23 bits of group address
-        BAVLNode tree_node; // node in FrameDecider.multicast_tree, indexed by sig
+        // node in FrameDecider.multicast_tree, indexed by sig
+        struct _FrameDecider_group_entry *tree_child[2];
+        struct _FrameDecider_group_entry *tree_parent;
+        int8_t tree_balance;
     } master;
     } master;
 };
 };
 
 
@@ -93,6 +95,12 @@ typedef struct _FrameDecider_group_entry *FDGroupsTree_link;
 #include "FrameDecider_groups_tree.h"
 #include "FrameDecider_groups_tree.h"
 #include <structure/CAvl_decl.h>
 #include <structure/CAvl_decl.h>
 
 
+typedef struct _FrameDecider_group_entry FDMulticastTree_entry;
+typedef struct _FrameDecider_group_entry *FDMulticastTree_link;
+
+#include "FrameDecider_multicast_tree.h"
+#include <structure/CAvl_decl.h>
+
 /**
 /**
  * Object that represents a local device.
  * Object that represents a local device.
  */
  */
@@ -104,7 +112,7 @@ typedef struct {
     BReactor *reactor;
     BReactor *reactor;
     LinkedList2 peers_list;
     LinkedList2 peers_list;
     FDMacsTree macs_tree;
     FDMacsTree macs_tree;
-    BAVL multicast_tree;
+    FDMulticastTree multicast_tree;
     int decide_state;
     int decide_state;
     LinkedList2Iterator decide_flood_it;
     LinkedList2Iterator decide_flood_it;
     struct _FrameDeciderPeer *decide_unicast_peer;
     struct _FrameDeciderPeer *decide_unicast_peer;

+ 15 - 0
client/FrameDecider_multicast_tree.h

@@ -0,0 +1,15 @@
+#define CAVL_PARAM_NAME FDMulticastTree
+#define CAVL_PARAM_FEATURE_COUNTS 0
+#define CAVL_PARAM_FEATURE_KEYS_ARE_INDICES 0
+#define CAVL_PARAM_FEATURE_NOKEYS 0
+#define CAVL_PARAM_TYPE_ENTRY FDMulticastTree_entry
+#define CAVL_PARAM_TYPE_LINK FDMulticastTree_link
+#define CAVL_PARAM_TYPE_KEY uint32_t
+#define CAVL_PARAM_TYPE_ARG int
+#define CAVL_PARAM_VALUE_NULL ((FDMulticastTree_link)NULL)
+#define CAVL_PARAM_FUN_DEREF(arg, link) (link)
+#define CAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) B_COMPARE((entry1).ptr->master.sig, (entry2).ptr->master.sig)
+#define CAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) B_COMPARE((key1), (entry2).ptr->master.sig)
+#define CAVL_PARAM_MEMBER_CHILD master.tree_child
+#define CAVL_PARAM_MEMBER_BALANCE master.tree_balance
+#define CAVL_PARAM_MEMBER_PARENT master.tree_parent