浏览代码

client: FrameDecider: port macs tree to SAvl

ambrop7 13 年之前
父节点
当前提交
41bc997a15
共有 3 个文件被更改,包括 31 次插入43 次删除
  1. 14 17
      client/FrameDecider.c
  2. 8 11
      client/FrameDecider.h
  3. 9 15
      client/FrameDecider_macs_tree.h

+ 14 - 17
client/FrameDecider.c

@@ -58,7 +58,7 @@ static int compare_macs (const uint8_t *mac1, const uint8_t *mac2)
 }
 
 #include "FrameDecider_macs_tree.h"
-#include <structure/CAvl_impl.h>
+#include <structure/SAvl_impl.h>
 
 #include "FrameDecider_groups_tree.h"
 #include <structure/CAvl_impl.h>
@@ -71,21 +71,19 @@ static void add_mac_to_peer (FrameDeciderPeer *o, uint8_t *mac)
     FrameDecider *d = o->d;
     
     // locate entry in tree
-    FDMacsTreeRef ref = FDMacsTree_LookupExact(&d->macs_tree, 0, mac);
-    if (FDMacsTreeIsValidRef(ref)) {
-        struct _FrameDecider_mac_entry *entry = ref.ptr;
-        
-        if (entry->peer == o) {
+    struct _FrameDecider_mac_entry *e_entry = FDMacsTree_LookupExact(&d->macs_tree, 0, mac);
+    if (e_entry) {
+        if (e_entry->peer == o) {
             // this is our MAC; only move it to the end of the used list
-            LinkedList2_Remove(&o->mac_entries_used, &entry->list_node);
-            LinkedList2_Append(&o->mac_entries_used, &entry->list_node);
+            LinkedList2_Remove(&o->mac_entries_used, &e_entry->list_node);
+            LinkedList2_Append(&o->mac_entries_used, &e_entry->list_node);
             return;
         }
         
         // some other peer has that MAC; disassociate it
-        FDMacsTree_Remove(&d->macs_tree, 0, FDMacsTreeDeref(0, entry));
-        LinkedList2_Remove(&entry->peer->mac_entries_used, &entry->list_node);
-        LinkedList2_Append(&entry->peer->mac_entries_free, &entry->list_node);
+        FDMacsTree_Remove(&d->macs_tree, 0, e_entry);
+        LinkedList2_Remove(&e_entry->peer->mac_entries_used, &e_entry->list_node);
+        LinkedList2_Append(&e_entry->peer->mac_entries_free, &e_entry->list_node);
     }
     
     // aquire MAC address entry, if there are no free ones reuse the oldest used one
@@ -104,7 +102,7 @@ static void add_mac_to_peer (FrameDeciderPeer *o, uint8_t *mac)
         ASSERT(entry->peer == o)
         
         // remove from used
-        FDMacsTree_Remove(&d->macs_tree, 0, FDMacsTreeDeref(0, entry));
+        FDMacsTree_Remove(&d->macs_tree, 0, entry);
         LinkedList2_Remove(&o->mac_entries_used, &entry->list_node);
     }
     
@@ -115,7 +113,7 @@ static void add_mac_to_peer (FrameDeciderPeer *o, uint8_t *mac)
     
     // add to used
     LinkedList2_Append(&o->mac_entries_used, &entry->list_node);
-    int res = FDMacsTree_Insert(&d->macs_tree, 0, FDMacsTreeDeref(0, entry), NULL);
+    int res = FDMacsTree_Insert(&d->macs_tree, 0, entry, NULL);
     ASSERT(res)
 }
 
@@ -499,9 +497,8 @@ out:;
     }
     
     // look for MAC entry
