\documentclass{article}

\usepackage{rtsched}
\usepackage{url}

\title{The \texttt{rtsched} package for \LaTeX \\ (version 2.0)}
\author{Giuseppe Lipari}

\begin{document}

\maketitle

\listoffigures

\section{Introduction}

In this document, I give an overview of the \texttt{rtsched} \LaTeX
package, which can be used to easily draw chronograms (GANTT charts).
These diagrams are quite common in real-time scheduling research.

The package depends on keyval and TikZ/PGF (pgf version 2.10 or greater), both widely
available on any \TeX distribution.

The drawing capabilities are completely based on TikZ. Thus, you can compile
 a document that uses \texttt{rtsched} package with modern tools producing pdf document
as \texttt{pdfLaTeX}, \texttt{XeLaTeX} or \texttt{LuaLaTeX}.

As said, the style works also with Beamer, and it is also possible to
use animations.

You can find more examples of usage of this style in my lectures,
which can be downloaded at the following address:
\url{http://retis.sssup.it/~lipari/courses/}.

I prefer to demonstrate the capabilities of the package by a set of
examples. You can just cut and paste the examples and play with them
as you wish.

\section{Basic commands}

\subsection{Simple example with two tasks}

In Figure \ref{fig:ex1} I show a simple example of the Rate Monotonic
schedule of two simple tasks, followed by the code that generated it.
To draw the grid, with the numbers, you have to use the
\texttt{RTGrid} environment:
\begin{verbatim}
\begin{RTGrid}[options]{n}{t}
...
\end{RTGrid}
\end{verbatim}
\noindent where \texttt{n} is the number of horizontal axis (one per
task, in this case), and \texttt{t} is the length of the axis in time
units. This also draws the task labels on the left, and the numbering
on the bottom.

Every job arrival is depicted with an upward arrow; a deadline is
depicted by a downward arrow (not very visible here, since it concides
with the next arrival, see Figure \ref{fig:ex1c} for deadlines
different from periods). The task execution is depicted by a gray box.

The arrival of a job and the corresponding deadline can be obtained by
using the following commands:
\begin{verbatim}
\TaskArrival{i}{t}
\TaskArrDeadl{i}{t}{reld}
\end{verbatim}
\noindent where \texttt{i} is the task index (from 1 to \texttt{n}
included), \texttt{t} is the arrival time, and \texttt{reld} is the
relative deadline; an absolute deadline will be drawn at \texttt{t +
  reld}. If you only want to draw absolute deadlines, you can simply use the following command:
\begin{verbatim}
\TaskDeadline{i}{t}
\end{verbatim}
\noindent that works in the same way as \verb+\TaskArrival{i}{t}+.


In this example there are a lot of repetitions. These can be avoided
if you use the periodic versions of some commands, as shown in the example of
Figure \ref{fig:ex1a}. Available periodic versions of the commands can be found in Table~\ref{tab:periodic_versions}. The periodic versions take two additional arguments corresponding to the period and to the number of instances desired.

\begin{table}[!htbp]
\begin{tabular}{|l|l|}
 \hline
  Command & Periodic version  \\
 \hline
 \verb+\TaskArrival{i}{t}+ & \verb+\TaskNArrival{i}{t}{p}{n}+ \\
 \verb+\TaskDeadline{i}{t}+ & \verb+\TaskNDeadline{i}{t}{p}{n}+ \\
 \verb+\TaskArrDeadl{i}{t}{reld}+ & \verb+\TaskNArrDeadl{i}{t}{reld}{p}{n}+  \\
 \verb+\TaskExecDelta{i}{t}{delta}+ & \verb+\TaskNExecDelta{i}{t}{delta}{p}{n}+\\
 \verb+\TaskEnd{i}{t}+ & \verb+\TaskNEnd{i}{t}{p}{n}+\\

  \hline
\end{tabular}
\caption{Table of periodic commands where p stands for the period and n for the number of instances}
\label{tab:periodic_versions}
\end{table}



To draw the execution rectangle, you can use the following command:
\begin{verbatim}
\TaskExecution{i}{t1}{t2}
\TaskExecDelta{i}{t}{delta}
\end{verbatim}
The first one is used to draw an execution rectangle of height 1-unit
for the \texttt{i}-th task from \texttt{t1} to \texttt{t2}. The second
command draws a rectangle from \texttt{t} to \texttt{t+delta}.

In Figure \ref{fig:ex1b}, you can see how to only draw arrival upward
arrows, and how to specify offsets. Finally, in Figure \ref{fig:ex1c}
you can see an example with 2 tasks with relative deadlines different
from periods (the so-called \emph{constrained deadline tasks}).

\begin{figure}[!htbp]
  \centering
  % 2 tasks, for 20 units of time
  % we specify the width (10cm is the default
  % value, so we will stop specifying it from now on)
  \begin{RTGrid}[width=10cm]{2}{20}
    %% the first job of task 1 arrives at time 0, 
    %% with a relative deadline of 4 
    \TaskArrDead{1}{0}{4}     
    %% the second job arrives at time 4
    \TaskArrDead{1}{4}{4}
    %% etc
    \TaskArrDead{1}{8}{4}
    \TaskArrDead{1}{12}{4}
    \TaskArrDead{1}{16}{4}

    %% the task executes in intervals [0,1], [4,5], etc.
    \TaskExecution{1}{0}{1}
    \TaskExecution{1}{4}{5}
    \TaskExecution{1}{8}{9}
    \TaskExecution{1}{12}{13}
    \TaskExecution{1}{16}{17}

    %% the second task
    \TaskArrDead{2}{0}{4}
    \TaskArrDead{2}{6}{4}
    \TaskArrDead{2}{12}{4}
    \TaskExecution{2}{1}{4}
    \TaskExecution{2}{6}{8}
    \TaskExecution{2}{9}{10}
    \TaskExecution{2}{13}{16}
  \end{RTGrid}
\begin{verbatim}
  % 2 tasks, for 20 units of time
  % we specify the width (10cm is the default
  % value, so we will stop specifying it from now on)
  \begin{RTGrid}[width=10cm]{2}{20}
    %% the first job of task 1 arrives at time 0, 
    %% with a relative deadline of 4 
    \TaskArrDead{1}{0}{4}     
    %% the second job arrives at time 4
    \TaskArrDead{1}{4}{4}
    %% etc
    \TaskArrDead{1}{8}{4}
    \TaskArrDead{1}{12}{4}
    \TaskArrDead{1}{16}{4}

    %% the task executes in intervals [0,1], [4,5], etc.
    \TaskExecution{1}{0}{1}
    \TaskExecution{1}{4}{5}
    \TaskExecution{1}{8}{9}
    \TaskExecution{1}{12}{13}
    \TaskExecution{1}{16}{17}

    %% the second task
    \TaskArrDead{2}{0}{4}
    \TaskArrDead{2}{6}{4}
    \TaskArrDead{2}{12}{4}
    \TaskExecution{2}{1}{4}
    \TaskExecution{2}{6}{8}
    \TaskExecution{2}{9}{10}
    \TaskExecution{2}{13}{16}
  \end{RTGrid}
\end{verbatim}
  \caption{Two tasks, with deadline equal to period, RM scheduling}
  \label{fig:ex1}
\end{figure}

\begin{figure}[!htbp]
  \centering
  \begin{RTGrid}{2}{20}
                                   
    \TaskNArrDead{1}{0}{4}{4}{5}    % draws the arrivals and deadlines
    \TaskNExecDelta{1}{0}{1}{4}{5}  % draws executions (highest priority) 
                                    % for 5 instances of period 4 
                                    
    \TaskNEnd{1}{1}{4}{5}	       % draws 5 end of job execution of period 4


                                    % draws the arrival and deadline
    \TaskNArrDead{2}{0}{6}{6}{3}    % for 3 instances of period 6 
    
    % no simple formula for lowest priority, sorry!
    \TaskExecution{2}{1}{4}
    \TaskExecution{2}{6}{8}
    \TaskExecution{2}{9}{10}
    \TaskExecution{2}{13}{16} 
    \TaskEnd{2}{4}
    \TaskEnd{2}{10}
    \TaskEnd{2}{16}   
  \end{RTGrid}

\begin{verbatim}
  \begin{RTGrid}{2}{20}
                                   
    \TaskNArrDead{1}{0}{4}{4}{5}    % draws the arrivals and deadlines
    \TaskNExecDelta{1}{0}{1}{4}{5}  % draws executions (highest priority) 
                                    % for 5 instances of period 4 
                                    
    \TaskNEnd{1}{1}{4}{5}           % draws 5 end of job execution of period 4

   	\TaskNArrDead{2}{0}{6}{6}{3}    % draws the arrival and deadline
                                    % for 3 instances of period 6 
	    
    
    % no simple formula for lowest priority, sorry!
    \TaskExecution{2}{1}{4}
    \TaskExecution{2}{6}{8}
    \TaskExecution{2}{9}{10}
    \TaskExecution{2}{13}{16} 
    \TaskEnd{2}{4}
    \TaskEnd{2}{10}
    \TaskEnd{2}{16}  
  \end{RTGrid}
\end{verbatim}
  \caption{Using periodic commands to avoid repetitions}
  \label{fig:ex1a}
\end{figure}

\begin{figure}[!htbp]
  \centering
  \begin{RTGrid}{3}{14}
                                      
    \TaskNArrival{1}{0}{3}{4}        % draws only the arrivals 
    \TaskNExecDelta{1}{0}{1}{3}{4}   % draws executions (highest priority)
                                     % for 4 instances of period 3 
                               
 
                                   
    \TaskNArrival{2}{3}{4}{3}        % draws only the arrivals
                                     % 3 instances of period 4, starting from 3 
    \TaskExecDelta{2}{4}{1}
    \TaskExecDelta{2}{7}{1}
    \TaskExecDelta{2}{11}{1}

                                     % 3 instances of period 5, starting from 1 
    \TaskNArrival{3}{1}{5}{3}        % draws only the arrivals

    \TaskExecDelta{3}{1}{1}
    \TaskExecDelta{3}{8}{1}
    \TaskExecDelta{3}{12}{1}
  \end{RTGrid}

\begin{verbatim}
  \begin{RTGrid}{3}{14}
                                      
    \TaskNArrival{1}{0}{3}{4}        % draws only the arrivals 
    \TaskNExecDelta{1}{0}{1}{3}{4}   % draws executions (highest priority)
                                     % for 4 instances of period 3 
                               
 
                                   
    \TaskNArrival{2}{3}{4}{3}        % draws only the arrivals
                                     % 3 instances of period 4, starting from 3 
    \TaskExecDelta{2}{4}{1}
    \TaskExecDelta{2}{7}{1}
    \TaskExecDelta{2}{11}{1}

                                     % 3 instances of period 5, starting from 1 
    \TaskNArrival{3}{1}{5}{3}        % draws only the arrivals

    \TaskExecDelta{3}{1}{1}
    \TaskExecDelta{3}{8}{1}
    \TaskExecDelta{3}{12}{1}
  \end{RTGrid}
\end{verbatim}
  \caption{Three tasks with offsets, and only arrivals with no deadlines}
  \label{fig:ex1b}
\end{figure}

\begin{figure}[!htbp]
  \centering
  \begin{RTGrid}[width=8cm]{2}{15}
   \TaskNArrDead{1}{0}{3}{6}{3}
   \TaskNArrDead{2}{2}{5}{8}{2}
  \end{RTGrid}
\begin{verbatim}
  \begin{RTGrid}[width=8cm]{2}{15}
   \TaskNArrDead{1}{0}{3}{6}{3}
   \TaskNArrDead{2}{2}{5}{8}{2}
  \end{RTGrid}
\end{verbatim}
  \caption{Deadlines less than periods}
  \label{fig:ex1c}
\end{figure}

It is also possible to visualise preempted tasks with a hatched fill
style. An example is in Figure~\ref{fig:resp-time} that uses command
\texttt{TaskRespTime}. 

\begin{figure}[!htbp]
  \centering
  \begin{RTGrid}{2}{20}
  
    \TaskNArrDead{1}{0}{4}{4}{5}    % draws the arrivals and deadlines
    \TaskNExecDelta{1}{0}{1}{4}{5}  % draws executions (highest priority) 
                                   % for 5 instances of period 4 

 
    \TaskNArrDead{2}{0}{6}{6}{3}   % draws the arrivals and deadlines
                                   % for 3 instances of period 6 

    \TaskRespTime{2}{0}{4}         % draws the hatched rectangle in [0,4]
    \TaskExecution{2}{1}{4}        % draws execution (over the previous rectangle)
    \TaskRespTime{2}{6}{4}         % draws the hatched rectangle in [6,10]
    \TaskExecution{2}{6}{8}        % draws execution
    \TaskExecution{2}{9}{10}       % draws execution
    \TaskRespTime{2}{12}{4}        % draws the hatched rectangle in [12,16]
    \TaskExecution{2}{13}{16}      % draws execution   
  \end{RTGrid}  
\begin{verbatim}
  \begin{RTGrid}{2}{20}
  
    \TaskNArrDead{1}{0}{4}{4}{5}    % draws the arrivals and deadlines
    \TaskNExecDelta{1}{0}{1}{4}{5}  % draws executions (highest priority) 
                                    % for 5 instances of period 4 

 
    \TaskNArrDead{2}{0}{6}{6}{3}   % draws the arrivals and deadlines
                                   % for 3 instances of period 6 

    \TaskRespTime{2}{0}{4}         % draws the hatched rectangle in [0,4]
    \TaskExecution{2}{1}{4}        % draws execution (over the previous rectangle)
    \TaskRespTime{2}{6}{4}         % draws the hatched rectangle in [6,10]
    \TaskExecution{2}{6}{8}        % draws execution
    \TaskExecution{2}{9}{10}       % draws execution
    \TaskRespTime{2}{12}{4}        % draws the hatched rectangle in [12,16]
    \TaskExecution{2}{13}{16}      % draws execution   
  \end{RTGrid}   
\end{verbatim}
  \caption{Example with TaskRespTime}
  \label{fig:resp-time}
\end{figure}

It is sometimes usefull to represent the end of a job execution, especially when jobs are preempted. In that case, you can use the \verb+\TaskEnd{i}{t}+ command and its periodic version detailed in Table~\ref{tab:periodic_versions} that draw little circle(s) at the specified date(s). It works in the same way as \verb+\TaskArrival+ command and it is used in Figure~\ref{fig:ex1a}.




\subsection{Controlling visualization}

It is possible to specify many options in the \texttt{RTGrid}
environment. Maybe you don't like the grid: then, you can decide to
not visualise it as in Figure \ref{fig:ex2}, where we also removed the
task symbols.
\begin{figure}[!htbp]
  \centering
  %% no grid and no symbols
  \begin{RTGrid}[nogrid=1,nosymbols=1]{2}{20}
    \TaskNArrDead{1}{0}{4}{4}{5}    
    \TaskNExecDelta{1}{0}{1}{4}{5}  
    \TaskNArrDead{2}{0}{6}{6}{3}
    \TaskExecution{2}{1}{4}
    \TaskExecution{2}{6}{8}
    \TaskExecution{2}{9}{10}
    \TaskExecution{2}{13}{16}        
  \end{RTGrid}
\begin{verbatim}
  %% no grid and no symbols
  \begin{RTGrid}[nogrid=1,nosymbols=1]{2}{20}
    \TaskNArrDead{1}{0}{4}{4}{5}    
    \TaskNExecDelta{1}{0}{1}{4}{5}  
    \TaskNArrDead{2}{0}{6}{6}{3}
    \TaskExecution{2}{1}{4}
    \TaskExecution{2}{6}{8}
    \TaskExecution{2}{9}{10}
    \TaskExecution{2}{13}{16}        
  \end{RTGrid}
\end{verbatim}
  \caption{Removing visualization of the grid and of the task names}
  \label{fig:ex2}
\end{figure}

The next figure \ref{fig:ex2a} uses different task symbols, does not
show the numbers on the time line, and the color of the boxes that
denote the execution of the second instance of the second task are
changed to red. Also, I am changing the width, so the figure looks
smaller. Notice that you can directly specify colors using the TikZ
 way (color!percentage for example).

\begin{figure}[!htbp]
  \centering
  %% specify 1) no numbers on the time line, 2) a different symbol, 3)
  %% a different size of the symbol using latex size commands (default is \normalsize).
  %% Notice that you should not use the math mode in the
  %% specification of the symbol, as the symbol is already used in a
  %% math environment inside the macro
  \begin{RTGrid}[width=8cm,symbol=\gamma,nonumbers=1,labelsize=\small]{2}{20}
    \TaskNArrDead{1}{0}{4}{4}{5}    
    \TaskNExecDelta{1}{0}{1}{4}{5}
    \TaskNArrDead{2}{0}{6}{6}{3}    
    %% here, the border changes to cyan, and the fill to white
    \TaskExecution[linecolor=cyan,color=white]{2}{1}{4}
    %% the next two boxes are filled with red instead of gray
    \TaskExecution[color=red]{2}{6}{8}
    \TaskExecution[color=red!50]{2}{9}{10}
    \TaskExecution{2}{13}{16}        
  \end{RTGrid}

