diff --git a/include/libnux/scheduling.hpp b/include/libnux/scheduling.hpp index 383e78ff045ce274119601248483d802b0f8eb5d..3abfa8219fba1fcfb5af94ef31679e5840c3f809 100644 --- a/include/libnux/scheduling.hpp +++ b/include/libnux/scheduling.hpp @@ -1,6 +1,5 @@ #pragma once #include "libnux/scheduling/Scheduler.hpp" -#include "libnux/scheduling/SchedulerSignaller.hpp" #include "libnux/scheduling/Service.hpp" #include "libnux/scheduling/Timer.hpp" diff --git a/include/libnux/scheduling/Scheduler.hpp b/include/libnux/scheduling/Scheduler.hpp index 1ae72ec9e52e7a306f93e7b4728abc7ef9698ab1..4782dc7caa8ec0dc5e1fa50b7c1ac67fb01cf1ec 100644 --- a/include/libnux/scheduling/Scheduler.hpp +++ b/include/libnux/scheduling/Scheduler.hpp @@ -24,13 +24,12 @@ public: /** * Scheduler loop. - * \tparam Signaller Scheduler loop control type * \tparam E Event source types - * \param signaller Scheduler loop control instance + * \param stop_time Time at which to stop execution * \param event_sources Tuple of references to event sources */ - template <typename Signaller, typename... E> - void execute(Signaller& signaller, std::tuple<E&...>& event_sources); + template <typename... E> + void execute(time_type stop_time, std::tuple<E&...>& event_sources); /** * Get maximal number of elements stored in queue since creation. @@ -178,20 +177,14 @@ inline __attribute__((always_inline)) void Scheduler<queue_size>::run_queue_serv } template <size_t queue_size> -template <typename Signaller, typename... E> -void Scheduler<queue_size>::execute(Signaller& signaller, std::tuple<E&...>& event_sources) +template <typename... E> +void Scheduler<queue_size>::execute(time_type const stop_time, std::tuple<E&...>& event_sources) { - scheduler_signal signal = signaller.signal(); - while (not(signal == scheduler_exit)) { - if (not(signal == scheduler_wait)) { - if ((signal == scheduler_run) or (signal == scheduler_finish)) { - if (not(signal == scheduler_finish)) { - fetch_events_timed(event_sources, get_time()); - } - sort_earliest_first(); - run_queue_service(); - } - } - signal = signaller.signal(); + time_type current_time = get_time(); + while (current_time < stop_time) { + fetch_events_timed(event_sources, current_time); + sort_earliest_first(); + run_queue_service(); + current_time = get_time(); } } diff --git a/include/libnux/scheduling/SchedulerSignaller.hpp b/include/libnux/scheduling/SchedulerSignaller.hpp deleted file mode 100644 index d13f839b6e8e39c38cb97f4eafdbed4a07ff4e65..0000000000000000000000000000000000000000 --- a/include/libnux/scheduling/SchedulerSignaller.hpp +++ /dev/null @@ -1,94 +0,0 @@ -#pragma once -//#include "libnux/vx/mailbox.h" -#include "libnux/scheduling/types.hpp" -#include "libnux/vx/spr.h" - -///** -// * Scheduler loop control that listens on a mailbox address for signals -// * \tparam signal_address Signal address in mailbox -// */ -// template <uint32_t signal_address> -// class SchedulerSignallerMailbox -//{ -// public: -// /** -// * Get current signal state. -// * \return Signal state -// */ -// inline __attribute__((always_inline)) scheduler_signal signal(); -//}; -// -// template <uint32_t signal_address> -// inline __attribute__((always_inline)) scheduler_signal -// SchedulerSignallerMailbox<signal_address>::signal() -//{ -// uint8_t signal = libnux_mailbox_read_u8(signal_address); -// switch (signal) { -// case scheduler_wait: -// return scheduler_wait; -// case scheduler_run: -// return scheduler_run; -// case scheduler_finish: -// return scheduler_finish; -// case scheduler_exit: -// return scheduler_exit; -// // if unknown signal is encountered, wait -// default: -// return scheduler_wait; -// } -// return scheduler_exit; // This should never be called -//} - -// scheduler signaller, that: -// waits until start, -// runs from start to finish, -// finishes from finish to stop -// and exits at stop. -class SchedulerSignallerTimer -{ - time_type m_start; - time_type m_finish; - time_type m_stop; - -public: - SchedulerSignallerTimer(time_type start, time_type finish, time_type stop); - SchedulerSignallerTimer(time_type start, time_type stop); - SchedulerSignallerTimer(time_type stop); - inline __attribute__((always_inline)) scheduler_signal signal(); -}; - -SchedulerSignallerTimer::SchedulerSignallerTimer(time_type start, time_type finish, time_type stop) -{ - this->m_start = start; - this->m_finish = finish; - this->m_stop = stop; -} - -SchedulerSignallerTimer::SchedulerSignallerTimer(time_type start, time_type stop) -{ - this->m_start = start; - this->m_finish = stop; - this->m_stop = stop; -} - -SchedulerSignallerTimer::SchedulerSignallerTimer(time_type stop) -{ - this->m_start = 0; - this->m_finish = stop; - this->m_stop = stop; -} - -inline __attribute__((always_inline)) scheduler_signal SchedulerSignallerTimer::signal() -{ - time_type t = get_time(); - if (t < this->m_start) { - return scheduler_wait; - } else if (t >= this->m_start and t < this->m_finish) { - return scheduler_run; - } else if (t >= this->m_finish and t < this->m_stop) { - return scheduler_finish; - } else if (t >= this->m_stop) { - return scheduler_exit; - } - return scheduler_exit; // This will never be called. -} diff --git a/include/libnux/scheduling/types.hpp b/include/libnux/scheduling/types.hpp index 80dd14aab6dcf81011a717c0309016912f31fa3c..a5cc9e9a9e8c6bfe7e9db9ffb9dc5a6fc5db9e5c 100644 --- a/include/libnux/scheduling/types.hpp +++ b/include/libnux/scheduling/types.hpp @@ -19,16 +19,3 @@ struct Event Service const* service; time_type deadline; }; - -// scheduler signals -enum scheduler_signal -{ - // don't do anything except staying alive - scheduler_wait = 0, - // run, i.e. fetch events and execute them - scheduler_run = 1, - // execute events in queue, but don't fetch new ones - scheduler_finish = 2, - // exit execution function - scheduler_exit = 3, -};