-    FDMacsTreeRef ref = FDMacsTree_LookupExact(&o->macs_tree, 0, eh->dest);
-    if (FDMacsTreeIsValidRef(ref)) {
-        struct _FrameDecider_mac_entry *entry = ref.ptr;
+    struct _FrameDecider_mac_entry *entry = FDMacsTree_LookupExact(&o->macs_tree, 0, eh->dest);
+    if (entry) {
         o->decide_state = DECIDE_STATE_UNICAST;
         o->decide_unicast_peer = entry->peer;
         return;
@@ -656,7 +653,7 @@ void FrameDeciderPeer_Free (FrameDeciderPeer *o)
         struct _FrameDecider_mac_entry *entry = UPPER_OBJECT(node, struct _FrameDecider_mac_entry, list_node);
         
         // remove from tree
-        FDMacsTree_Remove(&d->macs_tree, 0, FDMacsTreeDeref(0, entry));
+        FDMacsTree_Remove(&d->macs_tree, 0, entry);
     }
     
     // remove from peers list

+ 8 - 11
client/FrameDecider.h

@@ -40,21 +40,25 @@
 #include <structure/LinkedList2.h>
 #include <structure/LinkedList3.h>
 #include <structure/CAvl.h>
+#include <structure/SAvl.h>
 #include <base/DebugObject.h>
 #include <base/BLog.h>
 #include <system/BReactor.h>
 
 struct _FrameDeciderPeer;
+struct _FrameDecider_mac_entry;
+
+typedef const uint8_t *FDMacsTree_key;
+
+#include "FrameDecider_macs_tree.h"
+#include <structure/SAvl_decl.h>
 
 struct _FrameDecider_mac_entry {
     struct _FrameDeciderPeer *peer;
     LinkedList2Node list_node; // node in FrameDeciderPeer.mac_entries_free or FrameDeciderPeer.mac_entries_used
     // defined when used:
     uint8_t mac[6];
-    // node in FrameDecider.macs_tree, indexed by mac
-    struct _FrameDecider_mac_entry *tree_child[2];
-    struct _FrameDecider_mac_entry *tree_parent;
-    int8_t tree_balance;
+    FDMacsTreeNode tree_node; // node in FrameDecider.macs_tree, indexed by mac
 };
 
 struct _FrameDecider_group_entry {
@@ -82,13 +86,6 @@ struct _FrameDecider_group_entry {
     } master;
 };
 
-typedef struct _FrameDecider_mac_entry FDMacsTree_entry;
-typedef struct _FrameDecider_mac_entry *FDMacsTree_link;
-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;
 

+ 9 - 15
client/FrameDecider_macs_tree.h

@@ -1,15 +1,9 @@
-#define CAVL_PARAM_NAME FDMacsTree
-#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 FDMacsTree_entry
-#define CAVL_PARAM_TYPE_LINK FDMacsTree_link
-#define CAVL_PARAM_TYPE_KEY FDMacsTree_key
-#define CAVL_PARAM_TYPE_ARG int
-#define CAVL_PARAM_VALUE_NULL ((FDMacsTree_link)NULL)
-#define CAVL_PARAM_FUN_DEREF(arg, link) (link)
-#define CAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) compare_macs((entry1).ptr->mac, (entry2).ptr->mac)
-#define CAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) compare_macs((key1), (entry2).ptr->mac)
-#define CAVL_PARAM_MEMBER_CHILD tree_child
-#define CAVL_PARAM_MEMBER_BALANCE tree_balance
-#define CAVL_PARAM_MEMBER_PARENT tree_parent
+#define SAVL_PARAM_NAME FDMacsTree
+#define SAVL_PARAM_FEATURE_COUNTS 0
+#define SAVL_PARAM_FEATURE_NOKEYS 0
+#define SAVL_PARAM_TYPE_ENTRY struct _FrameDecider_mac_entry
+#define SAVL_PARAM_TYPE_KEY FDMacsTree_key
+#define SAVL_PARAM_TYPE_ARG int
+#define SAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) compare_macs((entry1)->mac, (entry2)->mac)
+#define SAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) compare_macs((key1), (entry2)->mac)
+#define SAVL_PARAM_MEMBER_NODE tree_node