The \gls{C}-backend of the \gls{mTask}-system has an engine that is generated
alongside the code for the \glspl{Task}. This engine will execute the
\gls{mTask}-\glspl{Task} according to certain rules and semantics.
\gls{mTask}-\glspl{Task} do not behave like functions but more like
\gls{iTasks}-\glspl{Task}. An \gls{mTask} is queued when either its timer runs
out or when it is launched by another \gls{mTask}. When an \gls{mTask} is
queued it does not block the execution and it will return immediately while the
actual \gls{Task} will be executed anytime in the future.

The \gls{iTasks}-backend simulates the \gls{C}-backend and thus uses the same
semantics. This engine expressed in pseudocode is listed as
Algorithm~\ref{lst:engine}. All the \glspl{Task} are inspected on their waiting
time. When the waiting time has not passed; the delta is subtracted and the
\gls{Task} gets pushed to the end of the queue. When the waiting has surpassed
they are executed. When an \gls{mTask} opts to queue another \gls{mTask} it
can just append it to the queue.

\vspace{1em}
\begin{algorithm}[H]
	\KwData{\textbf{queue} queue, \textbf{time} $t, t_p$}

	$t\leftarrow\text{now}()$\;
	\Begin{
		\While{true}{
			$t_p\leftarrow t$\;
			$t\leftarrow\text{now}()$\;
			\If{notEmpty$($queue$)$}{
				$task\leftarrow \text{queue.pop}()$\;
				$task$.wait $\leftarrow task$.wait $-(t-t_p)$\;
				\eIf{$task.wait>t_0$}{
					queue.append$(task)$\;
				}{
					run\_task$(task)$\;
				}
			}
		}
	}
	\caption{Engine pseudocode for the \gls{C}- and
		\gls{iTasks}-view}\label{lst:engine}
\end{algorithm}
\vspace{1em}

To achieve this in the \gls{EDSL} a \gls{Task} class is added that work in a
similar fashion as the \texttt{sds} class. This class is listed in
Listing~\ref{lst:taskclass}. \glspl{Task} can have an argument and always have
to specify a delay or waiting time. The type signature of the \CI{mtask} is
complex and therefore an example is given. The aforementioned Listing
shows a simple specification containing one \gls{Task} that increments a value
indefinitely every one seconds.

\begin{lstlisting}[label={lst:taskclass},%
	caption={The classes for defining \glspl{Task}}]
class mtask v a where
  task :: (((v delay r) a->v MTask Expr)->In (a->v u p) (Main (v t q))) -> Main (v t q) | ...

count = task \count = (\n.count (lit 1000) (n +. One)) In {main = count (lit 1000) Zero}
\end{lstlisting}
