Index: doc/papers/concurrency/Paper.tex
===================================================================
--- doc/papers/concurrency/Paper.tex	(revision 944ce479ac8499f69862b70a6deff9321c3231ac)
+++ doc/papers/concurrency/Paper.tex	(revision 9f668110f5c6ea7a0655268cd78aac3ae72f45d4)
@@ -32,4 +32,7 @@
 \renewcommand{\linenumberfont}{\scriptsize\sffamily}
 
+\renewcommand{\topfraction}{0.8}			% float must be greater than X of the page before it is forced onto its own page
+\renewcommand{\bottomfraction}{0.8}			% float must be greater than X of the page before it is forced onto its own page
+\renewcommand{\floatpagefraction}{0.8}		% float must be greater than X of the page before it is forced onto its own page
 \renewcommand{\textfraction}{0.0}			% the entire page maybe devoted to floats with no text on the page at all
 
@@ -132,10 +135,15 @@
 \makeatother
 
-\newenvironment{cquote}{%
-	\list{}{\lstset{resetmargins=true,aboveskip=0pt,belowskip=0pt}\topsep=3pt\parsep=0pt\leftmargin=\parindentlnth\rightmargin\leftmargin}%
-	\item\relax
-}{%
-	\endlist
-}% cquote
+\newenvironment{cquote}
+               {\list{}{\lstset{resetmargins=true,aboveskip=0pt,belowskip=0pt}\topsep=3pt\parsep=0pt\leftmargin=\parindentlnth\rightmargin\leftmargin}%
+                \item\relax}
+               {\endlist}
+
+%\newenvironment{cquote}{%
+%\list{}{\lstset{resetmargins=true,aboveskip=0pt,belowskip=0pt}\topsep=3pt\parsep=0pt\leftmargin=\parindentlnth\rightmargin\leftmargin}%
+%\item\relax%
+%}{%
+%\endlist%
+%}% cquote
 
 % CFA programming language, based on ANSI C (with some gcc additions)
@@ -271,5 +279,5 @@
 Concurrency tools handle mutual exclusion and synchronization, while parallelism tools handle performance, cost, and resource utilization.
 
-The proposed concurrency API is implemented in a dialect of C, called \CFA.
+The proposed concurrency API is implemented in a dialect of C, called \CFA (pronounced C-for-all).
 The paper discusses how the language features are added to the \CFA translator with respect to parsing, semantics, and type checking, and the corresponding high-performance runtime-library to implement the concurrent features.
 
@@ -281,9 +289,8 @@
 
 \CFA is a non-object-oriented extension of ISO-C, and hence, supports all C paradigms.
-%It is a non-object-oriented system-language, meaning most of the major abstractions have either no runtime overhead or can be opted out easily.
 Like C, the building blocks of \CFA are structures and routines.
 Virtually all of the code generated by the \CFA translator respects C memory layouts and calling conventions.
-While \CFA is not object oriented, lacking the concept of a receiver (\eg @this@) and nominal inheritance-relationships, C does have a notion of objects: ``region of data storage in the execution environment, the contents of which can represent values''~\cite[3.15]{C11}.
-While some \CFA features are common in object-oriented programming, they are independent capabilities allowing \CFA to adopt them while maintaining a procedural paradigm.
+While \CFA is not object oriented, lacking the concept of a receiver (\eg @this@) and nominal inheritance-relationships, C has a notion of objects: ``region of data storage in the execution environment, the contents of which can represent values''~\cite[3.15]{C11}.
+While some object-oriented features appear in \CFA, they are independent capabilities, allowing \CFA to adopt them while maintaining a procedural paradigm.
 
 
@@ -338,5 +345,5 @@
 Object-oriented programming languages only provide implicit qualification for the receiver.
 
-In detail, the @with@ statement has the form:
+In detail, the @with@-statement syntax is:
 \begin{cfa}
 $\emph{with-statement}$:
@@ -348,5 +355,5 @@
 (Enumerations are already opened.)
 The object is the implicit qualifier for the open structure-fields.
-All expressions in the expression list are open in parallel within the compound statement, which is different from Pascal, which nests the openings from left to right.
+All expressions in the expression list are opened in parallel within the compound statement, which is different from Pascal, which nests the openings from left to right.
 
 
@@ -354,11 +361,12 @@
 
 \CFA maximizes the ability to reuse names via overloading to aggressively address the naming problem.
-Both variables and routines may be overloaded, where selection is based on types, and number of returns (as in Ada~\cite{Ada}) and arguments.
+Both variables and routines may be overloaded, where selection is based on number and types of returns and arguments (as in Ada~\cite{Ada}).
+\newpage
+\vspace*{-2\baselineskip}%???
 \begin{cquote}
