diff options
author | Sebastian Stumpf <sebastian.stumpf87@googlemail.com> | 2017-02-28 16:39:28 +0100 |
---|---|---|
committer | Harald Welte <laforge@gnumonks.org> | 2017-07-12 23:26:26 +0200 |
commit | a090f635b03780f651d54033c6f8c616fdd8f870 (patch) | |
tree | 88b27a07154848b584c884adbda897203f9dc747 /src/host/virt_phy | |
parent | 30cc674df8bd93560bafbc0ae292835c2770f7d4 (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
Diffstat (limited to 'src/host/virt_phy')
-rw-r--r-- | src/host/virt_phy/src/virt_l1_sched_simple.c | 18 |
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; } /** |