\begin{verbatim}
  %% specify 1) no numbers on the time line, 2) a different symbol, 3)
  %% a different size of the symbol (default is \normalsize).
  %% Notice that you should not use the math mode in the
  %% specification of the symbol, as the symbol is already used in a
  %% math environment inside the macro
  \begin{RTGrid}[symbol=\gamma,nonumbers=1,labelsize=\Large]{2}{20}
    \TaskNArrDead{1}{0}{4}{4}{5}    
    \TaskNExecDelta{1}{0}{1}{4}{5}
    \TaskNArrDead{2}{0}{6}{6}{3}  
    %% here, the border changes to cyan, and the fill to white
    \TaskExecution[linecolor=cyan,color=white]{2}{1}{4}
    %% the next two boxes are filled with red instead of gray
    \TaskExecution[color=red]{2}{6}{8}
    \TaskExecution[color=red]{2}{9}{10}
    \TaskExecution{2}{13}{16}        
  \end{RTGrid}
\end{verbatim}
  \caption{Different symbols (with \textbackslash Large size), no numbers, a different
    task color}
  \label{fig:ex2a}
\end{figure}

Do you want to specify an arbitrary symbol at a certain row?
No problem! See the example in Figure \ref{fig:ex2b}. Here we use the command:
\begin{verbatim}
\RowLabel{i}{label}
\end{verbatim}
which writes the \texttt{label} at the specified row (index 1 stays at
the top). Here we show also how to specify an arbitrary starting
number in the time line, using the \texttt{numoffset=12} option.