-\vspace*{-\baselineskip}%???
+\begin{cfa}
+// selection based on type
+\end{cfa}
 \lstDeleteShortInline@%
-\begin{cfa}
-// selection based on type
-\end{cfa}
 \begin{tabular}{@{}l@{\hspace{2\parindentlnth}}|@{\hspace{2\parindentlnth}}l@{}}
 \begin{cfa}
@@ -411,5 +419,5 @@
 Therefore, overloading eliminates long prefixes and other naming conventions to prevent name clashes.
 As seen in Section~\ref{s:Concurrency}, routine @main@ is heavily overloaded.
-For example, variable overloading is useful in the parallel semantics of the @with@ statement for fields with the same name:
+As another example, variable overloading is useful in the parallel semantics of the @with@ statement for fields with the same name:
 \begin{cfa}
 struct S { int `i`; int j; double m; } s;
@@ -464,5 +472,4 @@
 \lstMakeShortInline@%
 \end{cquote}
-While concurrency does not use operator overloading directly, it provides an introduction for the syntax of constructors.
 
 
@@ -470,5 +477,5 @@
 
 Object lifetime is a challenge in non-managed programming languages.
-\CFA responds with \CC-like constructors and destructors:
+\CFA responds with \CC-like constructors and destructors, using a different operator-overloading syntax.
 \begin{cfa}
 struct VLA { int len, * data; };			$\C{// variable length array of integers}$
@@ -490,5 +497,5 @@
 Like \CC, construction is implicit on allocation (stack/heap) and destruction is implicit on deallocation.
 The object and all their fields are constructed/destructed.
-\CFA also provides @new@ and @delete@, which behave like @malloc@ and @free@, in addition to constructing and destructing objects:
+\CFA also provides @new@ and @delete@ as library routines, which behave like @malloc@ and @free@, in addition to constructing and destructing objects:
 \begin{cfa}
 {
@@ -518,5 +525,8 @@
 int i = sum( sa, 5 );						$\C{// use S's 0 construction and +}$
 \end{cfa}
-The builtin type @zero_t@ (and @one_t@) overload constant 0 (and 1) for a new types, where both 0 and 1 have special meaning in C.
+Type variables can be @otype@ or @dtype@.
+@otype@ refers to a \emph{complete type}, \ie, a type with size, alignment, default constructor, copy constructor, destructor, and assignment operator.
+@dtype@ refers to an \emph{incomplete type}, \eg, void or a forward-declared type.
+The builtin types @zero_t@ and @one_t@ overload constant 0 and 1 for a new types, where both 0 and 1 have special meaning in C.
 
 \CFA provides \newterm{traits} to name a group of type assertions, where the trait name allows specifying the same set of assertions in multiple locations, preventing repetition mistakes at each routine declaration:
@@ -533,8 +543,4 @@
 \end{cfa}
 
-Assertions can be @otype@ or @dtype@.
-@otype@ refers to a \emph{complete} object, \ie an object has a size, alignment, default constructor, copy constructor, destructor and an assignment operator.
-@dtype@ refers to an \emph{incomplete} object, \ie, an object only has a size and alignment.
-
 Using the return type for overload discrimination, it is possible to write a type-safe @alloc@ based on the C @malloc@:
 \begin{cfa}
@@ -554,6 +560,6 @@
 In coroutining, the single thread is self-scheduling across the stacks, so execution is deterministic, \ie the execution path from input to output is fixed and predictable.
 A \newterm{stackless} coroutine executes on the caller's stack~\cite{Python} but this approach is restrictive, \eg preventing modularization and supporting only iterator/generator-style programming;
-a \newterm{stackfull} coroutine executes on its own stack, allowing full generality.
-Only stackfull coroutines are a stepping stone to concurrency.
+a \newterm{stackful} coroutine executes on its own stack, allowing full generality.
+Only stackful coroutines are a stepping stone to concurrency.
 
 The transition to concurrency, even for execution with a single thread and multiple stacks, occurs when coroutines also context switch to a \newterm{scheduling oracle}, introducing non-determinism from the coroutine perspective~\cite[\S~3]{Buhr05a}.
@@ -561,12 +567,12 @@
 The resulting execution system now follows a cooperative threading-model, called \newterm{non-preemptive scheduling}.
 
-Because the scheduler is special, it can either be a stackless or stackfull coroutine.
+Because the scheduler is special, it can either be a stackless or stackful coroutine.
 For stackless, the scheduler performs scheduling on the stack of the current coroutine and switches directly to the next coroutine, so there is one context switch.
-For stackfull, the current coroutine switches to the scheduler, which performs scheduling, and it then switches to the next coroutine, so there are two context switches.
-A stackfull scheduler is often used for simplicity and security, even through there is a slightly higher runtime-cost.
+For stackful, the current coroutine switches to the scheduler, which performs scheduling, and it then switches to the next coroutine, so there are two context switches.
+A stackful scheduler is often used for simplicity and security.
 
 Regardless of the approach used, a subset of concurrency related challenges start to appear.
 For the complete set of concurrency challenges to occur, the missing feature is \newterm{preemption}, where context switching occurs randomly between any two instructions, often based on a timer interrupt, called \newterm{preemptive scheduling}.
-While a scheduler introduces uncertainty in the order of execution, preemption introduces uncertainty where context switches occur.
+While a scheduler introduces uncertainty in the order of execution, preemption introduces uncertainty about where context switches occur.
 Interestingly, uncertainty is necessary for the runtime (operating) system to give the illusion of parallelism on a single processor and increase performance on multiple processors.
 The reason is that only the runtime has complete knowledge about resources and how to best utilized them.
@@ -574,7 +580,4 @@
 otherwise, it is impossible to write meaningful programs.
 Optimal performance in concurrent applications is often obtained by having as much non-determinism as correctness allows.
-
-
-\subsection{\protect\CFA's Thread Building Blocks}
 
 An important missing feature in C is threading\footnote{While the C11 standard defines a \protect\lstinline@threads.h@ header, it is minimal and defined as optional.
@@ -594,5 +597,5 @@
 This capability is accomplish via the coroutine's stack, where suspend/resume context switch among stacks.
 Because threading design-challenges are present in coroutines, their design effort is relevant, and this effort can be easily exposed to programmers giving them a useful new programming paradigm because a coroutine handles the class of problems that need to retain state between calls, \eg plugins, device drivers, and finite-state machines.
-Therefore, the core \CFA coroutine-API for has two fundamental features: independent call-stacks and @suspend@/@resume@ operations.
+Therefore, the two fundamental features of the core \CFA coroutine-API are independent call-stacks and @suspend@/@resume@ operations.
 
 For example, a problem made easier with coroutines is unbounded generators, \eg generating an infinite sequence of Fibonacci numbers
@@ -722,5 +725,5 @@
 Figure~\ref{f:Coroutine3States} creates a @coroutine@ type, @`coroutine` Fib { int fn; }@, which provides communication, @fn@, for the \newterm{coroutine main}, @main@, which runs on the coroutine stack, and possibly multiple interface routines, \eg @next@.
 Like the structure in Figure~\ref{f:ExternalState}, the coroutine type allows multiple instances, where instances of this type are passed to the (overloaded) coroutine main.
-The coroutine main's stack holds the state for the next generation, @f1@ and @f2@, and the code has the three suspend points, representing the three states in the Fibonacci formula, to context switch back to the caller's @resume@.
+The coroutine main's stack holds the state for the next generation, @f1@ and @f2@, and the code represents the three states in the Fibonacci formula via the three suspend points, to context switch back to the caller's @resume@.
 The interface routine @next@, takes a Fibonacci instance and context switches to it using @resume@;
 on restart, the Fibonacci field, @fn@, contains the next value in the sequence, which is returned.
@@ -835,5 +838,5 @@
 The previous examples are \newterm{asymmetric (semi) coroutine}s because one coroutine always calls a resuming routine for another coroutine, and the resumed coroutine always suspends back to its last resumer, similar to call/return for normal routines.
 However, @resume@ and @suspend@ context switch among existing stack-frames, rather than create new ones so there is no stack growth.
-\newterm{Symmetric (full) coroutine}s have a coroutine call to a resuming routine for another coroutine, and its coroutine main has a call to another resuming routine, which eventually forms a resuming-call cycle.
+\newterm{Symmetric (full) coroutine}s have a coroutine call to a resuming routine for another coroutine, and its coroutine main calls another resuming routine, which eventually forms a resuming-call cycle.
 (The trivial cycle is a coroutine resuming itself.)
 This control flow is similar to recursion for normal routines, but again there is no stack growth from the context switch.
@@ -926,5 +929,5 @@
 The call from the consumer to @payment@ introduces the cycle between producer and consumer.
 When @payment@ is called, the consumer copies values into the producer's communication variable and a resume is executed.
-The context switch restarts the producer at the point where it was last context switched, so it continues in @delivery@ after the resume.
+The context switch restarts the producer at the point where it last context switched, so it continues in @delivery@ after the resume.
 
 @delivery@ returns the status value in @prod@'s coroutine main, where the status is printed.
@@ -956,5 +959,5 @@
 For example, for threads if the thread is implicitly started, it must start \emph{after} all constructors, because the thread relies on a completely initialized object, but the inherited constructor runs \emph{before} the derived.
 
-An alternatively is composition:
+An alternative is composition:
 \begin{cfa}
 struct mycoroutine {
@@ -1004,8 +1007,8 @@
 Users wanting to extend coroutines or build their own for various reasons can only do so in ways offered by the language.
 Furthermore, implementing coroutines without language supports also displays the power of a programming language.
-While this is ultimately the option used for idiomatic \CFA code, coroutines and threads can still be constructed without using the language support.
-The reserved keyword simply eases use for the common cases.
-
-Part of the mechanism to generalize coroutines is using a \CFA trait, which defines a coroutine as anything satisfying the trait @is_coroutine@, and this trait is used to restrict coroutine-manipulation routines:
+While this is ultimately the option used for idiomatic \CFA code, coroutines and threads can still be constructed without language support.
+The reserved keyword simply eases use for the common case.
+
+Part of the mechanism to generalize coroutines is using a \CFA trait, which defines a coroutine as anything satisfying the trait @is_coroutine@, and this trait restricts the available set of coroutine-manipulation routines:
 \begin{cfa}
 trait is_coroutine( `dtype` T ) {
@@ -1019,5 +1022,4 @@
 The routine definitions ensures there is a statically-typed @main@ routine that is the starting point (first stack frame) of a coroutine, and a mechanism to get (read) the currently executing coroutine handle.
 The @main@ routine has no return value or additional parameters because the coroutine type allows an arbitrary number of interface routines with corresponding arbitrary typed input/output values versus fixed ones.
-The generic routines @suspend@ and @resume@ can be redefined, but any object passed to them is a coroutine since it must satisfy the @is_coroutine@ trait to compile.
 The advantage of this approach is that users can easily create different types of coroutines, \eg changing the memory layout of a coroutine is trivial when implementing the @get_coroutine@ routine, and possibly redefining @suspend@ and @resume@.
 The \CFA keyword @coroutine@ implicitly implements the getter and forward declarations required for implementing the coroutine main:
@@ -1150,17 +1152,17 @@
 \begin{cfa}
 int main() {
-	MyThread * heapLived;
+	MyThread * heapLive;
 	{
-		MyThread blockLived;				$\C{// fork block-based thread}$
-		heapLived = `new`( MyThread );		$\C{// fork heap-based thread}$
+		MyThread blockLive;					$\C{// fork block-based thread}$
+		heapLive = `new`( MyThread );		$\C{// fork heap-based thread}$
 		...
 	}										$\C{// join block-based thread}$
 	...
-	`delete`( heapLived );					$\C{// join heap-based thread}$
+	`delete`( heapLive );					$\C{// join heap-based thread}$
 }
 \end{cfa}
 The heap-based approach allows arbitrary thread-creation topologies, with respect to fork/join-style concurrency.
 
-Figure~\ref{s:ConcurrentMatrixSummation} shows concurrently adding the rows of a matrix and then totalling the subtotals sequential, after all the row threads have terminated.
+Figure~\ref{s:ConcurrentMatrixSummation} shows concurrently adding the rows of a matrix and then totalling the subtotals sequentially, after all the row threads have terminated.
 The program uses heap-based threads because each thread needs different constructor values.
 (Python provides a simple iteration mechanism to initialize array elements to different values allowing stack allocation.)
@@ -1215,5 +1217,5 @@
 However, for productivity it is always desirable to use the highest-level construct that provides the necessary efficiency~\cite{Hochstein05}.
 A newer approach for restricting non-determinism is transactional memory~\cite{Herlihy93}.
-While this approach is pursued in hardware~\cite{Nakaike15} and system languages, like \CC~\cite{Cpp-Transactions}, the performance and feature set is still too restrictive to be the main concurrency paradigm for system languages, which is why it was rejected as the core paradigm for concurrency in \CFA.
+While this approach is pursued in hardware~\cite{Nakaike15} and system languages, like \CC~\cite{Cpp-Transactions}, the performance and feature set is still too restrictive to be the main concurrency paradigm for system languages, which is why it is rejected as the core paradigm for concurrency in \CFA.
 
 One of the most natural, elegant, and efficient mechanisms for mutual exclusion and synchronization for shared-memory systems is the \emph{monitor}.
@@ -1244,5 +1246,5 @@
 higher-level mechanisms often simplify usage by adding better coupling between synchronization and data, \eg message passing, or offering a simpler solution to otherwise involved challenges, \eg barrier lock.
 Often synchronization is used to order access to a critical section, \eg ensuring a reader thread is the next kind of thread to enter a critical section.
-If a writer thread is scheduled for next access, but another reader thread acquires the critical section first, that reader has \newterm{barged}.
+If a writer thread is scheduled for next access, but another reader thread acquires the critical section first, that reader \newterm{barged}.
 Barging can result in staleness/freshness problems, where a reader barges ahead of a writer and reads temporally stale data, or a writer barges ahead of another writer overwriting data with a fresh value preventing the previous value from ever being read (lost computation).
 Preventing or detecting barging is an involved challenge with low-level locks, which can be made much easier by higher-level constructs.
@@ -1314,5 +1316,5 @@
 \end{cfa}
 
-Mandatory monitor qualifiers have the benefit of being self-documenting, but requiring both @mutex@ and \lstinline[morekeywords=nomutex]@nomutex@ for all monitor parameter is redundant.
+The benefit of mandatory monitor qualifiers is self-documentation, but requiring both @mutex@ and \lstinline[morekeywords=nomutex]@nomutex@ for all monitor parameter is redundant.
 Instead, one of qualifier semantics can be the default, and the other required.
 For example, assume the safe @mutex@ qualifier for all monitor parameters because assuming \lstinline[morekeywords=nomutex]@nomutex@ may cause subtle errors.
@@ -1340,5 +1342,5 @@
 
 To make the issue tractable, \CFA only acquires one monitor per parameter with at most one level of indirection.
-However, the C type-system has an ambiguity with respects to arrays.
+However, there is an ambiguity in the C type-system with respects to arrays.
 Is the argument for @f2@ a single object or an array of objects?
 If it is an array, only the first element of the array is acquired, which seems unsafe;
@@ -1355,5 +1357,5 @@
 
 For object-oriented monitors, calling a mutex member \emph{implicitly} acquires mutual exclusion of the receiver object, @`rec`.foo(...)@.
-\CFA has no receiver, and hence, must use an explicit mechanism to specify which object has mutual exclusion acquired.
+\CFA has no receiver, and hence, must use an explicit mechanism to specify which object acquires mutual exclusion.
 A positive consequence of this design decision is the ability to support multi-monitor routines.
 \begin{cfa}
@@ -1387,9 +1389,9 @@
 While \CFA provides only a partial solution, the \CFA partial solution handles many useful cases.
 \begin{cfa}
-monitor Bank { ... };
-void deposit( Bank & `mutex` b, int deposit );
-void transfer( Bank & `mutex` mybank, Bank & `mutex` yourbank, int me2you) {
-	deposit( mybank, `-`me2you );			$\C{// debit}$
-	deposit( yourbank, me2you );			$\C{// credit}$
+monitor BankAccount { ... };
+void deposit( BankAccount & `mutex` b, int deposit );
+void transfer( BankAccount & `mutex` my, BankAccount & `mutex` your, int me2you ) {
+	deposit( my, `-`me2you );				$\C{// debit}$
+	deposit( your, me2you );				$\C{// credit}$
 }
 \end{cfa}
@@ -1398,5 +1400,6 @@
 
 
-\subsection{\protect\lstinline|mutex| statement} \label{mutex-stmt}
+\subsection{\protect\lstinline@mutex@ statement}
+\label{mutex-stmt}
 
 The monitor call-semantics associate all locking semantics to routines.
@@ -1525,5 +1528,5 @@
 \end{figure}
 
-Figure~\ref{f:BBExt} shows a \CFA generic bounded-buffer with external scheduling, where producers/consumers detecting a full/empty buffer block and prevent more producers/consumers from entering the monitor until the buffer has a free/empty slot.
+Figure~\ref{f:BBExt} shows a \CFA generic bounded-buffer with external scheduling, where producers/consumers detecting a full/empty buffer block and prevent more producers/consumers from entering the monitor until there is a free/empty slot in the buffer.
 External scheduling is controlled by the @waitfor@ statement, which atomically blocks the calling thread, releases the monitor lock, and restricts the routine calls that can next acquire mutual exclusion.
 If the buffer is full, only calls to @remove@ can acquire the buffer, and if the buffer is empty, only calls to @insert@ can acquire the buffer.
@@ -1646,5 +1649,5 @@
 }
 \end{cfa}
-must have acquired monitor locks that are greater than or equal to the number of locks for the waiting thread signalled from the condition queue.
+must acquire a set of monitor locks greater than or equal to the number of locks for the waiting thread signalled from the condition queue.
 
 Similarly, for @waitfor( rtn )@, the default semantics is to atomically block the acceptor and release all acquired mutex types in the parameter list, \ie @waitfor( rtn, m1, m2 )@.
@@ -1653,11 +1656,11 @@
 To statically verify the released monitors match with the accepted routine's mutex parameters, the routine (pointer) prototype must be accessible.
 
-When an overloaded routine appears in an @waitfor@ statement, calls to any routine with that name are accepted.
-The rationale is that members with the same name should perform a similar function, and therefore, all should be eligible to accept a call.
+% When an overloaded routine appears in an @waitfor@ statement, calls to any routine with that name are accepted.
+% The rationale is that members with the same name should perform a similar function, and therefore, all should be eligible to accept a call.
 As always, overloaded routines can be disambiguated using a cast:
 \begin{cfa}
 void rtn( M & mutex m );
 `int` rtn( M & mutex m );
-waitfor( (`int` (*)( M & mutex ))rtn, m1, m2 );
+waitfor( (`int` (*)( M & mutex ))rtn, m );
 \end{cfa}
 
@@ -1681,5 +1684,5 @@
 For example, there are no loops in either bounded buffer solution in Figure~\ref{f:GenericBoundedBuffer}.
 Supporting barging prevention as well as extending internal scheduling to multiple monitors is the main source of complexity in the design and implementation of \CFA concurrency.
-Furthermore, \CFA concurrency has no superious wakeup~\cite[\S~9]{Buhr05a}, which eliminates an implict form of barging.
+Furthermore, there is no spurious wakeup~\cite[\S~9]{Buhr05a} in \CFA, which eliminates an implict form of barging.
 
 
@@ -1753,6 +1756,6 @@
 
 One scheduling solution is for the signaller to keep ownership of all locks until the last lock is ready to be transferred, because this semantics fits most closely to the behaviour of single-monitor scheduling.
-However, Figure~\ref{f:OtherWaitingThread} shows this solution is complex depending on other waiters, resulting is choices when the signaller finishes the inner mutex-statement.
-The singaller can retain @m2@ until completion of the outer mutex statement and pass the locks to waiter W1, or it can pass @m2@ to waiter W2 after completing the inner mutex-statement, while continuing to hold @m1@.
+However, Figure~\ref{f:OtherWaitingThread} shows this solution is complex depending on other waiters, resulting in options when the signaller finishes the inner mutex-statement.
+The signaller can retain @m2@ until completion of the outer mutex statement and pass the locks to waiter W1, or it can pass @m2@ to waiter W2 after completing the inner mutex-statement, while continuing to hold @m1@.
 In the latter case, waiter W2 must eventually pass @m2@ to waiter W1, which is complex because W1 may have waited before W2, so W2 is unaware of it.
 Furthermore, there is an execution sequence where the signaller always finds waiter W2, and hence, waiter W1 starves.
@@ -1762,5 +1765,5 @@
 Partial signalling transfers ownership of monitors to the front waiter.
 When the signaller thread exits or waits in the monitor the front waiter is unblocked if all its monitors are released.
-This solution has the benefit that complexity is encapsulated into only two actions: passing monitors to the next owner when they should be released and conditionally waking threads if all conditions are met.
+The benefit of this solution is encapsulating complexity into only two actions: passing monitors to the next owner when they should be released and conditionally waking threads if all conditions are met.
 
 
@@ -1829,5 +1832,5 @@
 	waitfor( f, m2 );						$\C{\color{red}// wait for call to f with argument m2}$
 \end{cfa}
-Routine @g@ has acquired both locks, so when routine @f@ is called, the lock for monitor @m2@ is passed from @g@ to @f@, while @g@ still holds lock @m1@.
+Both locks are acquired by routine @g@, so when routine @f@ is called, the lock for monitor @m2@ is passed from @g@ to @f@, while @g@ still holds lock @m1@.
 This behaviour can be extended to the multi-monitor @waitfor@ statement.
 \begin{cfa}
@@ -1925,5 +1928,5 @@
 When the buffer is deallocated, the current waiter is unblocked and informed, so it can perform an appropriate action.
 However, the basic @waitfor@ semantics do not support this functionality, since using an object after its destructor is called is undefined.
-Therefore, to make this useful capability work, the semantics for accepting the destructor is the same as @signal@, \ie the call to the destructor is placed on the urgent queue and the acceptor continues execution, which throws an exception to the acceptor and then the caller is unbloced from the urgent queue to deallocate the object.
+Therefore, to make this useful capability work, the semantics for accepting the destructor is the same as @signal@, \ie the call to the destructor is placed on the urgent queue and the acceptor continues execution, which throws an exception to the acceptor and then the caller is unblocked from the urgent queue to deallocate the object.
 Accepting the destructor is an idiomatic way to terminate a thread in \CFA.
 
@@ -1933,10 +1936,5 @@
 Threads in \CFA are monitors to allow direct communication among threads, \ie threads can have mutex routines that are called by other threads.
 Hence, all monitor features are available when using threads.
-Figure~\ref{f:pingpong} shows an example of two threads directly calling each other and accepting calls from each other in a cycle.
-Note, both ping/pong threads are globally declared, @pi@/@po@, and hence, start (and possibly complete) before the program main starts.
-
-\begin{figure}
-\lstDeleteShortInline@%
-\begin{cquote}
+The following shows an example of two threads directly calling each other and accepting calls from each other in a cycle.
 \begin{cfa}
 thread Ping {} pi;
@@ -1946,4 +1944,6 @@
 int main() {}
 \end{cfa}
+\vspace{-0.8\baselineskip}
+\begin{cquote}
 \begin{tabular}{@{}l@{\hspace{3\parindentlnth}}l@{}}
 \begin{cfa}
@@ -1965,14 +1965,21 @@
 \end{cfa}
 \end{tabular}
-\lstMakeShortInline@%
 \end{cquote}
-\caption{Threads ping/pong using external scheduling}
-\label{f:pingpong}
-\end{figure}
+% \lstMakeShortInline@%
+% \caption{Threads ping/pong using external scheduling}
+% \label{f:pingpong}
+% \end{figure}
+Note, the ping/pong threads are globally declared, @pi@/@po@, and hence, start (and possibly complete) before the program main starts.
+
+
+\subsection{Low-level Locks}
+
+For completeness and efficiency, \CFA provides a standard set of low-level locks: recursive mutex, condition, semaphore, barrier, \etc, and atomic instructions: @fetchAssign@, @fetchAdd@, @testSet@, @compareSet@, \etc.
+
 
 \section{Parallelism}
 
 Historically, computer performance was about processor speeds.
-However, with heat dissipation being a direct consequence of speed increase, parallelism has become the new source for increased performance~\cite{Sutter05, Sutter05b}.
+However, with heat dissipation being a direct consequence of speed increase, parallelism is the new source for increased performance~\cite{Sutter05, Sutter05b}.
 Now, high-performance applications must care about parallelism, which requires concurrency.
 The lowest-level approach of parallelism is to use \newterm{kernel threads} in combination with semantics like @fork@, @join@, \etc.
@@ -2000,11 +2007,10 @@
 \subsection{Thread Pools}
 
-In contrast to direct threading is indirect \newterm{thread pools}, where small jobs (work units) are insert into a work pool for execution.
+In contrast to direct threading is indirect \newterm{thread pools}, where small jobs (work units) are inserted into a work pool for execution.
 If the jobs are dependent, \ie interact, there is an implicit/explicit dependency graph that ties them together.
 While removing direct concurrency, and hence the amount of context switching, thread pools significantly limit the interaction that can occur among jobs.
-Indeed, jobs should not block because that also block the underlying thread, which effectively means the CPU utilization, and therefore throughput, suffers.
+Indeed, jobs should not block because that also blocks the underlying thread, which effectively means the CPU utilization, and therefore throughput, suffers.
 While it is possible to tune the thread pool with sufficient threads, it becomes difficult to obtain high throughput and good core utilization as job interaction increases.
 As well, concurrency errors return, which threads pools are suppose to mitigate.
-Intel's TBB library~\cite{TBB} is the gold standard for thread pools.
 
 
@@ -2036,5 +2042,5 @@
 The user cluster is created to contain the application user-threads.
 Having all threads execute on the one cluster often maximizes utilization of processors, which minimizes runtime.
-However, because of limitations of the underlying operating system, heterogeneous hardware, or scheduling requirements (real-time), it is sometimes necessary to have multiple clusters.
+However, because of limitations of the underlying operating system, heterogeneous hardware, or scheduling requirements (real-time), multiple clusters are sometimes necessary.
 
 
@@ -2074,5 +2080,5 @@
 This storage is allocated at the base of a thread's stack before blocking, which means programmers must add a small amount of extra space for stacks.
 
-In \CFA, ordering of monitor acquisition relies on memory ordering to prevent deadlock~\cite{Havender68}, because all objects are guaranteed to have distinct non-overlapping memory layouts, and mutual-exclusion for a monitor is only defined for its lifetime.
+In \CFA, ordering of monitor acquisition relies on memory ordering to prevent deadlock~\cite{Havender68}, because all objects have distinct non-overlapping memory layouts, and mutual-exclusion for a monitor is only defined for its lifetime.
 When a mutex call is made, pointers to the concerned monitors are aggregated into a variable-length array and sorted.
 This array persists for the entire duration of the mutual-exclusion and its ordering reused extensively.
@@ -2085,5 +2091,5 @@
 This method is a 2-step context-switch and provides a clear distinction between user and kernel code, where scheduling and other system operations happen.
 The alternative 1-step context-switch uses the \emph{from} thread's stack to schedule and then context-switches directly to the \emph{to} thread's stack.
-Experimental results (not presented) show the performance difference between these two approaches is virtually equivalent, because the 1-step performance is dominated by a lock instruction to prevent a race condition.
+Experimental results (not presented) show the performance difference between these two approaches is virtually equivalent, because both approaches are dominated by locking to prevent a race condition.
 
 All kernel threads (@pthreads@) created a stack.
@@ -2097,7 +2103,7 @@
 When the timer expires, an interrupt is delivered, and the interrupt handler resets the count-down timer, and if the virtual processor is executing in user code, the signal handler performs a user-level context-switch, or if executing in the language runtime-kernel, the preemption is ignored or rolled forward to the point where the runtime kernel context switches back to user code.
 Multiple signal handlers may be pending.
-When control eventually switches back to the signal handler, it returns normally, and execution continues in the interrupted user thread, even though the return from the signal handler may be on a different kernel thread than the one where the signal was delivered.
+When control eventually switches back to the signal handler, it returns normally, and execution continues in the interrupted user thread, even though the return from the signal handler may be on a different kernel thread than the one where the signal is delivered.
 The only issue with this approach is that signal masks from one kernel thread may be restored on another as part of returning from the signal handler;
-therefore, all virtual processors in a cluster need to have the same signal mask.
+therefore, the same signal mask is required for all virtual processors in a cluster.
 
 However, on current UNIX systems:
@@ -2277,4 +2283,5 @@
 Figure~\ref{f:int-sched} shows the code for \CFA, with results in Table~\ref{tab:int-sched}.
 Note, the incremental cost of bulk acquire for \CFA, which is largely a fixed cost for small numbers of mutex objects.
+Java scheduling is significantly greater because the benchmark explicitly creates multiple thread in order to prevent the JIT from making the program sequential, \ie removing all locking.
 
 \begin{figure}
@@ -2439,5 +2446,5 @@
 However, no single scheduler is optimal for all workloads and therefore there is value in being able to change the scheduler for given programs.
 One solution is to offer various tweaking options, allowing the scheduler to be adjusted to the requirements of the workload.
-However, to be truly flexible, it is necessary to have a pluggable scheduler.
+However, to be truly flexible, a pluggable scheduler is necessary.
 Currently, the \CFA pluggable scheduler is too simple to handle complex scheduling, \eg quality of service and real-time, where the scheduler must interact with mutex objects to deal with issues like priority inversion.
 
@@ -2449,5 +2456,5 @@
 At its core, non-blocking I/O is an operating-system level feature queuing IO operations, \eg network operations, and registering for notifications instead of waiting for requests to complete.
 Current trends use asynchronous programming like callbacks, futures, and/or promises, \eg Node.js~\cite{NodeJs} for JavaScript, Spring MVC~\cite{SpringMVC} for Java, and Django~\cite{Django} for Python.
-However, these solutions lead to code that is hard create, read and maintain.
+However, these solutions lead to code that is hard to create, read and maintain.
 A better approach is to tie non-blocking I/O into the concurrency system to provide ease of use with low overhead, \eg thread-per-connection web-services.
 A non-blocking I/O library is currently under development for \CFA.
@@ -2459,4 +2466,5 @@
 Examples of such tools can include futures and promises~\cite{promises}, executors and actors.
 These additional features are useful when monitors offer a level of abstraction that is inadequate for certain tasks.
+As well, new \CFA extensions should make it possible to create a uniform interface for virtually all mutual exclusion, including monitors and low-level locks.
 
 \paragraph{Implicit Threading}
@@ -2467,5 +2475,5 @@
 The canonical example of implicit concurrency is concurrent nested @for@ loops, which are amenable to divide and conquer algorithms~\cite{uC++book}.
 The \CFA language features should make it possible to develop a reasonable number of implicit concurrency mechanism to solve basic HPC data-concurrency problems.
-However, implicit concurrency is a restrictive solution and has its limitations, so it can never replace explicit concurrent programming.
+However, implicit concurrency is a restrictive solution with significant limitations, so it can never replace explicit concurrent programming.
 
 
