summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSebastian Stumpf <sebastian.stumpf87@googlemail.com>2017-02-28 16:39:28 +0100
committerHarald Welte <laforge@gnumonks.org>2017-07-12 23:26:26 +0200
commita090f635b03780f651d54033c6f8c616fdd8f870 (patch)
tree88b27a07154848b584c884adbda897203f9dc747
parent30cc674df8bd93560bafbc0ae292835c2770f7d4 (diff)
VIRT-PHY: Scheduler - correct handling over hyperframe repeat.
Scheduler will no longer skip tasks that are scheduler for a framenumber greater than the current fn because of a hyperframe repetition. Change-Id: I683ba18b5dee308d58f9a95a0ee10e22da207eda
-rw-r--r--src/host/virt_phy/src/virt_l1_sched_simple.c18
1 files changed, 14 insertions, 4 deletions
diff --git a/src/host/virt_phy/src/virt_l1_sched_simple.c b/src/host/virt_phy/src/virt_l1_sched_simple.c
index fbb54238..d3975ee1 100644
--- a/src/host/virt_phy/src/virt_l1_sched_simple.c
+++ b/src/host/virt_phy/src/virt_l1_sched_simple.c
@@ -9,6 +9,8 @@ static struct l1_model_ms *l1_model_ms = NULL;
static LLIST_HEAD(mframe_item_list);
+static uint32_t last_exec_fn = 0;
+
/**
* @brief Initialize schedulers data structures.
*/
@@ -70,10 +72,16 @@ void virt_l1_sched_stop()
void virt_l1_sched_execute(uint32_t fn)
{
struct virt_l1_sched_mframe_item *mi_next, *mi_tmp;
- // FIXME: change of hyperframe and thus restarting fn at 0 may cause messages in the queue that are never handled
+ uint8_t hyperframe_restart = fn < last_exec_fn;
+
llist_for_each_entry_safe(mi_next, mi_tmp, &mframe_item_list, mframe_item_entry)
{
- if (mi_next->fn <= fn) {
+ /* execute all registered handler for current mf sched item */
+ uint8_t exec_now = mi_next->fn <= fn || (hyperframe_restart && mi_next->fn > last_exec_fn);
+ /* break loop, as we have an ordered list in case the hyperframe had not been reset */
+ uint8_t break_now = mi_next->fn > fn && !hyperframe_restart;
+
+ if(exec_now) {
struct virt_l1_sched_tdma_item *ti_next, *ti_tmp;
// run through all scheduled tdma sched items for that frame number
llist_for_each_entry_safe(ti_next, ti_tmp, &mi_next->tdma_item_list, tdma_item_entry)
@@ -87,11 +95,13 @@ void virt_l1_sched_execute(uint32_t fn)
// remove handled mframe sched item
llist_del(&mi_next->mframe_item_entry);
talloc_free(mi_next);
- } else if (mi_next->fn > fn) {
- /* break the loop as our list is ordered */
+ }
+
+ if(break_now) {
break;
}
}
+ last_exec_fn = fn;
}
/**