\begin{figure}[!htbp]
  \centering
  %% specify 1) no numbers on the time line, 2) number starting from
  %% 12
  \begin{RTGrid}[nosymbols=1,numoffset=12]{2}{20}
    %% the symbol for the first row
    \RowLabel{1}{Server}
    %% the symbol for the second row
    \RowLabel{2}{$\Pi_2$}
    \TaskNArrDead{1}{0}{4}{4}{5}    
    \TaskNExecDelta{1}{0}{1}{4}{5}  
    \TaskNArrDead{2}{0}{6}{6}{3}
    
    \TaskExecution{2}{1}{4}
    \TaskExecution{2}{6}{8}
    \TaskExecution{2}{9}{10}
    \TaskExecution{2}{13}{16}        
  \end{RTGrid}
\begin{verbatim}
  %% specify 1) no numbers on the time line, 2) number starting from 12
  \begin{RTGrid}[nosymbols=1,numoffset=12]{2}{20}
    %% the symbol for the first row
    \RowLabel{1}{Server}
    %% the symbol for the second row
    \RowLabel{2}{$\Pi_2$}
    \TaskNArrDead{1}{0}{4}{4}{5}    
    \TaskNExecDelta{1}{0}{1}{4}{5}  
    \TaskNArrDead{2}{0}{6}{6}{3}
    
    \TaskExecution{2}{1}{4}
    \TaskExecution{2}{6}{8}
    \TaskExecution{2}{9}{10}
    \TaskExecution{2}{13}{16}        
  \end{RTGrid}
