Răsfoiți Sursa

PacketPassPriorityQueue, PacketPassFairQueue: minor changes

ambrop7 15 ani în urmă
părinte
comite
104fb40944

+ 39 - 40
flow/PacketPassFairQueue.c

@@ -117,14 +117,13 @@ static void increment_sent_flow (PacketPassFairQueueFlow *flow, int iamount)
 
 static void schedule (PacketPassFairQueue *m)
 {
-    ASSERT(!m->freeing)
     ASSERT(!m->sending_flow)
     ASSERT(!m->previous_flow)
+    ASSERT(!m->freeing)
     ASSERT(BHeap_GetFirst(&m->queued_heap))
     
     // get first queued flow
-    BHeapNode *heap_node = BHeap_GetFirst(&m->queued_heap);
-    PacketPassFairQueueFlow *qflow = UPPER_OBJECT(heap_node, PacketPassFairQueueFlow, queued.heap_node);
+    PacketPassFairQueueFlow *qflow = UPPER_OBJECT(BHeap_GetFirst(&m->queued_heap), PacketPassFairQueueFlow, queued.heap_node);
     ASSERT(qflow->is_queued)
     
     // remove flow from queue
@@ -139,14 +138,13 @@ static void schedule (PacketPassFairQueue *m)
 
 static void schedule_job_handler (PacketPassFairQueue *m)
 {
-    ASSERT(!m->freeing)
     ASSERT(!m->sending_flow)
+    ASSERT(!m->freeing)
     DebugObject_Access(&m->d_obj);
     
     // remove previous flow
     m->previous_flow = NULL;
     
-    // schedule next
     if (BHeap_GetFirst(&m->queued_heap)) {
         schedule(m);
     }
@@ -154,13 +152,13 @@ static void schedule_job_handler (PacketPassFairQueue *m)
 
 static void input_handler_send (PacketPassFairQueueFlow *flow, uint8_t *data, int data_len)
 {
-    ASSERT(!flow->m->freeing)
-    ASSERT(flow != flow->m->sending_flow)
+    PacketPassFairQueue *m = flow->m;
+    
+    ASSERT(flow != m->sending_flow)
     ASSERT(!flow->is_queued)
+    ASSERT(!m->freeing)
     DebugObject_Access(&flow->d_obj);
     
-    PacketPassFairQueue *m = flow->m;
-    
     if (flow == m->previous_flow) {
         // remove from previous flow
         m->previous_flow = NULL;
@@ -182,11 +180,11 @@ static void input_handler_send (PacketPassFairQueueFlow *flow, uint8_t *data, in
 
 static void output_handler_done (PacketPassFairQueue *m)
 {
-    ASSERT(!m->freeing)
     ASSERT(m->sending_flow)
     ASSERT(!m->previous_flow)
-    ASSERT(!m->sending_flow->is_queued)
     ASSERT(!BPending_IsSet(&m->schedule_job))
+    ASSERT(!m->freeing)
+    ASSERT(!m->sending_flow->is_queued)
     
     PacketPassFairQueueFlow *flow = m->sending_flow;
     
@@ -219,14 +217,14 @@ static void output_handler_done (PacketPassFairQueue *m)
 
 void PacketPassFairQueue_Init (PacketPassFairQueue *m, PacketPassInterface *output, BPendingGroup *pg, int use_cancel)
 {
+    ASSERT(PacketPassInterface_GetMTU(output) <= FAIRQUEUE_MAX_TIME)
     ASSERT(use_cancel == 0 || use_cancel == 1)
-    if (use_cancel) {
-        ASSERT(PacketPassInterface_HasCancel(output))
-    }
+    ASSERT(!use_cancel || PacketPassInterface_HasCancel(output))
     
     // init arguments
     m->output = output;
     m->pg = pg;
+    m->use_cancel = use_cancel;
     
     // init output
     PacketPassInterface_Sender_Init(m->output, (PacketPassInterface_handler_done)output_handler_done, m);
@@ -246,14 +244,11 @@ void PacketPassFairQueue_Init (PacketPassFairQueue *m, PacketPassInterface *outp
     // not freeing
     m->freeing = 0;
     
-    // set if using cancel
-    m->use_cancel = use_cancel;
-    
     // init schedule job
     BPending_Init(&m->schedule_job, m->pg, (BPending_handler)schedule_job_handler, m);
     
-    DebugCounter_Init(&m->d_ctr);
     DebugObject_Init(&m->d_obj);
+    DebugCounter_Init(&m->d_ctr);
 }
 
 void PacketPassFairQueue_Free (PacketPassFairQueue *m)
@@ -273,6 +268,7 @@ void PacketPassFairQueue_PrepareFree (PacketPassFairQueue *m)
 {
     DebugObject_Access(&m->d_obj);
     
+    // set freeing
     m->freeing = 1;
 }
 
@@ -299,20 +295,18 @@ void PacketPassFairQueueFlow_Init (PacketPassFairQueueFlow *flow, PacketPassFair
     // is not queued
     flow->is_queued = 0;
     
-    DebugCounter_Increment(&m->d_ctr);
     DebugObject_Init(&flow->d_obj);
+    DebugCounter_Increment(&m->d_ctr);
 }
 
 void PacketPassFairQueueFlow_Free (PacketPassFairQueueFlow *flow)
 {
-    if (!flow->m->freeing) {
-        ASSERT(flow != flow->m->sending_flow)
-    }
-    DebugCounter_Decrement(&flow->m->d_ctr);
-    DebugObject_Free(&flow->d_obj);
-    
     PacketPassFairQueue *m = flow->m;
     
+    ASSERT(m->freeing || flow != m->sending_flow)
+    DebugCounter_Decrement(&m->d_ctr);
+    DebugObject_Free(&flow->d_obj);
+    
     // remove from current flow
     if (flow == m->sending_flow) {
         m->sending_flow = NULL;
@@ -337,46 +331,51 @@ void PacketPassFairQueueFlow_Free (PacketPassFairQueueFlow *flow)
 
 void PacketPassFairQueueFlow_AssertFree (PacketPassFairQueueFlow *flow)
 {
-    if (!flow->m->freeing) {
-        ASSERT(flow != flow->m->sending_flow)
-    }
+    PacketPassFairQueue *m = flow->m;
+    
+    ASSERT(m->freeing || flow != m->sending_flow)
     DebugObject_Access(&flow->d_obj);
 }
 
 int PacketPassFairQueueFlow_IsBusy (PacketPassFairQueueFlow *flow)
 {
-    ASSERT(!flow->m->freeing)
+    PacketPassFairQueue *m = flow->m;
+    
+    ASSERT(!m->freeing)
     DebugObject_Access(&flow->d_obj);
     
-    return (flow == flow->m->sending_flow);
+    return (flow == m->sending_flow);
 }
 
 void PacketPassFairQueueFlow_Release (PacketPassFairQueueFlow *flow)
 {
-    ASSERT(flow->m->use_cancel)
-    ASSERT(flow == flow->m->sending_flow)
-    ASSERT(!flow->m->freeing)
-    ASSERT(!BPending_IsSet(&flow->m->schedule_job))
-    DebugObject_Access(&flow->d_obj);
-    
     PacketPassFairQueue *m = flow->m;
     
-    // cancel current packet
-    PacketPassInterface_Sender_Cancel(m->output);
+    ASSERT(flow == m->sending_flow)
+    ASSERT(m->use_cancel)
+    ASSERT(!m->freeing)
+    ASSERT(!BPending_IsSet(&m->schedule_job))
+    DebugObject_Access(&flow->d_obj);
     
     // set no sending flow
     m->sending_flow = NULL;
     
     // schedule schedule
     BPending_Set(&m->schedule_job);
+    
+    // cancel current packet
+    PacketPassInterface_Sender_Cancel(m->output);
 }
 
 void PacketPassFairQueueFlow_SetBusyHandler (PacketPassFairQueueFlow *flow, PacketPassFairQueue_handler_busy handler, void *user)
 {
-    ASSERT(flow == flow->m->sending_flow)
-    ASSERT(!flow->m->freeing)
+    PacketPassFairQueue *m = flow->m;
+    
+    ASSERT(flow == m->sending_flow)
+    ASSERT(!m->freeing)
     DebugObject_Access(&flow->d_obj);
     
+    // set handler
     flow->handler_busy = handler;
     flow->user = user;
 }

+ 6 - 6
flow/PacketPassFairQueue.h

@@ -29,11 +29,11 @@
 
 #include <stdint.h>
 
-#include <system/DebugObject.h>
-#include <system/BPending.h>
 #include <misc/debugcounter.h>
 #include <structure/BHeap.h>
 #include <structure/LinkedList2.h>
+#include <system/DebugObject.h>
+#include <system/BPending.h>
 #include <flow/PacketPassInterface.h>
 
 typedef void (*PacketPassFairQueue_handler_busy) (void *user);
@@ -45,17 +45,17 @@ struct PacketPassFairQueueFlow_s;
  */
 typedef struct {
     PacketPassInterface *output;
+    BPendingGroup *pg;
+    int use_cancel;
     struct PacketPassFairQueueFlow_s *sending_flow;
     int sending_len;
     struct PacketPassFairQueueFlow_s *previous_flow;
     BHeap queued_heap;
     LinkedList2 flows_list;
     int freeing;
-    int use_cancel;
     BPending schedule_job;
-    BPendingGroup *pg;
-    DebugCounter d_ctr;
     DebugObject d_obj;
+    DebugCounter d_ctr;
 } PacketPassFairQueue;
 
 typedef struct PacketPassFairQueueFlow_s {
@@ -78,7 +78,7 @@ typedef struct PacketPassFairQueueFlow_s {
  * Initializes the queue.
  *
  * @param m the object
- * @param output output interface
+ * @param output output interface. Its MTU must be <=FAIRQUEUE_MAX_TIME.
  * @param pg pending group
  * @param use_cancel whether cancel functionality is required. Must be 0 or 1.
  *                   If 1, output must support cancel functionality.

+ 38 - 40
flow/PacketPassPriorityQueue.c

@@ -40,13 +40,12 @@ static int int_comparator (void *user, int *prio1, int *prio2)
 
 static void schedule (PacketPassPriorityQueue *m)
 {
-    ASSERT(!m->freeing)
     ASSERT(!m->sending_flow)
+    ASSERT(!m->freeing)
     ASSERT(BHeap_GetFirst(&m->queued_heap))
     
     // get first queued flow
-    BHeapNode *heap_node = BHeap_GetFirst(&m->queued_heap);
-    PacketPassPriorityQueueFlow *qflow = UPPER_OBJECT(heap_node, PacketPassPriorityQueueFlow, queued.heap_node);
+    PacketPassPriorityQueueFlow *qflow = UPPER_OBJECT(BHeap_GetFirst(&m->queued_heap), PacketPassPriorityQueueFlow, queued.heap_node);
     ASSERT(qflow->is_queued)
     
     // remove flow from queue
@@ -56,13 +55,12 @@ static void schedule (PacketPassPriorityQueue *m)
     // schedule send
     PacketPassInterface_Sender_Send(m->output, qflow->queued.data, qflow->queued.data_len);
     m->sending_flow = qflow;
-    m->sending_len = qflow->queued.data_len;
 }
 
 static void schedule_job_handler (PacketPassPriorityQueue *m)
 {
-    ASSERT(!m->freeing)
     ASSERT(!m->sending_flow)
+    ASSERT(!m->freeing)
     DebugObject_Access(&m->d_obj);
     
     if (BHeap_GetFirst(&m->queued_heap)) {
@@ -72,13 +70,13 @@ static void schedule_job_handler (PacketPassPriorityQueue *m)
 
 static void input_handler_send (PacketPassPriorityQueueFlow *flow, uint8_t *data, int data_len)
 {
-    ASSERT(!flow->m->freeing)
-    ASSERT(flow != flow->m->sending_flow)
+    PacketPassPriorityQueue *m = flow->m;
+    
+    ASSERT(flow != m->sending_flow)
     ASSERT(!flow->is_queued)
+    ASSERT(!m->freeing)
     DebugObject_Access(&flow->d_obj);
     
-    PacketPassPriorityQueue *m = flow->m;
-    
     // queue flow
     flow->queued.data = data;
     flow->queued.data_len = data_len;
@@ -92,10 +90,10 @@ static void input_handler_send (PacketPassPriorityQueueFlow *flow, uint8_t *data
 
 static void output_handler_done (PacketPassPriorityQueue *m)
 {
-    ASSERT(!m->freeing)
     ASSERT(m->sending_flow)
-    ASSERT(!m->sending_flow->is_queued)
     ASSERT(!BPending_IsSet(&m->schedule_job))
+    ASSERT(!m->freeing)
+    ASSERT(!m->sending_flow->is_queued)
     
     PacketPassPriorityQueueFlow *flow = m->sending_flow;
     
@@ -123,13 +121,12 @@ static void output_handler_done (PacketPassPriorityQueue *m)
 void PacketPassPriorityQueue_Init (PacketPassPriorityQueue *m, PacketPassInterface *output, BPendingGroup *pg, int use_cancel)
 {
     ASSERT(use_cancel == 0 || use_cancel == 1)
-    if (use_cancel) {
-        ASSERT(PacketPassInterface_HasCancel(output))
-    }
+    ASSERT(!use_cancel || PacketPassInterface_HasCancel(output))
     
     // init arguments
     m->output = output;
     m->pg = pg;
+    m->use_cancel = use_cancel;
     
     // init output
     PacketPassInterface_Sender_Init(m->output, (PacketPassInterface_handler_done)output_handler_done, m);
@@ -143,14 +140,11 @@ void PacketPassPriorityQueue_Init (PacketPassPriorityQueue *m, PacketPassInterfa
     // not freeing
     m->freeing = 0;
     
-    // set if using cancel
-    m->use_cancel = use_cancel;
-    
     // init schedule job
     BPending_Init(&m->schedule_job, m->pg, (BPending_handler)schedule_job_handler, m);
     
-    DebugCounter_Init(&m->d_ctr);
     DebugObject_Init(&m->d_obj);
+    DebugCounter_Init(&m->d_ctr);
 }
 
 void PacketPassPriorityQueue_Free (PacketPassPriorityQueue *m)
@@ -168,6 +162,7 @@ void PacketPassPriorityQueue_PrepareFree (PacketPassPriorityQueue *m)
 {
     DebugObject_Access(&m->d_obj);
     
+    // set freeing
     m->freeing = 1;
 }
 
@@ -189,20 +184,18 @@ void PacketPassPriorityQueueFlow_Init (PacketPassPriorityQueueFlow *flow, Packet
     // is not queued
     flow->is_queued = 0;
     
-    DebugCounter_Increment(&m->d_ctr);
     DebugObject_Init(&flow->d_obj);
+    DebugCounter_Increment(&m->d_ctr);
 }
 
 void PacketPassPriorityQueueFlow_Free (PacketPassPriorityQueueFlow *flow)
 {
-    if (!flow->m->freeing) {
-        ASSERT(flow != flow->m->sending_flow)
-    }
-    DebugCounter_Decrement(&flow->m->d_ctr);
-    DebugObject_Free(&flow->d_obj);
-    
     PacketPassPriorityQueue *m = flow->m;
     
+    ASSERT(m->freeing || flow != m->sending_flow)
+    DebugCounter_Decrement(&m->d_ctr);
+    DebugObject_Free(&flow->d_obj);
+    
     // remove from current flow
     if (flow == m->sending_flow) {
         m->sending_flow = NULL;
@@ -219,46 +212,51 @@ void PacketPassPriorityQueueFlow_Free (PacketPassPriorityQueueFlow *flow)
 
 void PacketPassPriorityQueueFlow_AssertFree (PacketPassPriorityQueueFlow *flow)
 {
-    if (!flow->m->freeing) {
-        ASSERT(flow != flow->m->sending_flow)
-    }
+    PacketPassPriorityQueue *m = flow->m;
+    
+    ASSERT(m->freeing || flow != m->sending_flow)
     DebugObject_Access(&flow->d_obj);
 }
 
 int PacketPassPriorityQueueFlow_IsBusy (PacketPassPriorityQueueFlow *flow)
 {
-    ASSERT(!flow->m->freeing)
+    PacketPassPriorityQueue *m = flow->m;
+    
+    ASSERT(!m->freeing)
     DebugObject_Access(&flow->d_obj);
     
-    return (flow == flow->m->sending_flow);
+    return (flow == m->sending_flow);
 }
 
 void PacketPassPriorityQueueFlow_Release (PacketPassPriorityQueueFlow *flow)
 {
-    ASSERT(flow->m->use_cancel)
-    ASSERT(flow == flow->m->sending_flow)
-    ASSERT(!flow->m->freeing)
-    ASSERT(!BPending_IsSet(&flow->m->schedule_job))
-    DebugObject_Access(&flow->d_obj);
-    
     PacketPassPriorityQueue *m = flow->m;
     
-    // cancel current packet
-    PacketPassInterface_Sender_Cancel(m->output);
+    ASSERT(flow == m->sending_flow)
+    ASSERT(m->use_cancel)
+    ASSERT(!m->freeing)
+    ASSERT(!BPending_IsSet(&m->schedule_job))
+    DebugObject_Access(&flow->d_obj);
     
     // set no sending flow
     m->sending_flow = NULL;
     
     // schedule schedule
     BPending_Set(&m->schedule_job);
+    
+    // cancel current packet
+    PacketPassInterface_Sender_Cancel(m->output);
 }
 
 void PacketPassPriorityQueueFlow_SetBusyHandler (PacketPassPriorityQueueFlow *flow, PacketPassPriorityQueue_handler_busy handler, void *user)
 {
-    ASSERT(flow == flow->m->sending_flow)
-    ASSERT(!flow->m->freeing)
+    PacketPassPriorityQueue *m = flow->m;
+    
+    ASSERT(flow == m->sending_flow)
+    ASSERT(!m->freeing)
     DebugObject_Access(&flow->d_obj);
     
+    // set handler
     flow->handler_busy = handler;
     flow->user = user;
 }

+ 6 - 7
flow/PacketPassPriorityQueue.h

@@ -29,10 +29,10 @@
 
 #include <stdint.h>
 
-#include <system/DebugObject.h>
-#include <system/BPending.h>
 #include <misc/debugcounter.h>
 #include <structure/BHeap.h>
+#include <system/DebugObject.h>
+#include <system/BPending.h>
 #include <flow/PacketPassInterface.h>
 
 typedef void (*PacketPassPriorityQueue_handler_busy) (void *user);
@@ -44,23 +44,22 @@ struct PacketPassPriorityQueueFlow_s;
  */
 typedef struct {
     PacketPassInterface *output;
+    BPendingGroup *pg;
+    int use_cancel;
     struct PacketPassPriorityQueueFlow_s *sending_flow;
-    int sending_len;
     BHeap queued_heap;
     int freeing;
-    int use_cancel;
     BPending schedule_job;
-    BPendingGroup *pg;
-    DebugCounter d_ctr;
     DebugObject d_obj;
+    DebugCounter d_ctr;
 } PacketPassPriorityQueue;
 
 typedef struct PacketPassPriorityQueueFlow_s {
     PacketPassPriorityQueue *m;
+    int priority;
     PacketPassPriorityQueue_handler_busy handler_busy;
     void *user;
     PacketPassInterface input;
-    int priority;
     int is_queued;
     struct {
         BHeapNode heap_node;