Explorar el Código

client: FragmentProtoAssembler: port to CAvl

ambrop7 hace 13 años
padre
commit
289298e0ae

+ 10 - 17
client/FragmentProtoAssembler.c

@@ -40,23 +40,15 @@
 
 #define PeerLog(_o, ...) BLog_LogViaFunc((_o)->logfunc, (_o)->user, BLOG_CURRENT_CHANNEL, __VA_ARGS__)
 
-static int frame_id_comparator (void *unused, fragmentproto_frameid *v1, fragmentproto_frameid *v2)
-{
-    if (*v1 < *v2) {
-        return -1;
-    }
-    if (*v1 > *v2) {
-        return 1;
-    }
-    return 0;
-}
+#include "FragmentProtoAssembler_tree.h"
+#include <structure/CAvl_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
-    BAVL_Remove(&o->frames_used_tree, &frame->tree_node);
+    FPAFramesTree_Remove(&o->frames_used_tree, 0, FPAFramesTreeDeref(0, frame));
     
     // append to free list
     LinkedList2_Append(&o->frames_free, &frame->list_node);
@@ -77,7 +69,7 @@ static void free_oldest_frame (FragmentProtoAssembler *o)
 
 static struct FragmentProtoAssembler_frame * allocate_new_frame (FragmentProtoAssembler *o, fragmentproto_frameid id)
 {
-    ASSERT(!BAVL_LookupExact(&o->frames_used_tree, &id))
+    ASSERT(FPAFramesTreeIsNullRef(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)) {
@@ -104,7 +96,8 @@ static struct FragmentProtoAssembler_frame * allocate_new_frame (FragmentProtoAs
     // append to used list
     LinkedList2_Append(&o->frames_used, &frame->list_node);
     // insert to used tree
-    ASSERT_EXECUTE(BAVL_Insert(&o->frames_used_tree, &frame->tree_node, NULL))
+    int res = FPAFramesTree_Insert(&o->frames_used_tree, 0, FPAFramesTreeDeref(0, frame), NULL);
+    ASSERT(res)
     
     return frame;
 }
@@ -186,13 +179,13 @@ static int process_chunk (FragmentProtoAssembler *o, fragmentproto_frameid frame
     
     // lookup frame
     struct FragmentProtoAssembler_frame *frame;
-    BAVLNode *tree_node;
-    if (!(tree_node = BAVL_LookupExact(&o->frames_used_tree, &frame_id))) {
+    FPAFramesTreeRef ref = FPAFramesTree_LookupExact(&o->frames_used_tree, 0, frame_id);
+    if (FPAFramesTreeIsNullRef(ref)) {
         // frame not found, add a new one
         frame = allocate_new_frame(o, frame_id);
     } else {
         // have existing frame with that ID
-        frame = UPPER_OBJECT(tree_node, struct FragmentProtoAssembler_frame, tree_node);
+        frame = ref.ptr;
         // check frame time
         if (frame_is_timed_out(o, frame)) {
             // frame is timed out, remove it and use a new one
@@ -435,7 +428,7 @@ int FragmentProtoAssembler_Init (FragmentProtoAssembler *o, int input_mtu, Packe
     }
     
     // init tree
-    BAVL_Init(&o->frames_used_tree, OFFSET_DIFF(struct FragmentProtoAssembler_frame, id, tree_node), (BAVL_comparator)frame_id_comparator, NULL);
+    FPAFramesTree_Init(&o->frames_used_tree);
     
     // have no input packet
     o->in_len = -1;

+ 12 - 3
client/FragmentProtoAssembler.h

@@ -38,10 +38,11 @@
 
 #include <protocol/fragmentproto.h>
 #include <misc/debug.h>
+#include <misc/compare.h>
 #include <base/DebugObject.h>
 #include <base/BLog.h>
 #include <structure/LinkedList2.h>
-#include <structure/BAVL.h>
+#include <structure/CAvl.h>
 #include <flow/PacketPassInterface.h>
 
 #define FPA_MAX_TIME UINT32_MAX
@@ -58,13 +59,21 @@ 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
-    BAVLNode tree_node; // node in tree for searching frames by id
+    struct FragmentProtoAssembler_frame *tree_child[2]; // node fields in tree for searching frames by id
+    struct FragmentProtoAssembler_frame *tree_parent;
+    int8_t tree_balance;
     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.
  *
@@ -85,7 +94,7 @@ typedef struct {
     uint8_t *frames_buffer;
     LinkedList2 frames_free;
     LinkedList2 frames_used;
-    BAVL frames_used_tree;
+    FPAFramesTree frames_used_tree;
     int in_len;
     uint8_t *in;
     int in_pos;

+ 15 - 0
client/FragmentProtoAssembler_tree.h

@@ -0,0 +1,15 @@
+#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