\end{verbatim}
  \caption{Arbitrary symbols with an appropriate offset, no grid, numbering starting from 12}
  \label{fig:ex2b}
\end{figure}

% In the last example (Figure \ref{fig:ex2c}), we show an empty grid in
% which we specify width and height.

% \begin{figure}[!htbp]
%   \centering
%   %% 3 tasks, 10 units of time
%   \begin{RTGrid}[width=12cm, height=4cm]{3}{10}
    
%   \end{RTGrid}

% \begin{verbatim}
%   %% 3 tasks, 10 units of time
%   \begin{RTGrid}[width=12cm, height=4cm]{3}{10}
    
%   \end{RTGrid}
% \end{verbatim}
%   \caption{Empty grid with strange width and height}
%   \label{fig:ex2c}
% \end{figure}

\subsection{Highlighting and labeling objects}

Sometimes it may be important to say that one task has caused the
activation of another task. You can use the following command, as
shown in Figure \ref{fig:ex3a}:
\begin{verbatim}
\Activation{i}{t1}{j}{t2}
\end{verbatim}
which draws an arrow from the baseline of task \texttt{i} at time
\texttt{t1} to the baseline of task \texttt{j} at time \texttt{t2}.
Also, you can put an arbitrary label inside a shadow box with the
following command:
\begin{verbatim}
\Label{y}{x}{label}
\end{verbatim}
which draws a boxed label at position \texttt{x,y} in the grid.

