Просмотр исходного кода

client: FrameDecider: port groups tree to CAvl

ambrop7 13 лет назад
Родитель
Сommit
cff5caf333
3 измененных файлов с 37 добавлено и 9 удалено
  1. 11 7
      client/FrameDecider.c
  2. 11 2
      client/FrameDecider.h
  3. 15 0
      client/FrameDecider_groups_tree.h

+ 11 - 7
client/FrameDecider.c

@@ -60,6 +60,9 @@ static int compare_macs (const uint8_t *mac1, const uint8_t *mac2)
 #include "FrameDecider_macs_tree.h"
 #include <structure/CAvl_impl.h>
 
+#include "FrameDecider_groups_tree.h"
+#include <structure/CAvl_impl.h>
+
 static int uint32_comparator (void *user, uint32_t *v1, uint32_t *v2)
 {
     if (*v1 < *v2) {
@@ -209,9 +212,9 @@ static void add_group_to_peer (FrameDeciderPeer *o, uint32_t group)
     struct _FrameDecider_group_entry *group_entry;
     
     // lookup if the peer already has that group
-    BAVLNode *old_tree_node;
-    if ((old_tree_node = BAVL_LookupExact(&o->groups_tree, &group))) {
-        group_entry = UPPER_OBJECT(old_tree_node, struct _FrameDecider_group_entry, tree_node);
+    FDGroupsTreeRef ref = FDGroupsTree_LookupExact(&o->groups_tree, 0, group);
+    if (FDGroupsTreeIsValidRef(ref)) {
+        group_entry = ref.ptr;
         
         // move to end of used list
         LinkedList2_Remove(&o->group_entries_used, &group_entry->list_node);
@@ -237,7 +240,7 @@ static void add_group_to_peer (FrameDeciderPeer *o, uint32_t group)
             remove_from_multicast(d, group_entry);
             
             // remove from peer's groups tree
-            BAVL_Remove(&o->groups_tree, &group_entry->tree_node);
+            FDGroupsTree_Remove(&o->groups_tree, 0, FDGroupsTreeDeref(0, group_entry));
             
             // remove from used list
             LinkedList2_Remove(&o->group_entries_used, &group_entry->list_node);
@@ -250,7 +253,8 @@ static void add_group_to_peer (FrameDeciderPeer *o, uint32_t group)
         group_entry->group = group;
         
         // insert to peer's groups tree
-        ASSERT_EXECUTE(BAVL_Insert(&o->groups_tree, &group_entry->tree_node, NULL))
+        int res = FDGroupsTree_Insert(&o->groups_tree, 0, FDGroupsTreeDeref(0, group_entry), NULL);
+        ASSERT(res)
         
         // add to multicast
         add_to_multicast(d, group_entry);
@@ -276,7 +280,7 @@ static void remove_group_entry (struct _FrameDecider_group_entry *group_entry)
     remove_from_multicast(d, group_entry);
     
     // remove from peer's groups tree
-    BAVL_Remove(&peer->groups_tree, &group_entry->tree_node);
+    FDGroupsTree_Remove(&peer->groups_tree, 0, FDGroupsTreeDeref(0, group_entry));
     
     // remove from used list
     LinkedList2_Remove(&peer->group_entries_used, &group_entry->list_node);
@@ -614,7 +618,7 @@ int FrameDeciderPeer_Init (FrameDeciderPeer *o, FrameDecider *d, void *user, BLo
     }
     
     // initialize groups tree
-    BAVL_Init(&o->groups_tree, OFFSET_DIFF(struct _FrameDecider_group_entry, group, tree_node), (BAVL_comparator)uint32_comparator, NULL);
+    FDGroupsTree_Init(&o->groups_tree);
     
     DebugObject_Init(&o->d_obj);
     

+ 11 - 2
client/FrameDecider.h

@@ -65,7 +65,10 @@ struct _FrameDecider_group_entry {
     // defined when used:
     // basic group data
     uint32_t group; // group address
-    BAVLNode tree_node; // node in FrameDeciderPeer.groups_tree, indexed by group
+    // node in FrameDeciderPeer.groups_tree, indexed by group
+    struct _FrameDecider_group_entry *tree_child[2];
+    struct _FrameDecider_group_entry *tree_parent;
+    int8_t tree_balance;
     // all that folows is managed by add_to_multicast() and remove_from_multicast()
     LinkedList3Node sig_list_node; // node in list of group entries with the same sig
     btime_t timer_endtime;
@@ -84,6 +87,12 @@ typedef const uint8_t *FDMacsTree_key;
 #include "FrameDecider_macs_tree.h"
 #include <structure/CAvl_decl.h>
 
+typedef struct _FrameDecider_group_entry FDGroupsTree_entry;
+typedef struct _FrameDecider_group_entry *FDGroupsTree_link;
+
+#include "FrameDecider_groups_tree.h"
+#include <structure/CAvl_decl.h>
+
 /**
  * Object that represents a local device.
  */
@@ -117,7 +126,7 @@ typedef struct _FrameDeciderPeer {
     LinkedList2 mac_entries_used;
     LinkedList2 group_entries_free;
     LinkedList2 group_entries_used;
-    BAVL groups_tree;
+    FDGroupsTree groups_tree;
     DebugObject d_obj;
 } FrameDeciderPeer;
 

+ 15 - 0
client/FrameDecider_groups_tree.h

@@ -0,0 +1,15 @@
+#define CAVL_PARAM_NAME FDGroupsTree
+#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 FDGroupsTree_entry
+#define CAVL_PARAM_TYPE_LINK FDGroupsTree_link
+#define CAVL_PARAM_TYPE_KEY uint32_t
+#define CAVL_PARAM_TYPE_ARG int
+#define CAVL_PARAM_VALUE_NULL ((FDGroupsTree_link)NULL)
+#define CAVL_PARAM_FUN_DEREF(arg, link) (link)
+#define CAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) B_COMPARE((entry1).ptr->group, (entry2).ptr->group)
+#define CAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) B_COMPARE((key1), (entry2).ptr->group)
+#define CAVL_PARAM_MEMBER_CHILD tree_child
+#define CAVL_PARAM_MEMBER_BALANCE tree_balance
+#define CAVL_PARAM_MEMBER_PARENT tree_parent