From 0ed890033370ae853014f0d34065d9f566e86e54 Mon Sep 17 00:00:00 2001 From: Josh Blum Date: Sun, 9 Sep 2012 19:41:29 -0700 Subject: simplify forecast and its fail logic --- lib/block_handlers.cpp | 2 ++ lib/block_task.cpp | 28 +++++++++++----------------- lib/element_impl.hpp | 2 ++ 3 files changed, 15 insertions(+), 17 deletions(-) (limited to 'lib') diff --git a/lib/block_handlers.cpp b/lib/block_handlers.cpp index 73dc20a..d63c1a9 100644 --- a/lib/block_handlers.cpp +++ b/lib/block_handlers.cpp @@ -134,6 +134,7 @@ void ElementImpl::topology_update(const tsbe::TaskInterface &task_iface) this->work_input_items.resize(num_inputs); this->work_output_items.resize(num_outputs); this->work_ninput_items.resize(num_inputs); + this->fcast_ninput_items.resize(num_inputs); this->input_items.resize(num_inputs); this->output_items.resize(num_outputs); this->consume_items.resize(num_inputs, 0); @@ -141,6 +142,7 @@ void ElementImpl::topology_update(const tsbe::TaskInterface &task_iface) this->input_queues.resize(num_inputs); this->output_queues.resize(num_outputs); this->output_bytes_offset.resize(num_outputs, 0); + this->forecast_enable = not this->enable_fixed_rate; this->input_tokens.resize(num_inputs); this->output_tokens.resize(num_outputs); diff --git a/lib/block_task.cpp b/lib/block_task.cpp index 5b3ae00..b9347e8 100644 --- a/lib/block_task.cpp +++ b/lib/block_task.cpp @@ -157,26 +157,20 @@ void ElementImpl::handle_task(const tsbe::TaskInterface &task_iface) //-- forecast //------------------------------------------------------------------ forecast_again_you_jerk: - if (not this->enable_fixed_rate) + if (this->forecast_enable) { - block_ptr->forecast(num_output_items, work_ninput_items); + fcast_ninput_items = work_ninput_items; + block_ptr->forecast(num_output_items, fcast_ninput_items); for (size_t i = 0; i < num_inputs; i++) { - if (size_t(work_ninput_items[i]) > this->input_items[i].size()) - { - for (size_t j = 0; j < num_inputs; j++) - { - work_ninput_items[j] = this->input_items[j]._len; - } - num_output_items = num_output_items/2; - if (num_output_items == 0) - { - this->forecast_fail = true; - this->conclusion(task_iface, inputs_done); - return; - } - goto forecast_again_you_jerk; - } + if (fcast_ninput_items[i] <= work_ninput_items[i]) continue; + + num_output_items = num_output_items/2; //backoff regime + if (num_output_items) goto forecast_again_you_jerk; + + this->forecast_fail = true; + this->conclusion(task_iface, inputs_done); + return; } } this->forecast_fail = false; diff --git a/lib/element_impl.hpp b/lib/element_impl.hpp index cf7f164..6a9c088 100644 --- a/lib/element_impl.hpp +++ b/lib/element_impl.hpp @@ -64,6 +64,7 @@ struct ElementImpl std::vector work_input_items; std::vector work_output_items; std::vector work_ninput_items; + std::vector fcast_ninput_items; //work buffers for the new work interface Block::InputItems input_items; @@ -130,6 +131,7 @@ struct ElementImpl bool enable_fixed_rate; double relative_rate; bool forecast_fail; + bool forecast_enable; }; } //namespace gnuradio -- cgit