Finally, it is possible to draw a rectangular box with rounded corners
to highlight a portion of the schedule with \texttt{RTBox}:
\begin{verbatim}
\RTBox{t1}{t2}
\end{verbatim}

\begin{figure}[!htbp]
  \centering
  \begin{RTGrid}{2}{20}
    \RTBox{12}{16}
    \TaskArrival{1}{0}{6}{4}
    \TaskExecDelta{1}{0}{2}{6}{4}
    \TaskArrival{2}{10}
    \TaskExecDelta[exeheight=1.5]{2}{10}{3}
    \Activation{1}{8}{2}{10}
    \Label{6}{7}{$\delta$}
  \end{RTGrid}
\begin{verbatim}
  \begin{RTGrid}{2}{20}
    \RTBox{12}{16}
    \TaskArrival{1}{0}{6}{4}
    \TaskExecDelta{1}{0}{2}{6}{4}
    \TaskArrival{2}{10}
    \TaskExecDelta[exeheight=1.5]{2}{10}{3}
    \Activation{1}{8}{2}{10}
    \Label{6}{7}{$\delta$}
  \end{RTGrid}
\end{verbatim}
  \caption{Activation (from one task to another one), and an arbitrary label}
  \label{fig:ex3a}
\end{figure}

Notice that the order with which the objects are drawn is exactly the
same as the order in which they are specified in the code, excepted 
for horizontal axes, arrivals, deadlines and end of job execution that are always drawn on the foreground. 
For example, in Figure \ref{fig:ex3a}, the executions of all the tasks are
drawn on top of the box. You can try to move the \texttt{RTBox}
command at the end to see what happens.

