Procházet zdrojové kódy

client: FragmentProtoAssembler: port to SAvl

ambrop7 před 13 roky
rodič
revize
97fb01b514

+ 6 - 8
client/FragmentProtoAssembler.c

@@ -41,14 +41,14 @@
 #define PeerLog(_o, ...) BLog_LogViaFunc((_o)->logfunc, (_o)->user, BLOG_CURRENT_CHANNEL, __VA_ARGS__)
 
 #include "FragmentProtoAssembler_tree.h"
-#include <structure/CAvl_impl.h>
+#include <structure/SAvl_impl.h>
 
 static void free_frame (FragmentProtoAssembler *o, struct FragmentProtoAssembler_frame *frame)
 {
     // remove from used list
     LinkedList2_Remove(&o->frames_used, &frame->list_node);
     // remove from used tree
-    FPAFramesTree_Remove(&o->frames_used_tree, 0, FPAFramesTreeDeref(0, frame));
+    FPAFramesTree_Remove(&o->frames_used_tree, 0, frame);
     
     // append to free list
     LinkedList2_Append(&o->frames_free, &frame->list_node);
@@ -69,7 +69,7 @@ static void free_oldest_frame (FragmentProtoAssembler *o)
 
 static struct FragmentProtoAssembler_frame * allocate_new_frame (FragmentProtoAssembler *o, fragmentproto_frameid id)
 {
-    ASSERT(FPAFramesTreeIsNullRef(FPAFramesTree_LookupExact(&o->frames_used_tree, 0, id)))
+    ASSERT(!FPAFramesTree_LookupExact(&o->frames_used_tree, 0, id))
     
     // if there are no free entries, free the oldest used one
     if (LinkedList2_IsEmpty(&o->frames_free)) {
@@ -96,7 +96,7 @@ static struct FragmentProtoAssembler_frame * allocate_new_frame (FragmentProtoAs
     // append to used list
     LinkedList2_Append(&o->frames_used, &frame->list_node);
     // insert to used tree
-    int res = FPAFramesTree_Insert(&o->frames_used_tree, 0, FPAFramesTreeDeref(0, frame), NULL);
+    int res = FPAFramesTree_Insert(&o->frames_used_tree, 0, frame, NULL);
     ASSERT(res)
     
     return frame;
@@ -178,14 +178,12 @@ static int process_chunk (FragmentProtoAssembler *o, fragmentproto_frameid frame
     ASSERT(chunk_end <= o->output_mtu)
     
     // lookup frame
-    struct FragmentProtoAssembler_frame *frame;
-    FPAFramesTreeRef ref = FPAFramesTree_LookupExact(&o->frames_used_tree, 0, frame_id);
-    if (FPAFramesTreeIsNullRef(ref)) {
+    struct FragmentProtoAssembler_frame *frame = FPAFramesTree_LookupExact(&o->frames_used_tree, 0, frame_id);
+    if (!frame) {
         // frame not found, add a new one
         frame = allocate_new_frame(o, frame_id);
     } else {
         // have existing frame with that ID
-        frame = ref.ptr;
         // check frame time
         if (frame_is_timed_out(o, frame)) {
             // frame is timed out, remove it and use a new one

+ 7 - 10
client/FragmentProtoAssembler.h

@@ -42,11 +42,16 @@
 #include <base/DebugObject.h>
 #include <base/BLog.h>
 #include <structure/LinkedList2.h>
-#include <structure/CAvl.h>
+#include <structure/SAvl.h>
 #include <flow/PacketPassInterface.h>
 
 #define FPA_MAX_TIME UINT32_MAX
 
+struct FragmentProtoAssembler_frame;
+
+#include "FragmentProtoAssembler_tree.h"
+#include <structure/SAvl_decl.h>
+
 struct FragmentProtoAssembler_chunk {
     int start;
     int len;
@@ -59,21 +64,13 @@ struct FragmentProtoAssembler_frame {
     // everything below only defined when frame entry is used
     fragmentproto_frameid id; // frame identifier
     uint32_t time; // packet time when the last chunk was received
-    struct FragmentProtoAssembler_frame *tree_child[2]; // node fields in tree for searching frames by id
-    struct FragmentProtoAssembler_frame *tree_parent;
-    int8_t tree_balance;
+    FPAFramesTreeNode tree_node; // node fields in tree for searching frames by id
     int num_chunks; // number of valid chunks
     int sum; // sum of all chunks' lengths
     int length; // length of the frame, or -1 if not yet known
     int length_so_far; // if length=-1, current data set's upper bound
 };
 
-typedef struct FragmentProtoAssembler_frame FPAFramesTree_entry;
-typedef struct FragmentProtoAssembler_frame *FPAFramesTree_link;
-
-#include "FragmentProtoAssembler_tree.h"
-#include <structure/CAvl_decl.h>
-
 /**
  * Object which decodes packets according to FragmentProto.
  *

+ 9 - 15
client/FragmentProtoAssembler_tree.h

@@ -1,15 +1,9 @@
-#define CAVL_PARAM_NAME FPAFramesTree
-#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 FPAFramesTree_entry
-#define CAVL_PARAM_TYPE_LINK FPAFramesTree_link
-#define CAVL_PARAM_TYPE_KEY fragmentproto_frameid
-#define CAVL_PARAM_TYPE_ARG int
-#define CAVL_PARAM_VALUE_NULL ((FPAFramesTree_link)NULL)
-#define CAVL_PARAM_FUN_DEREF(arg, link) (link)
-#define CAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) B_COMPARE((entry1).ptr->id, (entry2).ptr->id)
-#define CAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) B_COMPARE((key1), (entry2).ptr->id)
-#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 FPAFramesTree
+#define SAVL_PARAM_FEATURE_COUNTS 0
+#define SAVL_PARAM_FEATURE_NOKEYS 0
+#define SAVL_PARAM_TYPE_ENTRY struct FragmentProtoAssembler_frame
+#define SAVL_PARAM_TYPE_KEY fragmentproto_frameid
+#define SAVL_PARAM_TYPE_ARG int
+#define SAVL_PARAM_FUN_COMPARE_ENTRIES(arg, entry1, entry2) B_COMPARE((entry1)->id, (entry2)->id)
+#define SAVL_PARAM_FUN_COMPARE_KEY_ENTRY(arg, key1, entry2) B_COMPARE((key1), (entry2)->id)
+#define SAVL_PARAM_MEMBER_NODE tree_node