Index: doc/papers/concurrency/Paper.tex
===================================================================
--- doc/papers/concurrency/Paper.tex	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ doc/papers/concurrency/Paper.tex	(revision 73e30dcff659cc9d117efd16f4bb1b05dd3f9b37)
@@ -248,8 +248,8 @@
 }
 
-\newbox\myboxA
-\newbox\myboxB
-\newbox\myboxC
-\newbox\myboxD
+\newsavebox{\myboxA}
+\newsavebox{\myboxB}
+\newsavebox{\myboxC}
+\newsavebox{\myboxD}
 
 \title{\texorpdfstring{Advanced Control-flow and Concurrency in \protect\CFA}{Advanced Control-flow in Cforall}}
@@ -2967,7 +2967,8 @@
 \lstset{language=CFA,moredelim=**[is][\color{red}]{@}{@},deletedelim=**[is][]{`}{`}}
 \begin{cfa}[aboveskip=0pt,belowskip=0pt]
-@coroutine@ C {} c;
-void main( C & ) { while () { @suspend;@ } }
+@coroutine@ C {};
+void main( C & ) { for () { @suspend;@ } }
 int main() { // coroutine test
+	C c;
 	BENCH( for ( N ) { @resume( c );@ } )
 	sout | result;
@@ -2989,5 +2990,5 @@
 \multicolumn{1}{@{}c}{} & \multicolumn{1}{c}{Median} &\multicolumn{1}{c}{Average} & \multicolumn{1}{c@{}}{Std Dev} \\
 C function			& 1.8		& 1.8		& 0.0	\\
-\CFA generator		& 1.8		& 1.8		& 0.1	\\
+\CFA generator		& 1.8		& 2.0		& 0.3	\\
 \CFA coroutine		& 32.5		& 32.9		& 0.8	\\
 \CFA thread			& 93.8		& 93.6		& 2.2	\\
Index: doc/theses/andrew_beach_MMath/Makefile
===================================================================
--- doc/theses/andrew_beach_MMath/Makefile	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ doc/theses/andrew_beach_MMath/Makefile	(revision 73e30dcff659cc9d117efd16f4bb1b05dd3f9b37)
@@ -5,4 +5,6 @@
 TEXSRC=$(wildcard *.tex)
 BIBSRC=$(wildcard *.bib)
+STYSRC=$(wildcard *.sty)
+CLSSRC=$(wildcard *.cls)
 TEXLIB= .:${BUILD}:
 BIBLIB= .:../../bibliography
@@ -24,5 +26,5 @@
 all: ${DOC}
 
-${BUILD}/${DOC}: ${TEXSRC} ${BIBSRC} Makefile | ${BUILD}
+${BUILD}/${DOC}: ${TEXSRC} ${BIBSRC} ${STYSRC} ${CLSSRC} Makefile | ${BUILD}
 	${LATEX} ${BASE}
 	${BIBTEX} ${BUILD}/${BASE}
Index: doc/theses/andrew_beach_MMath/cfalab.sty
===================================================================
--- doc/theses/andrew_beach_MMath/cfalab.sty	(revision 73e30dcff659cc9d117efd16f4bb1b05dd3f9b37)
+++ doc/theses/andrew_beach_MMath/cfalab.sty	(revision 73e30dcff659cc9d117efd16f4bb1b05dd3f9b37)
@@ -0,0 +1,29 @@
+% Package for CFA Research Lab.
+%
+% Made by combining and updating
+
+% I don't know what the oldest LaTeX2e version with everything needed is.
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesPackage{cfalab}[2020/03/09 v0.1 CFA Laboratory LaTeX Tools]
+
+% Other packages required.
+\RequirePackage{etoolbox}
+\RequirePackage{xspace}
+
+% Symbols: All symbols are zero argument robust commands with special rules
+% about the space following the c.s. token. Normally the space might be
+% re-added according to the rules of the xspace package. They may be followed
+% by a star (which the command will consume) to disable this behaviour.
+
+% \newsymbolcmd{<command>}{<expansion>}
+%    Defines <command> to be a symbol that has the given <expansion>.
+\newrobustcmd*\newsymbolcmd[2]{\newrobustcmd{#1}{\cfalab@symbol{#2}}}
+\def\cfalab@symbol#1{\@ifnextchar*{#1\cfalab@eatstar}{#1\xspace}}
+\def\cfalab@eatstar*{}
+
+% Cforall with the forall symbol.
+\newsymbolcmd\CFA{\textsf{C}\raisebox{\depth}{\rotatebox{180}{\textsf{A}}}}
+
+\newcommand\codeC[1]{\texttt{#1}}
+
+\endinput
Index: doc/theses/andrew_beach_MMath/thesis.tex
===================================================================
--- doc/theses/andrew_beach_MMath/thesis.tex	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ doc/theses/andrew_beach_MMath/thesis.tex	(revision 73e30dcff659cc9d117efd16f4bb1b05dd3f9b37)
@@ -1,84 +1,66 @@
-% uWaterloo Thesis Template for LaTeX 
-% Last Updated June 14, 2017 by Stephen Carr, IST Client Services
-% FOR ASSISTANCE, please send mail to rt-IST-CSmathsci@ist.uwaterloo.ca
-
-% Effective October 2006, the University of Waterloo 
-% requires electronic thesis submission. See the uWaterloo thesis regulations at
-% https://uwaterloo.ca/graduate-studies/thesis.
-
-% DON'T FORGET TO ADD YOUR OWN NAME AND TITLE in the "hyperref" package
-% configuration. THIS INFORMATION GETS EMBEDDED IN THE FINAL PDF DOCUMENT.
-% You can view the information if you view Properties of the PDF document.
-
-% Many faculties/departments also require one or more printed
-% copies. This template attempts to satisfy both types of output. 
-% It is based on the standard "book" document class which provides all
-% necessary sectioning structures and allows multi-part theses.
-
-% DISCLAIMER
-% To the best of our knowledge, this template satisfies the current uWaterloo
-% requirements. However, it is your responsibility to assure that you have met
-% all  requirements of the University and your particular department.
-% Many thanks for the feedback from many graduates that assisted the
-% development of this template.
-
-% -----------------------------------------------------------------------
-
-% By default, output is produced that is geared toward generating a PDF 
-% version optimized for viewing on an electronic display, including 
-% hyperlinks within the PDF.
- 
-% E.g. to process a thesis called "mythesis.tex" based on this template, run:
-
-% pdflatex mythesis	-- first pass of the pdflatex processor
-% bibtex mythesis	-- generates bibliography from .bib data file(s)
-% makeindex         -- should be run only if an index is used 
-% pdflatex mythesis	-- fixes numbering in cross-references,
-% pdflatex mythesis --   bibliographic references, glossaries, index, etc.
-
-% N.B. The "pdftex" program allows graphics in the following formats to be
-% included with the "\includegraphics" command: PNG, PDF, JPEG, TIFF
-% Tip 1: Generate your figures and photos in the size you want them to appear
-% in your thesis, rather than scaling them with \includegraphics options.
-% Tip 2: Any drawings you do should be in scalable vector graphic formats:
-% SVG, PNG, WMF, EPS and then converted to PNG or PDF, so they are scalable in
-% the final PDF as well.
-% Tip 3: Photographs should be cropped and compressed so as not to be too large.
-
-% To create a PDF output that is optimized for double-sided printing: 
-%
-% 1) comment-out the \documentclass statement in the preamble below, and
-% un-comment the second \documentclass line.
-%
-% 2) change the value assigned below to the boolean variable
-% "PrintVersion" from "false" to "true".
-
-% --------------------- Start of Document Preamble -----------------------
-
-% Specify the document class, default style attributes, and page dimensions
-% For hyperlinked PDF, suitable for viewing on a computer, use this:
-\documentclass[letterpaper,12pt,titlepage,oneside,final]{book}
- 
-% For PDF, suitable for double-sided printing, change the PrintVersion
-% variable below to "true" and use this \documentclass line instead of the one
-% above:
-%\documentclass[letterpaper,12pt,titlepage,openright,twoside,final]{book}
-
-% Some LaTeX commands I define for my own nomenclature.
-% If you have to, it's better to change nomenclature once here than in a 
-% million places throughout your thesis!
-\newcommand{\package}[1]{\textbf{#1}} % package names in bold text
-\newcommand{\cmmd}[1]{\textbackslash\texttt{#1}} % command name in tt font 
-\newcommand{\href}[1]{#1} % does nothing, but defines the command so the
-  % print-optimized version will ignore \href tags (redefined by hyperref pkg).
-%\newcommand{\texorpdfstring}[2]{#1} % does nothing, but defines the command
-% Anything defined here may be redefined by packages added below...
-
-% This package allows if-then-else control structures.
-\usepackage{ifthen}
-\newboolean{PrintVersion}
-\setboolean{PrintVersion}{false} 
-% CHANGE THIS VALUE TO "true" as necessary, to improve printed results for
-% hard copies by overriding some options of the hyperref package below.
+% Main tex file for thesis document.
+\documentclass[digital]{uw-ethesis}
+\usepackage{comment}
+\usepackage{fullpage}
+\setlength{\textheight}{8.75in}
+\renewcommand\labelitemi{\footnotesize$\bullet$} % shrink bullet for level 1 itemize
+\usepackage{lmodern}				% bold typewriter font
+
+\usepackage{listings}				% format program code
+% Default underscore is too low and wide. Cannot use lstlisting "literate" as replacing underscore
+% removes it as a variable-name character so keywords in variables are highlighted. MUST APPEAR
+% AFTER HYPERREF.
+%\DeclareTextCommandDefault{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.1ex}}}
+\renewcommand{\textunderscore}{\leavevmode\makebox[1.2ex][c]{\rule{1ex}{0.075ex}}}
+% parindent is relative, i.e., toggled on/off in environments like itemize, so store the value for
+% use rather than use \parident directly.
+\newlength{\parindentlnth}
+\setlength{\parindentlnth}{\parindent}
+
+% CFA programming language, based on ANSI C (with some gcc additions)
+\lstdefinelanguage{CFA}[ANSI]{C}{
+	morekeywords={
+		_Alignas, _Alignof, __alignof, __alignof__, asm, __asm, __asm__, __attribute, __attribute__,
+		auto, _Bool, catch, catchResume, choose, _Complex, __complex, __complex__, __const, __const__,
+		coroutine, disable, dtype, enable, exception, __extension__, fallthrough, fallthru, finally,
+		__float80, float80, __float128, float128, forall, ftype, generator, _Generic, _Imaginary, __imag, __imag__,
+		inline, __inline, __inline__, __int128, int128, __label__, monitor, mutex, _Noreturn, one_t, or,
+		otype, restrict, resume, __restrict, __restrict__, __signed, __signed__, _Static_assert, suspend, thread,
+		_Thread_local, throw, throwResume, timeout, trait, try, ttype, typeof, __typeof, __typeof__,
+		virtual, __volatile, __volatile__, waitfor, when, with, zero_t},
+	moredirectives={defined,include_next},
+	% replace/adjust listing characters that look bad in sanserif
+	literate={-}{\makebox[1ex][c]{\raisebox{0.5ex}{\rule{0.8ex}{0.1ex}}}}1 {^}{\raisebox{0.6ex}{$\scriptstyle\land\,$}}1
+		{~}{\raisebox{0.3ex}{$\scriptstyle\sim\,$}}1 % {`}{\ttfamily\upshape\hspace*{-0.1ex}`}1
+		{<}{\textrm{\textless}}1 {>}{\textrm{\textgreater}}1
+		{<-}{$\leftarrow$}2 {=>}{$\Rightarrow$}2 {->}{\makebox[1ex][c]{\raisebox{0.5ex}{\rule{0.8ex}{0.075ex}}}\kern-0.2ex{\textrm{\textgreater}}}2,
+}
+
+\lstset{
+language=CFA,
+columns=fullflexible,
+basicstyle=\linespread{0.9}\tt,			% reduce line spacing and use sanserif font
+stringstyle=\tt,				% use typewriter font
+tabsize=5,					% N space tabbing
+xleftmargin=\parindentlnth,			% indent code to paragraph indentation
+%mathescape=true,				% LaTeX math escape in CFA code $...$
+escapechar=\$,					% LaTeX escape in CFA code
+keepspaces=true,
+showstringspaces=false,				% do not show spaces with cup
+showlines=true,					% show blank lines at end of code
+aboveskip=4pt,					% spacing above/below code block
+belowskip=3pt,
+moredelim=**[is][\color{red}]{`}{`},
+}% lstset
+
+\lstnewenvironment{cfa}[1][]
+{\lstset{#1}}
+{}
+% inline code @...@
+
+% Commands used in documenting how to use the template. To remove.
+\newcommand{\package}[1]{\textbf{#1}}
+\newcommand{\cmmd}[1]{\textbackslash\texttt{#1}}
+\newcommand{\href}[1]{#1}
 
 % For a nomenclature (optional; available from ctan.org)
@@ -86,97 +68,23 @@
 % Lots of math symbols and environments
 \usepackage{amsmath,amssymb,amstext}
-% For including graphics N.B. pdftex graphics driver 
+% For including graphics, sets the pdftex graphics driver.
 \usepackage[pdftex]{graphicx}
 
-% I believe the general index function is covered by the glossaries.
-% \usepackage{makeidx}
-% \makeindex
-
-% Hyperlinks make it very easy to navigate an electronic document.
-% In addition, this is where you should specify the thesis title
-% and author as they appear in the properties of the PDF document.
-% Use the "hyperref" package 
-% N.B. HYPERREF MUST BE THE LAST PACKAGE LOADED; ADD ADDITIONAL PKGS ABOVE
-% N.B. pagebackref=true provides links back from the References to the body
-% text. This can cause trouble for printing.
-\usepackage[pdftex,pagebackref=false]{hyperref} % with basic options
-\hypersetup{
-    plainpages=false,       % needed if Roman numbers in frontpages
-    unicode=false,          % non-Latin characters in Acrobat’s bookmarks
-    pdftoolbar=true,        % show Acrobat’s toolbar?
-    pdfmenubar=true,        % show Acrobat’s menu?
-    pdffitwindow=false,     % window fit to page when opened
-    pdfstartview={FitH},    % fits the width of the page to the window
-    pdftitle={uWaterloo\ LaTeX\ Thesis\ Template},    % title: CHANGE THIS TEXT!
-%    pdfauthor={Author},    % author: CHANGE THIS TEXT! and uncomment this line
-%    pdfsubject={Subject},  % subject: CHANGE THIS TEXT! and uncomment this line
-%    pdfkeywords={keyword1} {key2} {key3}, % list of keywords, and uncomment this line if desired
-    pdfnewwindow=true,      % links in new window
-    colorlinks=true,        % false: boxed links; true: colored links
-    linkcolor=blue,         % color of internal links
-    citecolor=green,        % color of links to bibliography
-    filecolor=magenta,      % color of file links
-    urlcolor=cyan           % color of external links
-}
-\ifthenelse{\boolean{PrintVersion}}{
-  % for improved print quality, override some hyperref options
-\hypersetup{
-%    colorlinks,%
-    citecolor=black,%
-    filecolor=black,%
-    linkcolor=black,%
-    urlcolor=black}
-}{} % end of ifthenelse (no else)
-
-\usepackage[toc,abbreviations]{glossaries-extra} % Exception to the
-% rule of hyperref being the last add-on package. If glossaries-extra is not
-% in your LaTeX distribution, get it from CTAN
-% (http://ctan.org/pkg/glossaries-extra). 
-
-% Setting up the page margins...
-% uWaterloo thesis requirements specify a minimum of 1 inch (72pt) margin at
-% the top, bottom, and outside page edges and a 1.125 in. (81pt) gutter
-% margin (on binding side). While this is not an issue for electronic
-% viewing, a PDF may be printed, and so we have the same page layout for
-% both printed and electronic versions, we leave the gutter margin in.
-% Set margins to minimum permitted by uWaterloo thesis regulations:
-\setlength{\marginparwidth}{0pt} % width of margin notes
-% N.B. If margin notes are used, you must adjust \textwidth, \marginparwidth
-% and \marginparsep so that the space left between the margin notes and page
-% edge is less than 15 mm (0.6 in.)
-% Width of space between body text and margin notes.
-\setlength{\marginparsep}{0pt}
-\setlength{\evensidemargin}{0.125in} % Adds 1/8 in. to binding side of all 
-% even-numbered pages when the "twoside" printing option is selected
-\setlength{\oddsidemargin}{0.125in} % Adds 1/8 in. to the left of all pages
-% when "oneside" printing is selected, and to the left of all odd-numbered
-% pages when "twoside" printing is selected
-% Assuming US letter paper (8.5 in. x 11 in.) and side margins as above.
-\setlength{\textwidth}{6.375in}
-\raggedbottom
-
-% The following statement specifies the amount of space between paragraphs.
-% Other reasonable specifications are \bigskipamount and \smallskipamount.
-\setlength{\parskip}{\medskipamount}
-
-% The following statement controls the line spacing.  The default
-% spacing corresponds to good typographic conventions and only slight
-% changes (e.g., perhaps "1.2"), if any, should be made.
-\renewcommand{\baselinestretch}{1} % this is the default line space setting
-
-% By default, each chapter will start on a recto (right-hand side)
-% page.  We also force each section of the front pages to start on 
-% a recto page by inserting \cleardoublepage commands.
-% In many cases, this will require that the verso page be
-% blank and, while it should be counted, a page number should not be
-% printed.  The following statements ensure a page number is not
-% printed on an otherwise blank verso page.
-\let\origdoublepage\cleardoublepage
-\newcommand{\clearemptydoublepage}{%
-  \clearpage{\pagestyle{empty}\origdoublepage}}
-\let\cleardoublepage\clearemptydoublepage
-
-% Define Glossary terms (This is properly done here, in the preamble.
-% Could be \input{} from a file...)
+\usepackage{cfalab}
+
+\usehyperrefpackage[pdftex,pagebackref=false]{
+    pdftitle={Exception Handling in CFA},
+    pdfauthor={Andrew James Beach},
+    pdfsubject={Programming Languages},
+    pdfkeywords={exceptions,implementation},
+}
+
+% The \phantomsection is used to help the hyperref package create links.
+
+% Maybe only package that should be loaded after the hyperref package.
+% From http://ctan.org/pkg/glossaries-extra, extends glossaries which replaces
+% glossary and builds off of the makeindex system.
+\usepackage[toc,abbreviations]{glossaries-extra}
+
 % Main glossary entries -- definitions of relevant terminology
 \newglossaryentry{computer}
@@ -194,9 +102,11 @@
 type=nomenclature,
 name=dingledorf,
-description={A person of supposed average intelligence who makes incredibly brainless misjudgments}
+description={A person of supposed average intelligence who makes incredibly
+               brainless misjudgments}
 }
 
 % List of Abbreviations (abbreviations are from the glossaries-extra package)
-\newabbreviation{aaaaz}{AAAAZ}{American Association of Amature Astronomers and Zoologists}
+\newabbreviation{aaaaz}{AAAAZ}{American Association of Amature Astronomers
+               and Zoologists}
 
 % List of Symbols
@@ -207,21 +117,16 @@
 sort={label},
 type=symbols,
-description={Random vector: a location in n-dimensional Cartesian space, where each dimensional component is determined by a random process}
-}
- 
+description={Random vector: a location in n-dimensional Cartesian space, where
+               each dimensional component is determined by a random process}
+}
+
+% Must be here of cause problems with glossaries-extra.
+\lstMakeShortInline$%
+
+% Generate the glossaries defined above.
 \makeglossaries
 
-%======================================================================
-%   L O G I C A L    D O C U M E N T -- the content of your thesis
-%======================================================================
 \begin{document}
 
-% For a large document, it is a good idea to divide your thesis
-% into several files, each one containing one chapter.
-% To illustrate this idea, the "front pages" (i.e., title page,
-% declaration, borrowers' page, abstract, acknowledgements,
-% dedication, table of contents, list of tables, list of figures,
-% nomenclature) are contained within the file "uw-ethesis-frontpgs.tex" which
-% is included into the document by the following statement.
 %----------------------------------------------------------------------
 % FRONT MATERIAL
@@ -232,9 +137,6 @@
 % MAIN BODY
 %----------------------------------------------------------------------
-% Because this is a short document, and to reduce the number of files
-% needed for this template, the chapters are not separate
-% documents as suggested above, but you get the idea. If they were
-% separate documents, they would each start with the \chapter command, i.e, do
-% not contain \documentclass or \begin{document} and \end{document} commands.
+\input{unwinding}
+
 %======================================================================
 \chapter{Introduction}
@@ -327,42 +229,22 @@
 %----------------------------------------------------------------------
 
-% B I B L I O G R A P H Y
-% -----------------------
-
-% The following statement selects the style to use for references. It controls
-% the sort order of the entries in the bibliography and also the formatting
-% for the in-text labels.
-\bibliographystyle{plain}
-% This specifies the location of the file containing the bibliographic
-% information. It assumes you're using BibTeX (if not, why not?).
-
-% This is needed if the book class is used, to place the anchor in the correct
-% page, because the bibliography will start on its own page.
+%----------------------------------------------------------------------
+% BIBLIOGRAPHY
+%----------------------------------------------------------------------
+
 % Use \clearpage instead if the document class uses the "oneside" argument.
 \cleardoublepage
-% With hyperref package, enables hyperlinking from the table of contents to
-% bibliography
 \phantomsection
 
-% The following statement causes the title "References" to be used for the
-% bibliography section:
-\renewcommand*{\bibname}{References}
-
-% Add the References to the Table of Contents
-\addcontentsline{toc}{chapter}{\textbf{References}}
-
-% Tip 5: You can create multiple .bib files to organize your references. Just
-% list them all in the \bibliogaphy command, separated by commas (no spaces).
+% Bibliography setup and creation, renamed to References.
+\addcontentsline{toc}{chapter}{\textbf{\bibname}}
+\bibliographystyle{plain}
 \bibliography{thesis}
 
-% The following statement causes the specified references to be added to the
-% bibliography even if they were not cited in the text. The asterisk is a
-% wildcard that causes all entries in the bibliographic database to be
-% included (optional).
+% Include all uncited entries in the bibliography.
 \nocite{*}
 
-% The \appendix statement indicates the beginning of the appendices.
+% Begin the appendix, add a title and table of contents entry.
 \appendix
-% Add a title page before the appendices and a line in the Table of Contents
 \chapter*{APPENDICES}
 \addcontentsline{toc}{chapter}{APPENDICES}
Index: doc/theses/andrew_beach_MMath/unwinding.tex
===================================================================
--- doc/theses/andrew_beach_MMath/unwinding.tex	(revision 73e30dcff659cc9d117efd16f4bb1b05dd3f9b37)
+++ doc/theses/andrew_beach_MMath/unwinding.tex	(revision 73e30dcff659cc9d117efd16f4bb1b05dd3f9b37)
@@ -0,0 +1,168 @@
+\chapter{Unwinding in \CFA}
+
+When a function returns, a \emph{single} stack frame is unwound, removing the
+function's parameters and local variables, and control continues in the
+function's caller using the caller's stack frame.  When an exception is raised,
+\emph{multiple} stack frames are unwound, removing the function parameters and
+local variables for called functions from the exception raise-frame to the
+exception catch-frame.
+
+Unwinding multiple levels is simple for a programming languages without object
+destructors or block finalizers because a direct transfer is possible from the
+current stack frame to a prior stack frame, where control continues at a
+location within the prior caller's function. For example, C provides non-local
+transfer using $longjmp$, which stores a function's state including its
+frame pointer and program counter, and simply reloads this information to
+continue at this prior location on the stack.
+
+For programming languages with object destructors or block finalizers it is
+necessary to walk the stack frames from raise to catch, checking for code that
+must be executed as part of terminating each frame. Walking the stack has a
+higher cost, and necessary information must be available to detect
+destructors/finalizers and call them.
+
+A powerful package to provide stack-walking capabilities is $libunwind$,
+which is used in this work to provide exception handling in \CFA. The following
+explains how $libunwind$ works and how it is used.
+
+% Stack unwinding is the process of removing things from the stack from outside
+% the functions there. In languages that don't provide a way to guaranty that
+% code will run when the program leaves a scope or finishes a function, this
+% can be relatively trivial. C does this with $longjmp$ by setting the
+% stack pointer and a few other registers.
+
+\section{libunwind Usage}
+
+\CFA uses two primary functions in $libunwind$ to create most of its
+exceptional control-flow: $_Unwind_RaiseException$ and $_Unwind_ForcedUnwind$.
+Their operation is divided into two phases: search and clean-up. The search
+phase -- phase 1 -- is used to scan the stack but not unwinding it. The
+clean-up phase -- phase 2 -- is used for unwinding.
+
+% Somewhere around here I need to talk about the control structures.
+% $_Unwind_Exception$ is used to carry the API's universal data. Some
+% of this is internal, other fields are used to communicate between different
+% exception handling mechanisms in different runtimes.
+% $_Unwind_Context$ is an opaque data structure that is used to pass
+% information to helper functions.
+
+The raise-exception function uses both phases. It starts by searching for a
+handler, and if found, performs a clean-up phase to unwind the stack to the
+handler. If a handler is not found, control returns allowing the
+exception-handling policy for unhandled exception to be executed.  During both
+phases, the raise-exception function searches down the stack, calling each
+function's \emph{personality function}.
+
+A personality function performs three tasks, although not all have to be
+present. The tasks performed are decided by the actions provided.
+% Something argument something bitmask.
+\begin{itemize}
+\item$_UA_SEARCH_PHASE$ is called during the clean-up phase and means search
+for handlers. If a hander is found, the personality function should return
+$_URC_HANDLER_FOUND$, otherwise it returns $_URC_CONTINUE_UNWIND$.
+{\color{red}What is the connection between finding the handler and the
+personality function?}
+\item$_UA_CLEANUP_PHASE$ is passed in during the clean-up phase and means part
+or all of the stack frame is removed. The personality function should do
+whatever clean-up the language defines (such as running destructors/finalizers)
+and then generally returns $_URC_CONTINUE_UNWIND$.
+\item$_UA_HANDLER_FRAME$ means the personality function must install a
+handler. It is also passed in during the clean-up phase and is in addition to
+the clean-up action. $libunwind$ provides several helpers for the personality
+function here. Once it is done, the personality function must return
+$_URC_INSTALL_CONTEXT$.
+\end{itemize}
+
+Forced unwind only performs the clean-up phase. It is similar to the phase 2
+section of raise exception with a few changes. A simple difference is that it
+passes in an extra action to the personality function $_UA_FORCE_UNWIND$, which
+means a handler cannot be installed. The most difference significant is the
+addition of the $stop$ function, which is passed in as an argument to forced
+unwind.
+
+The $stop$ function is similar to a personality function. It takes an extra
+argument: a $void$ pointer passed into force unwind. It may return
+$_URC_NO_REASON$ to continue unwinding or it can transfer control out of the
+unwind code using its own mechanism.
+% Is there a reason that NO_REASON is used instead of CONTINUE_UNWIND?
+The $stop$ function is called for each stack frame and at the end of the
+stack. In a stack frame, it is called before the personality routine with the
+same arguments (except for the extra $void$ pointer). At the end of the stack,
+the arguments are mostly the same, except the stack pointer stored in the
+context is set to null. Because of this change, both GCC and Clang add an extra
+action in this case $_UA_END_OF_STACK$.  The $stop$ function may not return at
+the end of the stack.
+
+{\color{red}This needs work as I do not understand all of it.}
+
+
+\section{\CFA Implementation}
+
+To use $libunwind$, \CFA provides several wrappers, its own storage,
+personality functions, and a $stop$ function.
+
+The wrappers perform three tasks: set-up, clean-up and controlling the
+unwinding. The set-up allocates a copy of the \CFA exception into a handler to
+control its lifetime, and stores it in the exception context.  Clean-up -- run
+when control exits a catch clause and returns to normal code -- frees the
+exception copy.
+% It however does not set up the unwind exception so we can't use any inter-
+% runtime/language features. Also the exception context is global.
+
+The control code in the middle {\color{red}(In the middle of what?)} is run
+every time a throw or re-throw is called. It uses raise exception to search for
+a handler and to run it, if one is found. Otherwise, it uses forced unwind to
+unwind the stack, running all destructors, before terminating the process.
+
+The $stop$ function is very simple. It checks the end of stack flag to see if
+it is finished unwinding. If so, it calls $exit$ to end the process, otherwise
+it tells the system {\color{red}(What system?)} to continue unwinding.
+% Yeah, this is going to have to change.
+
+The personality routine is more complex because it has to obtain information
+about the function by scanning the LSDA (Language Specific Data Area). This
+step allows a single personality function to be used for multiple functions and
+it accounts for multiple regions{\color{red}(What's a region?)} and possible
+handlers in a single function.
+% Not that we do that yet.
+
+However, generating the LSDA is difficult. It requires knowledge about the
+location of the instruction pointer and stack layout, which varies by
+optimization levels. So for frames where there are only destructors, GCC's
+attribute cleanup with the $-fexception$ flag is sufficient to handle unwinding.
+
+For functions with handlers (defined in the $try$ statement) the function is
+split into several functions. Everything outside the $try$ statement is the
+first function, which only has destructors to be run during unwinding. The
+catch clauses of the $try$ block are then converted into GCC inner functions,
+which are passed via function pointers while still having access to the outer
+function's scope. $catchResume$ and $finally$ clauses are handled separately
+and not discussed here.
+
+The $try$ clause {\color{red}You have $try$ statement, $try$ block, and $try$
+clause, which need clarification.)} is converted to a function directly. The
+$catch$ clauses are combined into two functions. The first is the match
+function, which is used during the search phase to find a handler. The second
+it the catch function, which is a large switch-case for the different
+handlers. These functions do not interact with unwinding except for running
+destructors and so can be handled by GCC.
+
+These three functions are passed into $try_terminate$, an internal function
+that represents the $try$ statement. This function uses the generated
+personality functions as well as assembly statements to create the LSDA.  In
+normal execution, this function only calls the $try$ block closure. However,
+using $libunwind$, its personality function now handles exception matching and
+catching. {\color{red}(I don't understand the last sentence.)}
+
+During the search phase, the personality function retrieves the match function
+from the stack using the saved stack pointer. The function is called, either
+returning 0 for no match or the index (a positive integer) of the handler for a
+match. If a handler is found, the personality function reports it after saving
+the index to the exception context.
+
+During the clean-up phase there is nothing for the personality function to
+clean-up in $try_terminate$. So if this is not the handler frame, unwinding
+continues. If this is the handler frame, control is transferred to the catch
+function, giving it the exception and the handler index.
+
+{\color{red}This needs work as I do not understand all of it.}
Index: doc/theses/andrew_beach_MMath/uw-ethesis.cls
===================================================================
--- doc/theses/andrew_beach_MMath/uw-ethesis.cls	(revision 73e30dcff659cc9d117efd16f4bb1b05dd3f9b37)
+++ doc/theses/andrew_beach_MMath/uw-ethesis.cls	(revision 73e30dcff659cc9d117efd16f4bb1b05dd3f9b37)
@@ -0,0 +1,137 @@
+% A document class built from the uw-ethesis template, 2017-06-14 version.
+% This link should get to the regulations:
+% https://uwaterloo.ca/graduate-studies/thesis.
+%
+% WIP I am still moving things out of the provided template.
+%
+% This is approximately (check regulations to be sure) the required set up for
+% a thesis at UW. It also adds some other pieces that are likely to be useful.
+%
+% There are several formats you may choose from. These adjust the settings so
+% the document comes out a little better for different uses. "digital" is for
+% pdf documents that will remain on a computer while "print" is for printing
+% paper copies.
+%
+% Options:
+%   <format>
+%     All the formats are options, sets the document's format to that format.
+%     If no format is given digital is the default.
+%
+% Exported Names:
+%   \ifformat{<format>}{<true>}{<false>}
+%     If the document's format is <format> than expands to <true> otherwise
+%     expands to <false>.
+%
+%   \usehyperrefpackage[<options>]{<setup>}
+%     Loads the hyperref package with <options> and preforms set up. The
+%     initial setup depends on the document format but they can be overriden
+%     with options in <setup> (set hyperref's \hypersetup for details).
+\NeedsTeXFormat{LaTeX2e}
+\ProvidesClass{uw-ethesis}[2020/03/09 v0.1 UW E-Thesis Template Document Class]
+
+\RequirePackage{etoolbox}
+
+% Requested Format:
+\newrobustcmd*{\ethesis@format}{digital}
+\DeclareOption{print}{\renewrobustcmd*{\ethesis@format}{print}}
+\DeclareOption{digital}{\renewrobustcmd*{\ethesis@format}{digital}}
+
+\ProcessOptions\relax
+
+\def\ifformat#1#2#3{\ifdefstring{\ethesis@format}{#1}{#2}{#3}}
+
+\ifformat{print}{%
+  \LoadClass[letterpaper,12pt,titlepage,openright,twoside,final]{book}%
+}{%
+  \LoadClass[letterpaper,12pt,titlepage,twoside,final]{book}%
+}
+
+% Setting up the page margins. These are the minimum margins in the uWaterloo
+% thesis requirements. 1in (72pt) on the top, bottom and outside and
+% 1 1/8in (81pt) on the inside/gutter/binding side. Only required for
+% printing but here set for all formats.
+
+% If margin notes are used, you must adjust \textwidth, \marginparwidth and
+% \marginparsep so space between the margin notes and page edge is less than
+% 15mm (0.6in). I don't actually understand that instruction.
+
+\setlength{\marginparwidth}{0pt}
+
+% Width of space between body text and margin notes.
+\setlength{\marginparsep}{0pt}
+
+% Set width of margin on binding side. With oneside all pages are odd.
+\setlength{\evensidemargin}{0.125in}
+\setlength{\oddsidemargin}{0.125in}
+
+% Assuming US letter paper (8.5 in. x 11 in.) and side margins as above.
+\setlength{\textwidth}{6.375in}
+\raggedbottom
+
+% The following statement specifies the amount of space between paragraphs.
+% Other reasonable specifications are \bigskipamount and \smallskipamount.
+\setlength{\parskip}{\medskipamount}
+
+% The following statement controls the line spacing. You should not change
+% this value significantly (e.g. perhaps "1.2").
+\renewcommand{\baselinestretch}{1}
+
+% Normally every chapter will start on a recto (right-hand side) page. This
+% command is used to make sure the each section of the front pages starts on
+% a recto page. This will often require an empty verso (left-hand side) page
+% that should not have the page number printed on it.
+\let\origdoublepage\cleardoublepage
+\newcommand{\clearemptydoublepage}{%
+  \clearpage{\pagestyle{empty}\origdoublepage}}
+\let\cleardoublepage\clearemptydoublepage
+
+% Change the default name of the bibliography.
+\renewcommand*{\bibname}{References}
+
+% Configurations
+\def\setThesisTitle#1{\newrobustcmd*{\ethesis@title}{#1}}
+\def\setThesisAuthor#1{\newrobustcmd*{\ethesis@author}{#1}}
+\def\setThesisSubject#1{\newrobustcmd*{\ethesis@subject}{#1}}
+\def\setThesisKeywords#1{\newrobustcmd*{\ethesis@keywords}{#1}}
+
+% Includes the hyperref package loading a number of defaults.
+\newrobustcmd*{\usehyperrefpackage}[2][]{%
+  \usepackage[#1]{hyperref}
+  \hypersetup{
+    plainpages=false,       % Needed for Roman numbers in frontpages.
+    unicode=false,          % Non-Latin characters in Acrobat ^ ^ s bookmarks.
+    pdftoolbar=true,        % Show Acrobat ^ ^ s toolbar?
+    pdfmenubar=true,        % Show Acrobat ^ ^ s menu?
+    pdffitwindow=false,     % Window is not fit to page when opened.
+    pdfstartview={FitH},    % Fits the width of the page to the window.
+  }
+  \ifdef{\ethesis@title}{\hypersetup{pdftitle={\ethesis@title}}}{}
+  \ifdef{\ethesis@author}{\hypersetup{pdfauthor={\ethesis@author}}}{}
+  \ifdef{\ethesis@subject}{\hypersetup{pdfsubject={\ethesis@subject}}}{}
+  \ifdef{\ethesis@keywords}{\hypersetup{pdfkeywords={\ethesis@keywords}}}{}
+  \ifformat{print}{
+    \hypersetup{
+      %colorlinks=false,
+      colorlinks=true, % I think there is a style difference here.
+      citecolor=black,
+      filecolor=black,
+      linkcolor=black,
+      urlcolor=black
+    }
+  }{
+    \hypersetup{
+      colorlinks=true,        % false: boxed links; true: colored links
+      linkcolor=blue,         % colour of internal links
+      citecolor=green,        % colour of links to bibliography
+      filecolor=magenta,      % colour of file links
+      urlcolor=cyan           % colour of external links
+    }
+  }
+  \notblank{#2}{\hypersetup{#2}}{}
+}
+
+% Includes the glossaries-extra package and sets up some helpers.
+% Except right now I don't really have any helpers to add.
+%\newrobustcmd*{\useglossariesextrapackage}[2][]{%
+%  \usepackage[#1]{glossaries-extra}
+%}
Index: doc/theses/thierry_delisle_PhD/comp_II/comp_II.tex
===================================================================
--- doc/theses/thierry_delisle_PhD/comp_II/comp_II.tex	(revision c4fd4ef79cef1612a97ce467b6d38124c5580f0e)
+++ doc/theses/thierry_delisle_PhD/comp_II/comp_II.tex	(revision 73e30dcff659cc9d117efd16f4bb1b05dd3f9b37)
@@ -8,7 +8,7 @@
 \usepackage{graphicx}
 \usepackage{epic,eepic}
-\usepackage[hidelinks]{hyperref}
 \usepackage{glossaries}
 \usepackage{textcomp}
+\usepackage[hidelinks]{hyperref}
 %\usepackage[margin=1in]{geometry}
 %\usepackage{float}
@@ -151,7 +151,7 @@
 \begin{table}
 	\begin{center}
-		\begin{tabular}{|c|c|c|}
-			\hline
-			& Many Processors & Few Processors \\
+		\begin{tabular}{|r|l|l|}
+			\cline{2-3}
+			\multicolumn{1}{r|}{} & \multicolumn{1}{c|}{Many Processors} & \multicolumn{1}{c|}{Few Processors} \\
 			\hline
 			Many Threads & A: good performance & B: good performance \\
@@ -260,20 +260,18 @@
 
 
-\cleardoublepage
-
 % B I B L I O G R A P H Y
 % -----------------------------
-\addcontentsline{toc}{chapter}{Bibliography}
+\cleardoublepage
+\phantomsection		% allows hyperref to link to the correct page
+\addcontentsline{toc}{section}{\refname}
 \bibliographystyle{plain}
 \bibliography{pl,local}
+
+% G L O S S A R Y
+% -----------------------------
 \cleardoublepage
 \phantomsection		% allows hyperref to link to the correct page
-
-% G L O S S A R Y
-% -----------------------------
-\addcontentsline{toc}{chapter}{Glossary}
+\addcontentsline{toc}{section}{Glossary}
 \printglossary
-\cleardoublepage
-\phantomsection		% allows hyperref to link to the correct page
 
 \end{document}