\subsection{Priority Inheritance}

An example of task locking/unlocking and the use of the Priority
Inheritance Protocol is shown in Figure \ref{fig:pi}. Here, task
$\tau_3$ locks resource $S$ at time $t=2$. This is obtained by using
command:
\begin{verbatim}
\TaskLock{3}{2}{S}
\end{verbatim}
Unlock is similarly obtained by using command: 
\begin{verbatim}
\TaskUnlock{3}{7}{S}
\end{verbatim}

Task $\tau_1$ tries to lock the same resource at time $t=5$. The
priority of $\tau_1$ is then inherited by $\tau_3$: the inheritance
rule is depicted by using a dashed tick arrow from the baseline of
$\tau_1$ to $\tau_3$, using command:
\begin{verbatim}
\Inherit{1}{3}{4}
\end{verbatim}
The fact that $\tau_3$ is executing inside a critical section is
denoted by putting a label inside the execution block, using the
following command:
\begin{verbatim}
\TaskExecution[color=white,execlabel=S]{3}{4}{5}
\end{verbatim}

\begin{figure}[!htbp]
  \centering
  \begin{RTGrid}[width=12cm]{3}{25}
    \TaskArrDead{3}{0}{20}
    \TaskExecution{3}{0}{2}
    \TaskLock{3}{2}{S}
    \TaskExecution[color=white,execlabel=S]{3}{2}{3}
    \TaskArrDead{1}{3}{9}  
    \TaskExecution{1}{3}{4}
    \TaskLock{1}{4}{S}
    \Inherit{1}{3}{4}
    \TaskExecution[color=white,execlabel=S]{3}{4}{5}
    \TaskArrDead{2}{5}{12}
    \TaskExecution[color=white,execlabel=S]{3}{5}{7}
    \TaskUnlock{3}{7}{S}
    \TaskExecution[color=white,execlabel=S]{1}{7}{9}
    \TaskUnlock{1}{9}{S}
    \TaskExecution{1}{9}{10}
    \TaskExecution{2}{10}{15}
    \TaskExecution{3}{15}{17}
  \end{RTGrid}
  \caption{Task blocking on resources: the Priority Inheritance Protocol}
  \label{fig:pi}
\begin{verbatim}
  \begin{RTGrid}[width=12cm]{3}{25}
    \TaskArrDead{3}{0}{20}
    \TaskExecution{3}{0}{2}
    \TaskLock{3}{2}{S}
    \TaskExecution[color=white,execlabel=S]{3}{2}{3}
    \TaskArrDead{1}{3}{9}  
    \TaskExecution{1}{3}{4}
    \TaskLock{1}{4}{S}
    \Inherit{1}{3}{4}
    \TaskExecution[color=white,execlabel=S]{3}{4}{5}
    \TaskArrDead{2}{5}{12}
    \TaskExecution[color=white,execlabel=S]{3}{5}{7}
    \TaskUnlock{3}{7}{S}
    \TaskExecution[color=white,execlabel=S]{1}{7}{9}
    \TaskUnlock{1}{9}{S}
    \TaskExecution{1}{9}{10}
    \TaskExecution{2}{10}{15}
    \TaskExecution{3}{15}{17}
    \end{RTGrid}
\end{verbatim}
  \caption{Priority Inheritance example}
  \label{fig:ex4}
\end{figure}

\end{document}
%%% Local Variables: 
%%% mode: latex
%%% TeX-master: t
%%% End: 
