From f7207fbf6086300565ee3f30c220fd37a891eb4e Mon Sep 17 00:00:00 2001 From: Peizhao Ou Date: Fri, 10 Apr 2015 11:02:05 -0700 Subject: [PATCH 1/1] changes --- correctness-model/note.txt | 0 .../writeup/.#implementation.tex.1.9 | 163 ++ .../writeup/.#introduction.tex.1.24 | 222 +++ .../writeup/.#introduction.tex.1.26 | 223 +++ .../writeup/.#memorymodel.tex.1.1 | 101 + .../writeup/.#specification.tex.1.47 | 419 +++++ correctness-model/writeup/CVS/Entries | 19 + correctness-model/writeup/CVS/Repository | 1 + correctness-model/writeup/CVS/Root | 1 + correctness-model/writeup/abstract.tex | 19 + correctness-model/writeup/conclusion.tex | 11 + correctness-model/writeup/confstrs-abbrv.bib | 173 ++ correctness-model/writeup/confstrs-long.bib | 180 ++ correctness-model/writeup/evaluation.tex | 304 +++ correctness-model/writeup/example.tex | 165 ++ correctness-model/writeup/figures/CVS/Entries | 42 + .../writeup/figures/CVS/Repository | 1 + correctness-model/writeup/figures/CVS/Root | 1 + .../writeup/figures/fence_sw.dot | 20 + .../writeup/figures/fence_sw2.dot | 14 + .../writeup/figures/fence_sw_r_collapse.dot | 18 + .../writeup/figures/fence_sw_r_collapse2.dot | 14 + .../writeup/figures/fence_sw_w_collapse.dot | 18 + .../writeup/figures/fence_sw_w_collapse2.dot | 14 + .../writeup/figures/ff_sc_rf.dot | 18 + .../writeup/figures/ff_sc_rf2.dot | 18 + .../writeup/figures/fw_sc_rf.dot | 16 + .../writeup/figures/fw_sc_rf2.dot | 16 + .../writeup/figures/lockhistory.pdf | Bin 0 -> 19791 bytes .../writeup/figures/rcuhistory.odg | Bin 0 -> 14994 bytes .../writeup/figures/rcuhistory.pdf | Bin 0 -> 20096 bytes .../writeup/figures/release_seq.pdf | 344 ++++ .../writeup/figures/rmw_atomicity.dot | 12 + .../writeup/figures/rmw_atomicity2.dot | 13 + correctness-model/writeup/figures/rmw_mo.dot | 9 + correctness-model/writeup/figures/rmw_mo2.dot | 8 + correctness-model/writeup/figures/rr_mo.dot | 13 + correctness-model/writeup/figures/rr_mo2.dot | 8 + correctness-model/writeup/figures/rw_mo.dot | 11 + correctness-model/writeup/figures/rw_mo2.dot | 12 + correctness-model/writeup/figures/sc_mo.dot | 9 + correctness-model/writeup/figures/sc_mo2.dot | 8 + .../writeup/figures/sc_wr_mo.dot | 13 + .../writeup/figures/sc_wr_mo2.dot | 13 + .../writeup/figures/specdesign.pdf | Bin 0 -> 22332 bytes .../writeup/figures/specworkflow.pdf | Bin 0 -> 14072 bytes .../writeup/figures/wf_sc_rf.dot | 16 + .../writeup/figures/wf_sc_rf2.dot | 16 + .../writeup/figures/workflow.pdf | Bin 0 -> 16034 bytes correctness-model/writeup/figures/wr_mo.dot | 13 + correctness-model/writeup/figures/wr_mo2.dot | 13 + correctness-model/writeup/figures/ww_mo.dot | 9 + correctness-model/writeup/figures/ww_mo2.dot | 8 + .../figures/ww_sc_fence_first_collapse.dot | 17 + .../figures/ww_sc_fence_first_collapse2.dot | 14 + .../writeup/figures/ww_sc_fence_mo.dot | 18 + .../writeup/figures/ww_sc_fence_mo2.dot | 14 + .../figures/ww_sc_fence_second_collapse.dot | 17 + .../figures/ww_sc_fence_second_collapse2.dot | 14 + correctness-model/writeup/formalization.tex | 92 + correctness-model/writeup/implementation.tex | 151 ++ correctness-model/writeup/introduction.tex | 226 +++ .../writeup/issta15_submission.pdf | Bin 0 -> 259914 bytes correctness-model/writeup/makefile | 94 + correctness-model/writeup/memorymodel.tex | 102 + correctness-model/writeup/paper.aux | 75 + correctness-model/writeup/paper.bbl | 84 + correctness-model/writeup/paper.bib | 774 ++++++++ correctness-model/writeup/paper.blg | 50 + correctness-model/writeup/paper.log | 661 +++++++ correctness-model/writeup/paper.pdf | Bin 0 -> 147616 bytes correctness-model/writeup/paper.tex | 182 ++ correctness-model/writeup/related.tex | 133 ++ correctness-model/writeup/sig-alternate.cls | 1649 +++++++++++++++++ correctness-model/writeup/speccfg.tex | 17 + correctness-model/writeup/specification.tex | 416 +++++ correctness-model/writeup/spell.lst | 99 + correctness-model/writeup/technical.tex | 1 + 78 files changed, 7659 insertions(+) create mode 100644 correctness-model/note.txt create mode 100644 correctness-model/writeup/.#implementation.tex.1.9 create mode 100644 correctness-model/writeup/.#introduction.tex.1.24 create mode 100644 correctness-model/writeup/.#introduction.tex.1.26 create mode 100644 correctness-model/writeup/.#memorymodel.tex.1.1 create mode 100644 correctness-model/writeup/.#specification.tex.1.47 create mode 100644 correctness-model/writeup/CVS/Entries create mode 100644 correctness-model/writeup/CVS/Repository create mode 100644 correctness-model/writeup/CVS/Root create mode 100644 correctness-model/writeup/abstract.tex create mode 100644 correctness-model/writeup/conclusion.tex create mode 100644 correctness-model/writeup/confstrs-abbrv.bib create mode 100644 correctness-model/writeup/confstrs-long.bib create mode 100644 correctness-model/writeup/evaluation.tex create mode 100644 correctness-model/writeup/example.tex create mode 100644 correctness-model/writeup/figures/CVS/Entries create mode 100644 correctness-model/writeup/figures/CVS/Repository create mode 100644 correctness-model/writeup/figures/CVS/Root create mode 100644 correctness-model/writeup/figures/fence_sw.dot create mode 100644 correctness-model/writeup/figures/fence_sw2.dot create mode 100644 correctness-model/writeup/figures/fence_sw_r_collapse.dot create mode 100644 correctness-model/writeup/figures/fence_sw_r_collapse2.dot create mode 100644 correctness-model/writeup/figures/fence_sw_w_collapse.dot create mode 100644 correctness-model/writeup/figures/fence_sw_w_collapse2.dot create mode 100644 correctness-model/writeup/figures/ff_sc_rf.dot create mode 100644 correctness-model/writeup/figures/ff_sc_rf2.dot create mode 100644 correctness-model/writeup/figures/fw_sc_rf.dot create mode 100644 correctness-model/writeup/figures/fw_sc_rf2.dot create mode 100644 correctness-model/writeup/figures/lockhistory.pdf create mode 100644 correctness-model/writeup/figures/rcuhistory.odg create mode 100644 correctness-model/writeup/figures/rcuhistory.pdf create mode 100644 correctness-model/writeup/figures/release_seq.pdf create mode 100644 correctness-model/writeup/figures/rmw_atomicity.dot create mode 100644 correctness-model/writeup/figures/rmw_atomicity2.dot create mode 100644 correctness-model/writeup/figures/rmw_mo.dot create mode 100644 correctness-model/writeup/figures/rmw_mo2.dot create mode 100644 correctness-model/writeup/figures/rr_mo.dot create mode 100644 correctness-model/writeup/figures/rr_mo2.dot create mode 100644 correctness-model/writeup/figures/rw_mo.dot create mode 100644 correctness-model/writeup/figures/rw_mo2.dot create mode 100644 correctness-model/writeup/figures/sc_mo.dot create mode 100644 correctness-model/writeup/figures/sc_mo2.dot create mode 100644 correctness-model/writeup/figures/sc_wr_mo.dot create mode 100644 correctness-model/writeup/figures/sc_wr_mo2.dot create mode 100644 correctness-model/writeup/figures/specdesign.pdf create mode 100644 correctness-model/writeup/figures/specworkflow.pdf create mode 100644 correctness-model/writeup/figures/wf_sc_rf.dot create mode 100644 correctness-model/writeup/figures/wf_sc_rf2.dot create mode 100644 correctness-model/writeup/figures/workflow.pdf create mode 100644 correctness-model/writeup/figures/wr_mo.dot create mode 100644 correctness-model/writeup/figures/wr_mo2.dot create mode 100644 correctness-model/writeup/figures/ww_mo.dot create mode 100644 correctness-model/writeup/figures/ww_mo2.dot create mode 100644 correctness-model/writeup/figures/ww_sc_fence_first_collapse.dot create mode 100644 correctness-model/writeup/figures/ww_sc_fence_first_collapse2.dot create mode 100644 correctness-model/writeup/figures/ww_sc_fence_mo.dot create mode 100644 correctness-model/writeup/figures/ww_sc_fence_mo2.dot create mode 100644 correctness-model/writeup/figures/ww_sc_fence_second_collapse.dot create mode 100644 correctness-model/writeup/figures/ww_sc_fence_second_collapse2.dot create mode 100644 correctness-model/writeup/formalization.tex create mode 100644 correctness-model/writeup/implementation.tex create mode 100644 correctness-model/writeup/introduction.tex create mode 100644 correctness-model/writeup/issta15_submission.pdf create mode 100644 correctness-model/writeup/makefile create mode 100644 correctness-model/writeup/memorymodel.tex create mode 100644 correctness-model/writeup/paper.aux create mode 100644 correctness-model/writeup/paper.bbl create mode 100644 correctness-model/writeup/paper.bib create mode 100644 correctness-model/writeup/paper.blg create mode 100644 correctness-model/writeup/paper.log create mode 100644 correctness-model/writeup/paper.pdf create mode 100644 correctness-model/writeup/paper.tex create mode 100644 correctness-model/writeup/related.tex create mode 100644 correctness-model/writeup/sig-alternate.cls create mode 100644 correctness-model/writeup/speccfg.tex create mode 100644 correctness-model/writeup/specification.tex create mode 100644 correctness-model/writeup/spell.lst create mode 100644 correctness-model/writeup/technical.tex diff --git a/correctness-model/note.txt b/correctness-model/note.txt new file mode 100644 index 0000000..e69de29 diff --git a/correctness-model/writeup/.#implementation.tex.1.9 b/correctness-model/writeup/.#implementation.tex.1.9 new file mode 100644 index 0000000..a741b61 --- /dev/null +++ b/correctness-model/writeup/.#implementation.tex.1.9 @@ -0,0 +1,163 @@ +\mysection{Implementation}\label{sec:implementation} + +The goal of the \TOOL specification language is to +enable developers to write specifications against which concurrent data structures can be tested. +We can ensure a concurrent data structure is correct with +respect to an equivalent sequential data structure if for each +execution of the concurrent data structure, the equivalent sequential +history for the equivalent sequential data structure yields the same +results. + +The execution space for many concurrent data +structures is unbounded, meaning that in practice we cannot +verify correctness by checking individual executions. However, the +specifications can be used for unit testing. In practice, +many bugs can be exposed by model checking unit tests for +concurrent data structures. We have implemented the \TOOL checker as a +unit testing tool built upon the \cdschecker framework. The \TOOL checker +can exhaustively explore all behaviors for unit tests and provide +developers with diagnostic reports for executions that violate their +specification. + + +\mysubsection{Model Checker Framework} + +The \TOOL checker takes as input a complete execution trace from the +\cdschecker model checker. The \cdschecker framework operates at the abstraction level of +individual atomic operations and thus has neither information about method +calls nor which atomic operations serve as ordering points. Thus, we +extend the framework by adding {\it annotation} operations to +\cdschecker's traces, which record the necessary information to check the specifications +but have no effect on other operations. The \TOOL compiler +inserts code to generate the annotation actions to communicate to the \TOOL checker +plugin the critical events for checking the \TOOL specification. +These annotation actions then appear in \cdschecker's list of atomic +operations and make it convenient for \TOOL to construct +a sequential history from the execution because for any given method +call, its invocation event, its ordering points, and its response event are +sequentially ordered in the list. + +\mysubsection{Specification Compiler} + +The specification compiler translates an annotated +C/C++ program into an instrumented C/C++ program that will generate +execution traces containing the dynamic information needed to check +assertions and construct the sequential history. We next +describe the type of annotation actions that the \TOOL compiler +inserts into the instrumented program. + +\mypara{\bf Ordering Points:} Ordering points have a conditional guard expression +and a label. Potential ordering point annotation actions are +inserted immediately after the atomic operation that serves as +the potential ordering point. Ordering point check annotation actions are +inserted where they appear. + +\mypara{\bf Method Boundary:} To identify a method's boundaries, \TOOL +inserts {\it method\_begin} and {\it method\_end} annotations at the +beginning and end of methods. + +\mypara{\bf Sequential States and Methods:} Since checking occurs +after \cdschecker has completed an execution, the annotation +actions stores the values of any variables in the concurrent data +structure that the annotations reference. + +\mypara{\bf Side Effects and Assertions:} Side effects and assertions perform +their checks after an execution. The side effects and assertions are compiled +into methods and the equivalent sequential data structure's states are accessible to these methods. +With this encapsulation, +the \TOOL checker simply calls these functions to implement the side effects and assertions. + +\mypara{\bf Synchronization Checks:} The \TOOL checker performs +synchronization checks in two parts: compiling the rules and runtime data +collection. First, the \TOOL compiler numbers all methods and happens-before +checks uniquely. For example, the rule ``\code{Update->Read}'' can be represented as (1, 0, 2, 0), +which means instances of method 1 that satisfy condition 0 should {\it + synchronize with} instances method 2 that satisfy condition 0. In this case, + condition 0 means \code{true}. Then, +the \TOOL compiler generates code that communicates the +synchronization rules by passing an array of integer pairs. Runtime +collection is then implemented by performing the condition check at +each method invocation or response and then passing the method number +and happens before condition if the check is satisfied. + +\mysubsection{Dynamic Checking} + +At this point, we have an execution trace with the necessary +annotations to construct a sequential history and to check +the execution's correctness. However, before constructing the +sequential history, the \TOOL plugin first collects +the necessary information for each method call, which is the {\it + method\_begin} annotation, the ordering point annotations, the +happens-before checks, and the {\it method\_end} annotations. Since +all of the operations in the trace have thread +identifiers it is straightforward to extract the operations between the {\it + method\_begin} and {\it method\_end} annotations. + +\mypara{\bf Reorder Method Calls:} As discussed above, determining the +ordering of the ordering points is non-trivial under the +C/C++ memory model. This can be complicated by the fact +that the C/C++ memory model allows atomic loads to read from atomic +stores that appear later in the trace and that we do not maintain program order in our +correctness model. + +However, we can still leverage the reads-from relation and the modification-order +relation to order the ordering points that appear in typical data +structures. \TOOL uses the following rules to generate an ordering-point +ordering $\reltext{opo}$ relation on ordering points. Given two operations $X$ and $Y$ that are both ordering points: + +\begin{enumerate} +\item {\bf Reads-From:} $X \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-write):} $X \xrightarrow{mo} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-write):} $A \xrightarrow{mo} Y \ \wedge \ A \xrightarrow{rf} X \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-read):} $X \xrightarrow{mo} B \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-read):} $A \xrightarrow{mo} B \ \wedge \ A \xrightarrow{rf} X \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\end{enumerate} + +\mypara{\bf Generating the Reordering:} +The \TOOL checker first builds an execution graph where the nodes are +method calls and the edges represent the +$\reltext{opo}$ ordering of the ordering points of the methods that +correspond to the source and destination nodes. Assuming the absence +of cycles in the execution graph, +the $\reltext{opo}$ ordering is used to generate the sequential history. +If two methods are not ordered by the +$\reltext{opo}$ order, we assume that they commute and select an +arbitrary ordering for the methods. The \TOOL checker +topologically sorts the graph to generate the equivalent sequential +execution. + +When \TOOL fails to order ordering points, the operations often commute. Thus, +if multiple histories satisfy the constraints of \reltext{opo}, we generally +pick a random one for most data structures. However, when those operations +do not commute, we provide developers with different options: (1) they can +add additional ordering points to allow \TOOL to order the two nodes or +(2) they run \TOOL in either of the following modes: (a) \textit{loosely +exhaustive} mode --- \TOOL explores +all possible histories and only requires some history to be correct or +(b) \textit{strictly exhaustive} mode --- \TOOL explores all possible histories and requires all histories to +be correct. With these options, developers are able to balance the +tradeoff between specifying more ordering points and the searching +space. For example, for a single producer single +consumer queue based on a linked-list (maintaing \code{head} and \code{tail} pointer), if we only +specify the update and load of the next field of a linked-list node as ordering points for +\code{enqueue} and \code{dequeue}, \TOOL will fail to order a dequeue +returning \code{NULL} and another enqueue because dequeue does not have the +ordering point of loading the next field. In this case, developers can either +add extra ordering points to order the dequeue before the enqueue or simply run it in the +\textit{loosely exhaustive} mode and that mode will produce at least one correct +history. + +\mypara{\bf Check Synchronization Properties:} Synchronization properties are +specified using the IDs and conditions of method calls, and we have that information +ready after \TOOL constructs the sequential history and checks the preconditions +and postconditions. For two specific method calls $c_1$ and $c_2$, we can ensure +$c_1$ synchronizes with $c_2$ by ensuring the annotation \code{c1\_begin} +happens-before the annotation \code{c2\_end} because any operations +sequenced-before \code{c1\_begin} should happen-before any operations +sequenced-after \code{c2\_end} according to the C/C++11 memory model. + diff --git a/correctness-model/writeup/.#introduction.tex.1.24 b/correctness-model/writeup/.#introduction.tex.1.24 new file mode 100644 index 0000000..02c4ff7 --- /dev/null +++ b/correctness-model/writeup/.#introduction.tex.1.24 @@ -0,0 +1,222 @@ +\mysection{Introduction}\label{sec:introduction} + +Concurrent data structure design can improve scalability by supporting +multiple simultaneous operations, reducing memory coherence traffic, and reducing the time taken by an +individual data structure operation. Researchers have developed many concurrent +data structure designs with these goals~\cite{rcu, +lockfreequeue}. Concurrent data structures often use sophisticated techniques +including low-level atomic instructions (e.g., compare and +swap), careful reasoning about the order of loads and +stores, and fine-grained locking. For example, while the standard Java hash +table implementation can limit scalability to a handful of cores, +more sophisticated concurrent hash tables can scale to many hundreds of +cores~\cite{javaConcurrentHashMap}. + +The C/C++ standard committee extended the C and C++ languages with +support for low-level atomic operations in the C/C++11 +standard~\cite{cpp11spec, c11spec, boehmpldi} to enable developers to +write portable implementations of concurrent data structures. To support the relaxations typically performed by compilers and processors, +the +C/C++ memory model provides weaker semantics than sequential +consistency~\cite{scmemorymodel} and as a result, correctly using +these operations is challenging. Developers must not only +reason about potential interleavings, but also about how the processor +and compiler might reorder memory operations. Even experts make +subtle errors when reasoning about such memory models. + +Researchers have developed tools for exploring the behavior of code +under the C/C++ model including \cdschecker~\cite{cdschecker}, {\sc +Cppmem}~\cite{c11popl}, and Relacy~\cite{relacy}. These tools explore +behaviors that are allowed under the C/C++ memory model. While these +tools can certainly be useful for exploring executions, they can be +challenging to use for testing as they don't provide support (other +than assertions) for specifying the behavior of data structures. +Using assertions can be challenging as different interleavings or +reorderings legitimately produce different behaviors, and it can be +very difficult to code assertions to check the output of a test case under for an +arbitrary (unknown) execution. + +This paper presents \TOOL, a specification language and specification +checking tool that is designed to be used in conjunction with model +checking tools. We have implemented it as a plugin for +the \cdschecker model checker. + +\mysubsection{Background on Linearizability} + +Researchers have developed several techniques for specifying +correctness properties of concurrent data structures written for strong memory +models. While these techniques cannot handle the behaviors typically +exhibited by relaxed data structure implementations, they provide insight into +intuitive approaches to specifying concurrent data structure behavior. + +One approach for specifying the correctness of concurrent data +structures is in terms of equivalent sequential executions of either +the concurrent data structure or a simplified sequential version. The +problem then becomes how do we map a concurrent execution to an equivalent +sequential execution? A common criterion is {\it + linearizability} --- linearizability simply states that a concurrent +operation can be viewed as taking effect at some time between its +invocation and its return (or response)~\cite{linearizableref}. + +An {\it equivalent sequential data structure} is a sequential version +of a concurrent data structure that can be used to express correctness +properties by relating executions of the original concurrent data +structure with executions of the equivalent sequential data structure. +The equivalent sequential data structure is often simpler and can in +many cases simply use existing well-tested implementations in the +STL library. + +An execution {\it history} is a total order of method invocations and +responses. A {\it sequential history} is one where all invocations are +followed by the corresponding responses immediately. A concurrent +execution is correct if its behavior is consistent with its equivalent +sequential history replayed on the equivalent sequential data +structure. A concurrent object is linearizable if for all executions: +\begin{enumerate} +\item Each method call appears to take effect instantaneously at some + point between its invocation and response. + +\item The invocations and responses can be reordered to yield a + sequential history under the rule that an invocation cannot be + reordered before the preceding responses. + +\item The concurrent execution yields the same behavior as + the sequential history. +\end{enumerate} + +A weaker variation of linearization is {\it sequential +consistency}\footnote{It is important to note that the term sequential +consistency in the literature is applied to both the consistency model +that data structures expose clients to as well as the guarantees that +the underlying memory system provides for load and store operations.}. +Sequential consistency only requires that there exist a sequential +history that is consistent with the {\it program order} (the intra-thread +order). This ordering does not need to be consistent with the order +that the operations were actually issued in. + +Line-Up~\cite{lineup}, Paraglider~\cite{VechevMCLinear}, and +VYRD~\cite{vyrd} that leverage linearizability to test concurrent data +structures. {\bf Unfortunately, efficient implementations of many +common data structures, e.g., RCU~\cite{rcu}, MS +Queue~\cite{lockfreequeue}, ..., for the C/C++ memory model are +neither linearizable nor sequentially consistent! Thus previous tools +cannot check such data structures under the C/C++ memory model.} + +\mysubsection{New Challenges from the C/C++ Memory Model} +\label{sec:introNewChallenges} + +The C/C++ memory model brings the following two key challenges that prevent the application of previous approaches to checking concurrent data structures to this setting: + +\squishcount +\item {\bf Relaxed Executions Break Existing Data Structure Consistency Models:} +C/C++ data structures often expose clients to weaker (non-SC) +behaviors to gain performance. A common guarantee is to provide +happens-before synchronization between operations that implement +updates and the operations that read those updates. These data +structures often do not guarantee that different threads observe updates in the +same order --- in other words the data structures may expose clients +to weaker consistency models than sequential consistency. For +example, even when one uses the relatively strong \code{acquire} +and \code{release} memory orderings in C++, it is possible for two +different threads to observe two stores happening in +different orders, i.e., executions can fail the IRIW test. +Thus many data structure legitimately admit executions for which there +are no sequential histories that preserve program order. + +Like many other relaxed memory models, the C/C++ memory model does +not include a total order over all memory operations, thus even +further complicating the application of traditional approaches to correctness, +e.g., linearization cannot be applied. In +particular the approaches that relate the behaviors of concurrent data +structures to analogous sequential data structures break down due to +the absence of a total ordering of the memory operations. While many +of the dynamic tools~\cite{cdschecker,relacy} for exploring the +behavior of code under relaxed models do as a practical matter +print out an execution in some order, this order is to some degree arbitrary as relaxed memory models +generally make it possible for a data structure operation to see the +effects of operations that appear later in any such an order (e.g., a load +can read from a store that appears later in the order). Instead of a total order, the C/C++ +memory model is formulated as a graph of memory operations +with several partial orders defined in this graph. + +\item {\bf Constraining Reorderings (Specifying Synchronization Properties):} +Synchronization\footnote{Synchronization here is not mutual exclusion, + but rather a lower-level property that captures which stores must be + visible to a thread. In other words, it constrains which + reorderings can be performed by a processor or compiler.} in C/C++ + provides an ordering between memory operations to different + locations. Concurrent data structures must establish + synchronization or they potentially expose their users to highly + non-intuitive behavior that is likely to break client code. For + example, consider the case of a concurrent queue that does not + establish synchronization between enqueue and dequeue operations. + If one thread initializes the fields of an object and then enqueues + a reference to that object in such a queue and a second thread + dequeues the reference and uses it to read the fields of that + object, the second thread could fail to see the initializing writes. + This surprising behavior could occur if the compiler or CPU could + reorder the initializing writes to be executed after the enqueue + operation. If the fields are non-atomic, such loads are considered + data races and violate the data race free requirement of the C/C++ + language standard and thus the program has no semantics. + +The C/C++ memory model formalizes synchronization in terms of a {\it + happens-before} relation. The C/C++ happens-before relationship +is a partial order over memory accesses. If memory access {\it x} +happens before memory access {\it y}, it means that the effects of +{\it x} must be ordered before the effects of {\it y}. +\countend + +\begin{figure} + \centering +\vspace{-.3cm} + \includegraphics[scale=0.35]{figures/specworkflow} +\vspace{-.4cm} + \caption{\label{fig:specworkflow} \TOOL system overview} +\vspace{-.4cm} +\end{figure} + +\mysubsection{Specification Language and Tool Support} + +Figure~\ref{fig:specworkflow} presents an overview of the \TOOL system. After +implementing a concurrent data structure, developers annotate their code +with a \TOOL specification. To test their implementation, +developers compile the data structure with the \TOOL specification +compiler to extract the specification and generate a program that is instrumented with specification checks. + Then, developers compile the instrumented program with a +standard C/C++ compiler. Finally, developers run the binary under +the \TOOL checker. \TOOL +then exhaustively explores the behaviors of the specific unit test and +generates diagnostic reports for any executions that violate the specification. + +\mysubsection{Contributions} + +This paper makes the following contributions: + +\begin{itemize} +\item {\bf Specification Language:} It introduces a specification + language that enables developers to write specifications of + concurrent data structures developed for a relaxed memory model in a + simple fashion that captures the key correctness properties. Our + specification language is the first to our knowledge that supports concurrent data + structures that use C/C++ atomic operations. + +\item {\bf A Technique to Relate Concurrent Executions to Sequential Executions:} It presents an approach to order the memory operations for the + C/C++ model, which lacks a definition of a trace and for which one + generally cannot even construct a total order of atomic operations + that is consistent with the program order. The generated + sequential execution by necessity does not always maintain program order. + +\item {\bf Synchronization Properties:} It presents constructs + for specifying the happens before relations that a data structure + should establish and tool support for checking these properties and + exposing synchronization related bugs. + +\item {\bf Tool for Checking C/C++ Data Structures Against Specifications:} \TOOL is the first tool to our knowledge that can check concurrent data structures that exhibit relaxed behaviors against specifications that are specified in terms intuitive sequential executions. + +\item {\bf Evaluation:} It shows that the \TOOL specification language can express key correctness properties for a +set of real-world concurrent data structures, that our tool can detect + bugs, and that our tool can unit test real world data structures + with reasonable performance. +\end{itemize} + diff --git a/correctness-model/writeup/.#introduction.tex.1.26 b/correctness-model/writeup/.#introduction.tex.1.26 new file mode 100644 index 0000000..33c8499 --- /dev/null +++ b/correctness-model/writeup/.#introduction.tex.1.26 @@ -0,0 +1,223 @@ +\mysection{Introduction}\label{sec:introduction} + +Concurrent data structure design can improve scalability by supporting +multiple simultaneous operations, reducing memory coherence traffic, and reducing the time taken by an +individual data structure operation. Researchers have developed many concurrent +data structure designs with these goals~\cite{rcu, +lockfreequeue}. Concurrent data structures often use sophisticated techniques +including low-level atomic instructions (e.g., compare and +swap), careful reasoning about the order of loads and +stores, and fine-grained locking. For example, while the standard Java hash +table implementation can limit scalability to a handful of cores, +more sophisticated concurrent hash tables can scale to many hundreds of +cores~\cite{javaConcurrentHashMap}. + +The C/C++ standard committee extended the C and C++ languages with +support for low-level atomic operations in the C/C++11 +standard~\cite{cpp11spec, c11spec, boehmpldi} to enable developers to +write portable implementations of concurrent data structures. To support the relaxations typically performed by compilers and processors, +the +C/C++ memory model provides weaker semantics than sequential +consistency~\cite{scmemorymodel} and as a result, correctly using +these operations is challenging. Developers must not only +reason about potential interleavings, but also about how the processor +and compiler might reorder memory operations. Even experts make +subtle errors when reasoning about such memory models. + +Researchers have developed tools for exploring the behavior of code +under the C/C++ model including \cdschecker~\cite{cdschecker}, {\sc +Cppmem}~\cite{c11popl}, and Relacy~\cite{relacy}. These tools explore +behaviors that are allowed under the C/C++ memory model. While these +tools can certainly be useful for exploring executions, they can be +challenging to use for testing as they don't provide support (other +than assertions) for specifying the behavior of data structures. +Using assertions can be challenging as different interleavings or +reorderings legitimately produce different behaviors, and it can be +very difficult to code assertions to check the output of a test case under for an +arbitrary (unknown) execution. + +This paper presents \TOOL, a specification language and specification +checking tool that is designed to be used in conjunction with model +checking tools. We have implemented it as a plugin for +the \cdschecker model checker. + +\mysubsection{Background on Linearizability} + +Researchers have developed several techniques for specifying +correctness properties of concurrent data structures written for strong memory +models. While these techniques cannot handle the behaviors typically +exhibited by relaxed data structure implementations, they provide insight into +intuitive approaches to specifying concurrent data structure behavior. + +One approach for specifying the correctness of concurrent data +structures is in terms of equivalent sequential executions of either +the concurrent data structure or a simplified sequential version. The +problem then becomes how do we map a concurrent execution to an equivalent +sequential execution? A common criterion is {\it + linearizability} --- linearizability simply states that a concurrent +operation can be viewed as taking effect at some time between its +invocation and its return (or response)~\cite{linearizableref}. + +An {\it equivalent sequential data structure} is a sequential version +of a concurrent data structure that can be used to express correctness +properties by relating executions of the original concurrent data +structure with executions of the equivalent sequential data structure. +The equivalent sequential data structure is often simpler, and in +many cases one can simply use existing well-tested implementations from the +STL library. + +An execution {\it history} is a total order of method invocations and +responses. A {\it sequential history} is one where all invocations are +followed by the corresponding responses immediately. A concurrent +execution is correct if its behavior is consistent with its equivalent +sequential history replayed on the equivalent sequential data +structure. A concurrent object is linearizable if for all executions: +\begin{enumerate} +\item Each method call appears to take effect instantaneously at some + point between its invocation and response. + +\item The invocations and responses can be reordered to yield a + sequential history under the rule that an invocation cannot be + reordered before the preceding responses. + +\item The concurrent execution yields the same behavior as + the sequential history. +\end{enumerate} + +A weaker variation of linearization is {\it sequential +consistency}\footnote{It is important to note that the term sequential +consistency in the literature is applied to both the consistency model +that data structures expose clients to as well as the guarantees that +the underlying memory system provides for load and store operations.}. +Sequential consistency only requires that there exist a sequential +history that is consistent with the {\it program order} (the intra-thread +order). This ordering does not need to be consistent with the order +that the operations were actually issued in. + +Line-Up~\cite{lineup}, Paraglider~\cite{VechevMCLinear}, and +VYRD~\cite{vyrd} leverage linearizability to test concurrent data +structures. {\bf Unfortunately, efficient implementations of many +common data structures, e.g., RCU~\cite{rcu}, MS +Queue~\cite{lockfreequeue}, ..., for the C/C++ memory model are +neither linearizable nor sequentially consistent! Thus previous tools +cannot check such data structures under the C/C++ memory model.} + +\mysubsection{New Challenges from the C/C++ Memory Model} +\label{sec:introNewChallenges} + +The C/C++ memory model brings the following two key challenges that prevent the application of previous approaches to checking concurrent data structures to this setting: + +\squishcount +\item {\bf Relaxed Executions Break Existing Data Structure Consistency Models:} +C/C++ data structures often expose clients to weaker (non-SC) +behaviors to gain performance. A common guarantee is to provide +happens-before synchronization between operations that implement +updates and the operations that read those updates. These data +structures often do not guarantee that different threads observe updates in the +same order --- in other words the data structures may expose clients +to weaker consistency models than sequential consistency. For +example, even when one uses the relatively strong \code{acquire} +and \code{release} memory orderings in C++, it is possible for two +different threads to observe two stores happening in +different orders, i.e., executions can fail the IRIW test. +Thus many data structure legitimately admit executions for which there +are no sequential histories that preserve program order. + +Like many other relaxed memory models, the C/C++ memory model does +not include a total order over all memory operations, thus even +further complicating the application of traditional approaches to correctness, +e.g., linearization cannot be applied. In +particular the approaches that relate the behaviors of concurrent data +structures to analogous sequential data structures break down due to +the absence of a total ordering of the memory operations. While many +of the dynamic tools~\cite{cdschecker,relacy} for exploring the +behavior of code under relaxed models do as a practical matter +print out an execution in some order, this order is to some degree arbitrary as relaxed memory models +generally make it possible for a data structure operation to see the +effects of operations that appear later in any such an order (e.g., a load +can read from a store that appears later in the order). Instead of a total order, the C/C++ +memory model is formulated as a graph of memory operations +with several partial orders defined in this graph. + +\item {\bf Constraining Reorderings (Specifying Synchronization Properties):} +Synchronization\footnote{Synchronization here is not mutual exclusion, + but rather a lower-level property that captures which stores must be + visible to a thread. In other words, it constrains which + reorderings can be performed by a processor or compiler.} in C/C++ + provides an ordering between memory operations to different + locations. Concurrent data structures must establish + synchronization or they potentially expose their users to highly + non-intuitive behavior that is likely to break client code. For + example, consider the case of a concurrent queue that does not + establish synchronization between enqueue and dequeue operations. Consider the + following sequence of operations: (1) thread A initializes the fields of a new + object X; (2) thread A enqueues the reference to X in such a queue + (3) thread B dequeues the reference to X; (4) thread B reads the + fields of X through the dequeued reference. In (4), thread B could fail to see the + initializing writes from (1). + This surprising behavior could occur if the compiler or CPU could + reorder the initializing writes to be executed after the enqueue + operation. If the fields are non-atomic, such loads are considered + data races and violate the data race free requirement of the C/C++ + language standard and thus the program has no semantics. + +The C/C++ memory model formalizes synchronization in terms of a {\it + happens-before} relation. The C/C++ happens-before relationship +is a partial order over memory accesses. If memory access {\it x} +happens before memory access {\it y}, it means that the effects of +{\it x} must be ordered before the effects of {\it y}. +\countend + +\begin{figure} + \centering +\vspace{-.3cm} + \includegraphics[scale=0.35]{figures/specworkflow} +\vspace{-.4cm} + \caption{\label{fig:specworkflow} \TOOL system overview} +\vspace{-.4cm} +\end{figure} + +\mysubsection{Specification Language and Tool Support} + +Figure~\ref{fig:specworkflow} presents an overview of the \TOOL system. After +implementing a concurrent data structure, developers annotate their code +with a \TOOL specification. To test their implementation, +developers compile the data structure with the \TOOL specification +compiler to extract the specification and generate a program that is instrumented with specification checks. + Then, developers compile the instrumented program with a +standard C/C++ compiler. Finally, developers run the binary under +the \TOOL checker. \TOOL +then exhaustively explores the behaviors of the specific unit test and +generates diagnostic reports for any executions that violate the specification. + +\mysubsection{Contributions} + +This paper makes the following contributions: + +\begin{itemize} +\item {\bf Specification Language:} It introduces a specification + language that enables developers to write specifications of + concurrent data structures developed for a relaxed memory model in a + simple fashion that captures the key correctness properties. Our + specification language is the first to our knowledge that supports concurrent data + structures that use C/C++ atomic operations. + +\item {\bf A Technique to Relate Concurrent Executions to Sequential Executions:} It presents an approach to order the memory operations for the + C/C++ model, which lacks a definition of a trace and for which one + generally cannot even construct a total order of atomic operations + that is consistent with the program order. The generated + sequential execution by necessity does not always maintain program order. + +\item {\bf Synchronization Properties:} It presents constructs + for specifying the happens before relations that a data structure + should establish and tool support for checking these properties and + exposing synchronization related bugs. + +\item {\bf Tool for Checking C/C++ Data Structures Against Specifications:} \TOOL is the first tool to our knowledge that can check concurrent data structures that exhibit relaxed behaviors against specifications that are specified in terms intuitive sequential executions. + +\item {\bf Evaluation:} It shows that the \TOOL specification language can express key correctness properties for a +set of real-world concurrent data structures, that our tool can detect + bugs, and that our tool can unit test real world data structures + with reasonable performance. +\end{itemize} + diff --git a/correctness-model/writeup/.#memorymodel.tex.1.1 b/correctness-model/writeup/.#memorymodel.tex.1.1 new file mode 100644 index 0000000..f60d9da --- /dev/null +++ b/correctness-model/writeup/.#memorymodel.tex.1.1 @@ -0,0 +1,101 @@ +\section{C/C++ Memory Model}\label{sec:memorymodel} + +We next briefly summarize key aspects of the C/C++ memory model. The memory model describes a series of atomic operations and the +corresponding allowed behaviors of programs that utilize them. + +Any operation on an atomic object will have one of six \textit{memory orders}, +each of which falls into one or more of the following categories. + +\begin{description} + + \item[relaxed:] + \code{memory\_order\_relaxed} -- + weakest memory ordering + + \item[release:] + \code{memory\_order\_release}, + \code{memory\_order\_acq\_rel}, and + \code{memory\_order\_seq\_cst} -- + a store-release may form release/consume or release/acquire synchronization + + \item[consume:\footnotemark{}] + \code{memory\_order\_consume} -- + a load-consume may form release/consume synchronization + + \footnotetext{Consume is not broadly supported by compilers at + this point due to specifying data dependencies. We treat consumes as acquires.} + + \item[acquire:] + \code{memory\_order\_acquire}, + \code{memory\_order\_acq\_rel}, and + \code{memory\_order\_seq\_cst} -- + a load-acquire may form release/acquire synchronization + + \item[seq-cst:] + \code{memory\_order\_seq\_cst} -- + strongest memory ordering + +\end{description} + +\subsection{Relations}\label{sec:model-relations} + +The C/C++ memory model expresses program behavior in the form +of binary relations or orderings. The following subsections will briefly +summarize the relevant relations. Much of this discussion resembles the preferred model from the +formalization in \cite{c11popl}. + +\mypara{\bf Sequenced-Before:} +The order of program operations within a single thread of execution establishes an intra-thread +\textit{sequenced-before} (\reltext{sb}) relation. +Note that while some operations in C/C++ provide no +intra-thread ordering---the equality operator (\code{==}), for example---we +ignore this detail and assume that \reltext{sb} totally orders all operations in +a thread. + +\mypara{\bf Reads-From:} +The \textit{reads-from} (\reltext{rf}) relation consists of store-load pairs $(X, Y)$ +such that $Y$ reads its value from the effect of $X$---or $X \relation{rf} Y$. In the +C/C++ memory model, this relation is non-trivial, as a given load operation may +read from one of many potential stores in the program execution. + +\mypara{\bf Synchronizes-With:} +The \textit{synchronizes-with} (\reltext{sw}) relation captures +synchronization that occurs when certain atomic operations interact across two +threads. For instance, release/acquire synchronization occurs between a pair of +atomic operations on the same object: a store-release $X$ and a load-acquire +$Y$. If $Y$ reads from $X$, then $X$ synchronizes with $Y$---or $X +\relation{sw} Y$. Synchronization also occurs between consecutive unlock and +lock operations on the same mutex, between thread creation and the first event +in the new thread, and between the last action of a thread and the completion of +a thread-join operation targeting that thread. + +\mypara{\bf Happens-Before:} +In \TOOL, we avoid consume operations, and so the \textit{happens-before} +(\reltext{hb}) relation is simply the transitive closure of \reltext{sb} and +\reltext{sw}. + +The \reltext{hb} relation restricts the stores that loads can read +from. For example, if we have two stores $X$ and $Y$ and +a load $Z$ to the same memory location and $X \relation{hb} Y +\relation{hb} Z$, then $Z$ cannot read from $X$. + +\mypara{\bf Sequential Consistency:} +All seq-cst operations in a program execution form a +total ordering (\reltext{sc}) so that, for instance, a seq-cst load may not read +from a seq-cst store prior to the most recent store (to the same location) in +the \reltext{sc} ordering, nor from any store that happens before that store. +The \reltext{sc} order must be consistent with \reltext{hb}. + +\mypara{\bf Modification Order:} +Each atomic object in a program execution has an associated \textit{modification order} +(\reltext{mo})---a total order of all stores to that object---which +informally represents a memory-coherent ordering in which those stores may be observed by +the rest of the program. +Note that +in general the modification orders for all objects cannot be combined +to form a consistent total ordering. We use $X \relation{mo} Y$ to represent the +fact that $X$ is modification ordered before $Y$. + + + + diff --git a/correctness-model/writeup/.#specification.tex.1.47 b/correctness-model/writeup/.#specification.tex.1.47 new file mode 100644 index 0000000..cb2aa21 --- /dev/null +++ b/correctness-model/writeup/.#specification.tex.1.47 @@ -0,0 +1,419 @@ +\mysection{Specification Language Design}\label{sec:specification} + +We begin by briefly overviewing \TOOL's basic approach. The \TOOL +specification language specifies the correctness properties for +concurrent data structures by establishing a correspondence with an +equivalent sequential data structure, which requires: (1) defining the +equivalent sequential data structure; (2) establishing an equivalent +sequential history; (3) relating the behavior of the concurrent +execution to the sequential history; and (4) specifying the +synchronization properties between method invocations. The \TOOL +specification language has the following key components: + +\mypara{\bf 1. Equivalent Sequential Data Structure:} This component defines a +sequential data structure against which the concurrent data structure +will be checked. + +\mypara{\bf 2. Defining the Equivalent Sequential History:} +For real-world data structures, generally there exist two types of API methods, +\textit{primitive} API methods and \textit{aggregate} API methods. Take +concurrent hashtables as an example, it provides primitive API methods +such as \code{put} and \code{get} that implement the core functionality of the +data structure, and it also has aggregate API methods such +as \code{putAll} that calls primitive API methods internally. From our +experience working with our benchmark set, it is generally possible to +generate a sequential history of primitive API method invocations for +real-world data structures as they generally serialize on a single memory +location --- while it is possible to observe partially completed aggregate +API method invocations. Therefore, our specifications will focus on the +correctness of primitive API methods. + +Borrowing from VYRD~\cite{vyrd} the concept of commit points, we allow +developers to specify \textit{ordering points} --- the specific atomic +operations between method invocation and response events that are used for +ordering method calls. Ordering points are a generalization of the commit +points as they also use memory operations that do not commit the data structure +operation to order method calls. Developers then specify ordering points to +generate the equivalent sequential history. + +\mypara{\bf 3. Specifying Correct Behaviors:} Developers use +the \TOOL specification to provide a set of \textit{side effects} +and \textit{assertions} to describe the desired behavior of each API +method. Side effects capture how a method updates the equivalent +sequential data structure. Assertions include both preconditions and +postconditions which specify what conditions each method must satisfy +before and after the method call, respectively. The specification of +the side effects and assertions may make use of the states of the +equivalent sequential data structure, meaning that these components +can access the internal variables and methods of the equivalent sequential data +structure. Additionally, they can reference the values available at +the method invocation and response, i.e., the parameter values and the +return value. + +\mypara{\bf 4. Synchronization:} The synchronization specification +describes the desired happens before relations between API method +invocations. \TOOL specifications allow developers to specify the +properties at the abstraction of methods. This makes specifications +cleaner, more understandable, and less error-prone because the +properties do not rely on low-level implementation +details. Moreover, \TOOL specifications allow developers to attach +conditions to methods when specifying synchronization properties so +that a method call might synchronize with another only under a +specific condition. For example, consider a spin lock with +a \code{try\_lock()} method, we need to specify that only a +successful \code{try\_lock()} method invocation must synchronize with the +previous \code{unlock()} method invocation. + +Figure~\ref{fig:speccfg} presents the grammar for the \TOOL specification +language. The grammar defines three types of specification annotations: +\textit{structure annotations}, \textit{method annotations}, and +\textit{ordering point annotations}. +In the grammar, \textit{code} means legal C/C++ source code; and +\textit{label} means legal C/C++ variable name. +Annotations are embedded in C/C++ comments. +This format does not affect the semantics of the original +program and allows for the same source to be used by both a standard C/C++ +compiler to generate production code and for the \TOOL specification compiler to +extract the \TOOL specification from the comments. We discuss these constructs in more detail throughout the remainder of this section. + +\begin{figure}[!tb] +\vspace{-.2cm} +{\scriptsize + \begin{eqnarray*} + \textit{\textbf{structureSpec}} & \rightarrow & \code{"@Structure\_Define"}\\ + && \textit{structureDefine} \ \ \ (\textit{happensBefore})?\\ + \textit{structureDefine} & \rightarrow & +(\code{"@DeclareStruct:"} \ + \textit{code})\text{*}\\ + && \code{"@DeclareVar:"} \ \textit{code}\\ + && \code{"@InitVar:"} \ \textit{code}\\ + && (\code{"@DefineFunc:"} \ \textit{code})\text{*}\\ + \textit{happensBefore} & \rightarrow & \code{"@Happens\_Before:"} \ + (\textit{invocation} \ \code{"->"} \ + \textit{invocation})\textsuperscript{+}\\ + \textit{invocation} & \rightarrow & \textit{label} \ (\ \ \code{"("} \ + \textit{label} \code{")"} \ \ )?\\ + \textit{\textbf{methodSpec}} & \rightarrow & \code{"@Method:"} \ \textit{label}\\ + && \code{"@Ordering\_Point\_Set:"} \ \textit{label} \ (\code{"|"} \ + \textit{label})\text{*}\\ + && (\code{"@HB\_Condition:"} \ \textit{label} \ \code{"::"} \ \textit{code})\text{*}\\ + && (\code{"@ID:"} \ \textit{code})?\\ + && (\code{"@PreCondition:"} \ \textit{code})?\\ + && (\code{"@SideEffect:"} \ \textit{code})?\\ + && (\code{"@PostCondition:"} \ \textit{code})?\\ + \textit{\textbf{potentialOP}} & \rightarrow & \code{"@Potential\_Ordering\_Point:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opCheck}} & \rightarrow & \code{"@Ordering\_Point\_Check:"} \ \textit{code}\\ + && \code{"@Potential\_Ordering\_Point\_Label:"} \ \textit{label}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opLabelCheck}} & \rightarrow & \code{"@Ordering\_Point\_Label\_Check:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opClear}} & \rightarrow & \code{"@Ordering\_Point\_Clear:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{code} & \rightarrow & \code{} + \end{eqnarray*}} +\vspace{-.7cm} +\caption{\label{fig:speccfg}Grammar for \TOOL specification language} +\vspace{-.3cm} +\end{figure} + + +\mysubsection{Example} + +To make the \TOOL specification language more concrete, +Figure~\ref{fig:rcuSpecExample} presents the annotated RCU example. We +use {\it ordering points} to order the method invocations to construct +the equivalent sequential history for the concurrent execution. We +first specify the ordering points for the \code{read} +and \code{update} methods to help define the equivalent sequential +history. For the +\code{read} method, the load access of the \code{node} field in +Line~\ref{line:rcuSpecReadLoad} is the only operation that can be an ordering +point. For the \code{update} method, there exists more than one atomic +operation, however they only serve as an ordering point when it successfully uses the CAS operation +to update the \code{node} field. Thus, we specify in +Line~\ref{line:rcuSpecUpdateOPBegin} that the CAS operation should be the +ordering point for the update operation when \code{succ} is \code{true}. We +associate the methods with the two ordering points in +Line~\ref{line:rcuSpecReadInterfaceOPSet} and +\ref{line:rcuSpecUpdateInterfaceOPSet}. + +Next, we specify the equivalent sequential data structure for this RCU implementation. +Line~\ref{line:declVar} declares two integer fields \code{\_data} and +\code{\_version} as the internal states of the equivalent sequential RCU, and +Line~\ref{line:initVar} initializes both variables to \code{0}. + +We then specify the correct behaviors of the equivalent sequential +history by defining the side effects and assertions for +the \code{read} and \code{update} methods. Side effects specify how +to perform the corresponding operation on the equivalent sequential +data structure. For example, +Line~\ref{line:rcuSpecUpdateInterfaceSideEffect} specifies the side +effects of the \code{update} to the sequential states. +Assertions specify properties that should be true of the concurrent data structure execution. +For example, Line~\ref{line:rcuSpecReadInterfacePostCondition} +specifies that the \code{read} method should satisfy the postcondition that the +returned \code{data} and \code{version} fields should have consistent values +as the internal state of the equivalent sequential data structure. + +Our implementation of the RCU data structure is designed to establish +synchronization between the \code{update} method invocation and the later +\code{read} or \code{update} method invocation. This is important, for +example, if a client thread were to update an array index and use the RCU data +structure to communicate the updated index to a second client thread. Without +synchronization, the second client thread may not see the update to the array +index. Besides, the synchronization between two \code{update} calls ensures that +later \code{read} will see the most updated values. +In order to specify the synchronization, we associate \code{read} and \code{update} methods with method call identifiers +(Line~\ref{line:rcuSpecReadInterfaceID} and Line~\ref{line:rcuSpecUpdateInterfaceID}), which for this example is the value of the +\code{this} pointer. +Together these annotations ensure that every +API method call on the same RCU object will have the same method call ID. +Line~\ref{line:rcuSpecHB} then specifies +the synchronization property for the RCU --- any \code{update} method invocation +should synchronize with all later \code{read} and \code{update} method invocations that have the +same method call identifier as that \code{update} method. This guarantees that +\code{update} calls should synchronize with the \code{read} and \code{update} +calls of the same RCU object. + + +\begin{figure}[h!] +\vspace{-.2cm} +\begin{lstlisting}[xleftmargin=6.0ex] +class RCU { + /** @Structure_Define: + @DeclareVar:/*@ \label{line:declVar} @*/ int _data, _version; + @InitVar:/*@ \label{line:initVar} @*/ _data = 0; _version = 0; + @Happens_Before: Update->Read Update->Update*//*@ \label{line:rcuSpecHB} @*/ + atomic node; + public: + RCU() { + Node *n = new Node; + n->data = 0; + n->version = 0; + atomic_init(&node, n); + } + /** @Interface: Read/*@ \label{line:rcuSpecReadInterfaceLabel} @*/ + @Ordering_Point_Set: Read_Point/*@ \label{line:rcuSpecReadInterfaceOPSet} @*/ + @ID: this/*@ \label{line:rcuSpecReadInterfaceID} @*/ + @PostCondition:/*@ \label{line:rcuSpecReadInterfacePostCondition} @*/ + _data == *data && _version == *version *//*@ \label{line:rcuSpecReadInterfaceEnd} @*/ + void read(int *data, int *version) { + Node *res = node.load(mo_acquire);/*@ \label{line:rcuSpecReadLoad} @*/ + /** @Ordering_Point_Label_Check: true/*@ \label{line:rcuSpecReadOPBegin} @*/ + @Label: Read_Point */ + *data = res->data; + *version = res->version; + } + /** @Interface: Update + @Ordering_Point_Set: Update_Point/*@ \label{line:rcuSpecUpdateInterfaceOPSet} @*/ + @ID: this/*@ \label{line:rcuSpecUpdateInterfaceID} @*/ + @SideEffect: _data = data; _version++; *//*@ \label{line:rcuSpecUpdateInterfaceSideEffect} @*/ + void update(int data) { + bool succ = false; + Node *newNode = new Node;/*@ \label{line:rcuSpecUpdateAlloc} @*/ + Node *prev = node.load(mo_acquire);/*@ \label{line:rcuSpecUpdateLoad} @*/ + do { + newNode->data = data; + newNode->version = prev->version + 1; + succ = node.compare_exchange_strong(prev,/*@\label{line:rcuSpecUpdateCAS} @*/ + newNode, mo_acq_rel, mo_acquire); + /** @Ordering_Point_Label_Check: succ/*@ \label{line:rcuSpecUpdateOPBegin} @*/ + @Label: Update_Point */ + } while (!succ); + } +}; + +\end{lstlisting} +\vspace{-.2cm} +\caption{\label{fig:rcuSpecExample}Annotated RCU specification example} +\vspace{-.3cm} +\end{figure} + +\subsection{Defining the Equivalent Sequential History} + +While defining the equivalent sequential history for concurrent executions is well studied in the context of the +SC memory model, optimizations that developers typically use in the +context of weaker memory models create the following new challenges when +we generate the equivalent sequential history using ordering points. + +\begin{itemize} +\item {\bf Absence of a Meaningful Trace or Total Order:} +For the SC memory model, an execution can be represented by a simple +interleaving of all the memory operations, where each load operation reads from +the last store operation to the same location in the trace. However, under a +relaxed memory model like C/C++11, the interleaving does not uniquely define an +execution because a given load operation can potentially read from many +different store operations in the interleaving. Therefore, we have to rely on +the intrinsic relations between ordering points such as \textit{reads from} and +\textit{modification order} to order method calls. + +\item {\bf Lack of Program Order Preserving Sequential History:} +Moreover, as discussed in Section~\ref{sec:exampleMotivation}, in +general it is not possible to arrange an execution in any totally +ordered sequential history that preserves program order. + +A key insight is that many concurrent data structures' API methods +have a commit point, which is a single memory operation that makes the +update visible to other threads and that also serves as an ordering +point. When two data structure operations have a dependence, it is +often the case that their respective commit points are both +conflicting accesses to the same memory location. In this case, the +modification order provided by C/C++ is sufficient to order these +operations since modification order is guaranteed to be consistent +with the happens before relation (and therefore also the sequenced +before relation). + +For cases where the method calls are independent, such as +a \code{put(X, 1)} followed by a +\code{get(Y)} in a hashtable where \code{X} and \code{Y} are different keys, +the lack of an ordering is not a problem since those methods commute. +\end{itemize} + +\mypara{\bf Ordering Point Annotations:} In many cases, it is not +possible to determine whether a given atomic operation is an ordering +point until later in the execution. For example, +some internal methods may be called by multiple API methods. In this +case, the same atomic operation can be identified as a potential +ordering point for multiple API methods, and each API method later has +a checking annotation to verify whether it was a real ordering +point. Therefore, the \TOOL specification separates the definition of ordering +points as follows: +\begin{enumerate} +\vspace{-.1cm} +\item {\code{Potential\_Ordering\_Point} annotation:} The labeling of ordering +points that identifies the location of a potential ordering point. +\vspace{-.2cm} +\item {\code{Ordering\_Point\_Check} annotation:} The checking of ordering +points that checks at a later point whether a potential ordering point was +really an ordering point. +\end{enumerate} +\vspace{-.1cm} + +These two constructs together identify ordering points. For +example, assume that $A$ is an atomic operation that is marked as a +potential ordering point with the label \code{LabelA} under the +condition \code{ConditionA}. The developer would write a +\code{Potential\_Ordering\_Point} annotation with the label +\code{LabelA} and then use the label \code{LabelA} in an +\code{Ordering\_Point\_Check} annotation at a later point. + +The \code{Ordering\_Point\_Label\_Check} annotation combines +the \code{Potential\_Ordering\_Point} and the +\code{Ordering\_Point\_Check} annotations, and makes +specifications simpler for the use case that the ordering point is known immediately. +For example, in Line~\ref{line:rcuSpecReadOPBegin} of +Figure~\ref{fig:rcuSpecExample}, we use the \code{Ordering\_Point\_Label\_Check} annotation to +identify the ordering point for \code{read} because we know the load operation +in Line~\ref{line:rcuSpecReadLoad} is an ordering point at the time it is +executed. + +Some data structure operations may require multiple ordering points. +For example, consider a transaction implementation that first attempts +to lock all of the involved objects (dropping the locks and retrying +if it fails to acquire a lock), performs the updates, and then releases +the locks. To order such transactions in a relaxed memory model, we must consider all of the +locks it acquires and not just the last lock. Thus, we allow a +method invocation to have more than one ordering point, and the +additional ordering points serve to order the operation with respect to +multiple different memory locations. For the transaction example, it +may be necessary to retry the acquisition of locks. To support this +scenario, the \code{Ordering\_Point\_Clear} annotation removes all +previous ordering points when it satisfies a specific condition. + +Moreover, when an API method calls another API method, they can share ordering points. In +that case, \TOOL requires that at that ordering point, the concurrent data +structure should satisfy the precondition and postcondition of both the inner +and outer API methods. + +\subsection{Checking the IO Behavior of Methods} + +With the specified ordering points, \TOOL is able to generate the equivalent +sequential history. Developers then need to define the equivalent sequential +data structure. For example, in Line~\ref{line:declVar} and +~\ref{line:initVar} of the annotated RCU example, we use the +\code{Structure\_define} annotation to define the equivalent sequential RCU +by specifying the internal states as two integers, \code{\_verion} and \code{\_data}. In the +\code{Structure\_define} annotation, developers can also specify definitions for customized +structs and methods for convenience. We design these annotations in such a way +that developers can +write specifications in C/C++ code such that they do not have to learn a new +specification language. + +After defining the internal states and methods of the +equivalent data structure, developers use the \code{SideEffect} annotation to +define the corresponding sequential API methods, which should contain the action +to be performed on the equivalent sequential data structure. For example, in +Line~\ref{line:rcuSpecUpdateInterfaceSideEffect} of the annotated RCU example, +we use \code{SideEffect} to specify that when we execute the \code{update} +method on the equivalent sequential RCU, we should update the +internal states of \code{\_version} and \code{\_data} accordingly. When +the \code{SideEffect} annotation is omitted for a specific API method, it means +that no side effects will happen on the sequential data structure when that +method is called. Take the annotated RCU as an example, the \code{read} has no +side effects on the equivalent sequential RCU. + +With the well-defined equivalent sequential data structure, developers then relate +the generated equivalent sequential history to the equivalent sequential data +structure. In \TOOL, we allow developers to accomplish this by using the +\code{PreCondition} and \code{PostCondition} annotations to specify the +conditions to be checked before and after the API method appears to happen. +For example, Line~\ref{line:rcuSpecReadInterfaceEnd} in the +annotated RCU example means that when \code{read} appears to happen, it should +return the same value as the current interal variables of the equivalent +sequential RCU. +Note that these two annotations contain legitimate C/C++ +expressions that only access the method call parameters, return value and the +internal states of the equivalent sequential data structure. + +\subsection{Checking Synchronization} + +Under a relaxed memory model, compilers and processors can reorder +memory operations and thus the execution can exhibit counter-intuitive +behaviors. The C/C++11 memory model provides the developer with memory ordering that establish synchronization, e.g., \code{acquire}, \code{release}, \code{seq\_cst}. Synchronization +serves to control which reorderings are allowed --- however, +restricting reorderings comes at a runtime cost so developers must +balance complexity against runtime overhead. Checking that data +structures establish proper synchronization is important to ensure +that the data structures can be effectively composed with client code. + +We generalize the notion of happens before to methods as follows. +Method call $c_1$ happens-before method call $c_2$ if the invocation +event of $c_1$ happens before the response event of $c_2$. Note that +by this definition two method calls can both happen before each other +--- an example of this is the \code{barrier} synchronization +construct. For example, for a correctly synchronized queue, we want +an enqueue to happen before the corresponding dequeue, which avoids +the synchronization problems discussed earlier in +Section~\ref{sec:introNewChallenges}. + +In order to flexibly express the synchronization between methods, we associate +API methods with method call identifiers (or IDs) and happens-before conditional guard +expressions. The method +call ID is a C/C++ expression that computes a unique ID for the call, and if it +is omitted, a default value is used. For example, in our RCU example in +Figure~\ref{fig:rcuSpecExample}, method \code{update} and \code{read} both +have the \code{this} pointer of the corresponding RCU object. +The \code{HB\_Condition} component +associates one happens-before conditional guard expression with a unique label. +For one method, multiple conditional guard expressions are allowed to be +defined, and the conditional guard expression can only access the method +instance's argument values and return value. + +After specifying the +method call IDs and the \code{HB\_Condition} labels, developers +can specify the synchronization as ``\code{method1(HB\_condition1)} \code{->} +\code{method2(HB\_condition2)}''. When the \code{HB\_condition} is omitted, it +defaults to \code{true}. The semantics of this expression is that all +instances of calls to \code{method1} that satisfy the conditional guard +expression \code{HB\_condition1} should happen-before all later instances (as determined by ordering points) of +calls to \code{method2} that satisfy the conditional guard expression +\code{HB\_condition2} such that both instances shared the same ID. +The ID and happens-before conditional guard expression are important because they +allow developers to impose synchronization only between specific method +invocations under specific conditions. For example, in +Figure~\ref{fig:rcuSpecExample}, Line~\ref{line:rcuSpecHB} specifies two +synchronization rules, which together mean that the +\code{update} should only establish synchronization with later \code{read} and +\code{update} from +the same RCU object under all circumstances. diff --git a/correctness-model/writeup/CVS/Entries b/correctness-model/writeup/CVS/Entries new file mode 100644 index 0000000..e738c4e --- /dev/null +++ b/correctness-model/writeup/CVS/Entries @@ -0,0 +1,19 @@ +/confstrs-abbrv.bib/1.1/Wed Jan 14 22:53:32 2015// +/confstrs-long.bib/1.1/Wed Jan 14 22:53:32 2015// +/sig-alternate.cls/1.1/Wed Jan 14 22:53:32 2015// +D/figures//// +/makefile/1.2/Fri Jan 23 17:16:19 2015// +/spell.lst/1.1/Fri Jan 23 05:47:30 2015// +/abstract.tex/1.2/Fri Jan 23 22:58:26 2015// +/conclusion.tex/1.2/Fri Jan 23 22:58:26 2015// +/related.tex/1.2/Fri Jan 23 22:58:26 2015// +/speccfg.tex/1.1/Fri Jan 23 22:58:26 2015// +/technical.tex/1.1/Fri Jan 23 22:58:26 2015// +/paper.tex/1.6/Fri Jan 23 23:30:25 2015// +/paper.bib/1.3/Sat Jan 24 00:47:32 2015// +/memorymodel.tex/1.8/Sat Jan 24 01:51:58 2015// +/introduction.tex/1.36/Sat Jan 24 03:09:04 2015// +/example.tex/1.19/Sat Jan 24 03:36:11 2015// +/specification.tex/1.59/Sat Jan 24 04:47:54 2015// +/implementation.tex/1.16/Sat Jan 24 05:04:07 2015// +/evaluation.tex/1.21/Sat Jan 24 05:35:18 2015// diff --git a/correctness-model/writeup/CVS/Repository b/correctness-model/writeup/CVS/Repository new file mode 100644 index 0000000..e5a4afa --- /dev/null +++ b/correctness-model/writeup/CVS/Repository @@ -0,0 +1 @@ +Papers/15/issta.cdsspec diff --git a/correctness-model/writeup/CVS/Root b/correctness-model/writeup/CVS/Root new file mode 100644 index 0000000..cd8b2f1 --- /dev/null +++ b/correctness-model/writeup/CVS/Root @@ -0,0 +1 @@ +:ext:peizhaoo@plrg.eecs.uci.edu:/home/cvs/Papers diff --git a/correctness-model/writeup/abstract.tex b/correctness-model/writeup/abstract.tex new file mode 100644 index 0000000..7bf3748 --- /dev/null +++ b/correctness-model/writeup/abstract.tex @@ -0,0 +1,19 @@ +Concurrent data structures often provide better performance on +multi-core platforms, but are significantly more difficult to design and +verify than their sequential counterparts. The C/C++11 standard +introduced a weak language memory model supporting low-level atomic +operations such as compare and swap (CAS). While these +atomic operations can significantly improve the performance +of concurrent data structures, programming at this level +introduces +non-intuitive behaviors that significantly increase the difficulty of +developing code. + +In this paper, we present \TOOL, a specification language checker that +allows developers to write simple specifications for low-level +concurrent data structures that make use of C/C++11 atomics and check +the correctness of concurrent data structures against these +specifications. \TOOL is designed to be used in conjunction with +model checking tools and we have implemented it as a plugin +to \cdschecker. We have evaluated \TOOL by annotating and checking +several concurrent data structures. diff --git a/correctness-model/writeup/conclusion.tex b/correctness-model/writeup/conclusion.tex new file mode 100644 index 0000000..ae07691 --- /dev/null +++ b/correctness-model/writeup/conclusion.tex @@ -0,0 +1,11 @@ +\mysection{Conclusion\label{sec:conclusion}} + +The \TOOL specification language and checking system makes it easier +to unit test concurrent data structures written for the C/C++11 memory +model. It extends and modifies classic approaches to defining the +desired behaviors of concurrent data structures with respect to +sequential versions of the same data structure to +apply to the C/C++ memory model. Our evaluation shows +that the approach can be used to specify and test correctness +properties for a range of data structures including a +lock-free hashtable, work-stealing deque, queues and locks. diff --git a/correctness-model/writeup/confstrs-abbrv.bib b/correctness-model/writeup/confstrs-abbrv.bib new file mode 100644 index 0000000..ef42052 --- /dev/null +++ b/correctness-model/writeup/confstrs-abbrv.bib @@ -0,0 +1,173 @@ +@string{mspc12="MSPC"} +@string{ppdp11="PPDP"} +@string{spin04="SPIN"} +@string{spin07="SPIN"} +@string{spin08="SPIN"} +@string{spin09="SPIN"} +@string{ijpp="IJPP"} +@string{jlap="JLAP"} +@string{fcad10="FCAD"} +@strign{sc="SC"} +@string{iwops99="POS"} +@string{podc96="PODC"} +@string{popl73="POPL"} +@string{popl93="POPL"} +@string{popl96="POPL"} +@string{popl97="POPL"} +@string{popl99="POPL"} +@string{popl05="POPL"} +@string{popl07="POPL"} +@string{popl08="POPL"} +@string{popl09="POPL"} +@string{popl11="POPL"} +@string{popl13="POPL"} + +@string{dac07="DAC"} +@string{sosp05="SOSP"} +@string{sosp03="SOSP"} +@string{oopsla02="OOPSLA"} +@string{oopsla03="OOPSLA"} +@string{oopsla04="OOPSLA"} +@string{oopsla05="OOPSLA"} +@string{oopsla06="OOPSLA"} +@string{oopsla07="OOPSLA"} +@string{oopsla08="OOPSLA"} +@string{oopsla09="OOPSLA"} +@string{oopsla10="OOPSLA"} +@string{oopsla13="OOPSLA"} + +@string{hotpar09="HotPar"} +@string{hotpar10="HotPar"} + +@string{atc="ATC"} + +@string{ismm08="ISMM"} +@string{ismm09="ISMM"} +@string{ismm10="ISMM"} + +@string{esop09="ESOP"} + +@string{scool05="SCOOL"} + +@string{paste08="PASTE"} + +@string{ecoop10="ECOOP"} + +@string{osdi04="OSDI"} +@string{osdi08="OSDI"} + +@string{toplas02="TOPLAS"} +@string{toplas09="TOPLAS"} + +@string{pact01="PACT"} +@string{pact08="PACT"} + +@string{cc08="CC"} +@string{cc10="CC"} +@string{cc11="CC"} + +@string{asplos91="ASPLOS"} +@string{asplos02="ASPLOS"} +@string{asplos09="ASPLOS"} + +@string{sc01="SC"} +@string{sc06="SC"} + +@string{spaa98="SPAA"} +@string{toplas="TOPLAS"} +@string{tocs="TOCS"} +@string{tpds="TPDS"} +@string{vee05="VEE"} +@string{vee08="VEE"} +@string{jvm01="JVM"} + +@string{ics95="ICS"} +@string{ics99="ICS"} + +@string{icse05="ICSE"} +@string{icse10="ICSE"} +@string{icse00="ICSE"} + +@string{sc97="SC"} +@string{sc01="SC"} +@string{lcpc08="LCPC"} +@string{lcpc01="LCPC"} +@string{pldi="PLDI"} +@string{pldi93="PLDI"} +@string{pldi94="PLDI"} +@string{pldi95="PLDI"} +@string{pldi96="PLDI"} +@string{pldi97="PLDI"} +@string{pldi98="PLDI"} +@string{pldi99="PLDI"} +@string{pldi00="PLDI"} +@string{pldi01="PLDI"} +@string{pldi02="PLDI"} +@string{pldi03="PLDI"} +@string{pldi04="PLDI"} +@string{pldi05="PLDI"} +@string{pldi06="PLDI"} +@string{pldi07="PLDI"} +@string{pldi08="PLDI"} +@string{pldi09="PLDI"} +@string{pldi10="PLDI"} +@string{pldi11="PLDI"} +@string{pldi12="PLDI"} +@string{pldi13="PLDI"} + +@string{issta11="ISSTA"} +@string{isca90="ISCA"} +@string{isca09="ISCA"} +@string{isca10="ISCA"} +@string{ppopp97="PPoPP"} +@string{ppopp01="PPoPP"} +@string{ppopp07="PPoPP"} +@string{ppopp09="PPoPP"} +@string{ppopp10="PPoPP"} +@string{ppopp11="PPoPP"} +@string{ppopp12="PPoPP"} +@string{ppopp13="PPoPP"} + +@string{cgo10="CGO"} +@string{cgo11="CGO"} + +@string{ispass09="ISPASS"} + +@string{iiswc08="IISWC"} +@string{iiswc09="IISWC"} + +@string{iccl88="ICCL"} + +@string{micro05="MICRO"} +@string{micro10="MICRO"} + +@string{hpdc07="HPDC"} + +@string{cav08="CAV"} +@string{cav07="CAV"} +@string{cav06="CAV"} +@string{cav04="CAV"} + +@string{procomet90="PROCOMET"} +@string{hpca07="HPCA"} +@string{dexa04="DEXA"} + +@string{lics="LICS"} +@string{lncs="LNCS"} +@string{lcpc="LCPC"} +@string{vmcai="VMCAI"} +@string{vmcai09="VMCAI"} +@string{tacas11="TACAS"} + +@string{ieeecmpscieng="IEEE Comput. Sci. Eng."} +@string{higherordersymbcomp="HOSC"} +@string{ibmjrd="IBM J. of Res. Dev."} +@string{ieeetc="TC"} +@string{cacm="CACM"} +@string{jsac="J-SAC"} + +@string{conpar90vappIV="CONPAR 90 - VAPP IV"} + +@string{asplos91="ASPLOS"} + +@string{ipdps09="IPDPS"} diff --git a/correctness-model/writeup/confstrs-long.bib b/correctness-model/writeup/confstrs-long.bib new file mode 100644 index 0000000..55ff861 --- /dev/null +++ b/correctness-model/writeup/confstrs-long.bib @@ -0,0 +1,180 @@ +@string{mspc12="Proceedings of the 2012 ACM SIGPLAN Workshop on Memory Systems Performance and Correctness"} +@string{ppdp11="Proceedings of the 13th International ACM SIGPLAN Symposium on Principles and Practices of Declarative Programming"} +@string{padd88="Proceedings of the 1988 ACM SIGPLAN and SIGOPS Workshop on Parallel and Distributed Debugging"} +@string{spin04="Proceedings of the 11th International {SPIN} Workshop on Model Checking Software"} +@string{spin07="Proceedings of the 14th International {SPIN} Workshop on Model Checking Software"} +@string{spin08="Proceedings of the 15th International {SPIN} Workshop on Model Checking Software"} +@string{spin09="Proceedings of the 16th International {SPIN} Workshop on Model Checking Software"} +@string{fcad10="Proceedings of the Conference on Formal Methods in Computer-Aided Design"} +@string{jlap="Journal of Logic and Algebraic Programming"} +@string{iwops99="Proceedings of the 8th International Workshop on Persistent Object Systems"} + +@string{ijpp="International Journal on Parallel Programming"} + +@string{sc06="Supercomputing"} +@string{podc96="Proceedings of the Fifteenth Annual ACM Symposium on Principles of Distributed Computing"} +@string{popl73="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl93="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl96="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl97="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl99="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl05="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl07="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl08="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl11="Proceedings of the Symposium on Principles of Programming Languages"} +@string{popl13="Proceedings of the Symposium on Principles of Programming Languages"} + +@string{dac07="Proceedings of the 44th Annual Design Automation Conference"} + +@string{issta11="Proceedings of the 2011 International Symposium on Software Testing and Analysis"} + +@string{sosp03="Proceedings of the Nineteenth ACM Symposium on Operating Systems Principles"} +@string{sosp05="Proceedings of the Twentieth ACM Symposium on Operating Systems Principles"} +@string{oopsla02="Proceeding of the 17th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla03="Proceeding of the 18th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla04="Proceeding of the 19th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla05="Proceeding of the 20th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla06="Proceeding of the 21st ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla07="Proceeding of the 22nd ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla08="Proceeding of the 23rd ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla09="Proceeding of the 24th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla10="Proceeding of the 25th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} +@string{oopsla13="Proceeding of the 28th ACM SIGPLAN Conference on Object-Oriented Programming, Systems, Languages, and Applications"} + +@string{scool05="Synchronization and Concurrency in Object-Oriented Languages"} + +@string{hotpar09="First USENIX Workshop on Hot Topics in Parallelism"} +@string{hotpar10="Second USENIX Workshop on Hot Topics in Parallelism"} + +@string{atc="Proceedings of the USENIX Annual Technical Conference"} + +@string{ismm08="Proceedings of the 2008 International Symposium on Memory Management"} +@string{ismm09="Proceedings of the 2009 International Symposium on Memory Management"} +@string{ismm10="Proceedings of the 2010 International Symposium on Memory Management"} +@string{esop09="Proceedings of the 2009 European Symposium on Programming"} +@string{paste08="Proceedings of Program Analysis for Software Tools and Engineering"} + +@string{ecoop10="Proceedings of the 24th European Conference on Object-Oriented Programming"} + +@string{osdi04="Proceedings of the 6th Symposium on Operating Systems Design and Implementation"} +@string{osdi08="Proceedings of the 8th Symposium on Operating Systems Design and Implementation"} + +@string{toplas02="ACM Transactions on Programming Languages and Systems"} +@string{toplas09="ACM Transactions on Programming Languages and Systems"} + +@string{sc01="Proceedings of the ACM/IEEE Conference on Supercomputing"} +@string{sc06="Proceedings of the ACM/IEEE Conference on Supercomputing"} + +@string{ics95="Proceedings of the 9th International Conference on Supercomputing"} + +@string{icse00="Proceedings of the 22nd International Conference on Software Engineering"} +@string{icse05="Proceedings of the 27th International Conference on Software Engineering"} +@string{icse10="Proceedings of the 32nd International Conference on Software Engineering"} + +@string{pact01="Proceedings of the 10th International Conference on Parallel Architectures and Compilation Techniques"} +@string{pact08="Proceedings of the 17th International Conference on Parallel Architectures and Compilation Techniques"} + +@string{cc08="Proceedings of the 17th International Conference on Compiler Construction"} +@string{cc10="Proceedings of the 19th International Conference on Compiler Construction"} +@string{cc11="Proceedings of the 20th International Conference on Compiler Construction"} + +@string{asplos91="Proceedings of the Fourth International Conference on Architectural Support for Programming Languages and Operating Systems"} +@string{asplos02="10th International Conference on Architectural Support for Programming Languages and Operating Systems"} +@string{asplos09="14th International Conference on Architectural Support for Programming Languages and Operating Systems"} + +@string{vee05="Proceedings of the First ACM SIGPLAN/SIGOPS International Conference on Virtual Execution Environments"} +@string{vee08="Proceedings of the Fourth ACM SIGPLAN/SIGOPS International Conference on Virtual Execution Environments"} + +@string{lcpc08="Proceedings of the 21st Annual Workshop on Languages and Compilers for Parallel Computing"} +@string{lcpc10="Proceedings of the Fourteenth Annual Workshop on Languages and Compilers for Parallel Computing"} + +@string{pldi="Proceedings of Programming Language Design and Implementation"} +@string{pldi93="Proceedings of the 1993 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi94="Proceedings of the 1994 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi95="Proceedings of the 1995 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi96="Proceedings of the 1996 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi97="Proceedings of the 1997 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi98="Proceedings of the 1998 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi99="Proceedings of the 1999 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi00="Proceedings of the 2000 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi01="Proceedings of the 2001 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi02="Proceedings of the 2002 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi03="Proceedings of the 2003 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi04="Proceedings of the 2004 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi05="Proceedings of the 2005 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi06="Proceedings of the 2006 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi07="Proceedings of the 2007 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi08="Proceedings of the 2008 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi09="Proceedings of the 2009 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi10="Proceedings of the 2010 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi11="Proceedings of the 2011 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi12="Proceedings of the 2012 ACM SIGPLAN Conference on Programming Language Design and Implementation"} +@string{pldi13="Proceedings of the 2013 ACM SIGPLAN Conference on Programming Language Design and Implementation"} + +@string{isca90="Proceedings of the 17th Annual International Symposium on Computer Architecture"} +@string{isca09="Proceedings of the 36th Annual International Symposium on Computer Architecture"} +@string{isca10="Proceedings of the 37th Annual International Symposium on Computer Architecture"} + +@string{ppopp97="Proceedings of the 6th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp07="Proceedings of the 12th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp01="Proceedings of the 8th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp09="Proceedings of the 14th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp10="Proceedings of the 15th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp11="Proceedings of the 16th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp12="Proceedings of the 17th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} +@string{ppopp13="Proceedings of the 18th ACM SIGPLAN Symposium on Principles and Practice of Parallel Programming"} + +@string{ispass09="IEEE International Symposium on Performance Analysis of Systems and Software"} + +@string{iiswc08="Proceedings of the IEEE International Symposium on Workload Characterization"} +@string{iiswc09="Proceedings of the IEEE International Symposium on Workload Characterization"} + +@string{iccl88="Proceedings of the 1988 International Conference on Computer Languages"} + +@string{micro05="38th Annual IEEE/ACM International Symposium on Microarchitecture"} +@string{micro10="43rd Annual IEEE/ACM International Symposium on Microarchitecture"} + +@string{hpdc07="Proceedings of the ACM International Symposium on High Performance Distributed Computing"} + +@string{cav07="Proceedings of the 19th International Conference on Computer Aided Verification"} +@string{cav06="Proceedings of the 18th International Conference on Computer Aided Verification"} +@string{cav08="Proceedings of the 20th International Conference on Computer Aided Verification"} +@string{cav04="Proceedings of the 16th International Conference on Computer Aided Verification"} + +@string{tacas11="Proceedings of the 17th International Conference on Tools and Algorithms for the Construction and Analysis of Systems"} + +@string{procomet90="Proceedings of the International Conference on Programming Concepts and Methods"} + +@string{dexa04="Proceedings of the 15th International Conference on Database and Expert Systems Applications"} + +@string{lics="Symposium on Logic in Computer Science"} +@string{lncs="Lecture Notes in Computer Science"} +@string{lcpc="Proceedings of Languages and Compilers for Parallel Computing"} +@string{vmcai="Proceedings of Verification, Model Checking, and Abstract Interpretation"} +@string{vmcai09="Proceedings of the 2009 Conference on Verification, Model Checking, and Abstract Interpretation"} + + +@string{ieeecmpscieng="IEEE Computing in Science and Engineering"} +@string{higherordersymbcomp="Higher-Order and Symbolic Computation"} +@string{ibmjrd="IBM Journal of Research and Development"} +@string{ieeetc="IEEE Transactions on Computers"} +@string{cacm="Communications of the ACM"} +@string{jsac="IEEE Journal on Selected Areas in Communications"} +@string{hpca07="Proceedings of the International Symposium on High Performance Computer Architecture"} +@string{conpar90vappIV="Proceedings of the Joint International Conference on Vector and Parallel Processing"} +@string{tocs="ACM Transactions on Computing Systems"} +@string{toplas="ACM Transactions on Programming Languages and Systems"}, +@string{spaa98="Proceedings of the Tenth Annual ACM Symposium on Parallel Algorithms and Architectures"} +@string{tpds="IEEE Transactions on Parallel and Distributed Systems"} + +@string{jvm01="Proceedings of the 2001 Symposium on JavaTM Virtual Machine Research and Technology"} +@string{ics99="Proceedings of the International Conference on Supercomputing"} +@string{sc97="Proceedings of the 1997 ACM/IEEE Conference on Supercomputing"} +@string{sc01="Proceedings of the SC2001"} + +@string{cgo10="Proceedings of the 8th Annual IEEE/ACM International Symposium on Code Generation and Optimization"} +@string{cgo11="Proceedings of the 9th Annual IEEE/ACM International Symposium on Code Generation and Optimization"} + +@string{asplos91="Proceedings of the Fourth International Conference on Architectural Support for Programming Languages and Operating Systems"} + +@string{ipdps09="Proceedings of the 2009 IEEE International Symposium on Parallel \& Distributed Processing"} diff --git a/correctness-model/writeup/evaluation.tex b/correctness-model/writeup/evaluation.tex new file mode 100644 index 0000000..1bf7c00 --- /dev/null +++ b/correctness-model/writeup/evaluation.tex @@ -0,0 +1,304 @@ +\mysection{Evaluation}\label{sec:evaluation} + +We have implemented \TOOL. Our evaluation focuses on the following +questions: (1) How expressive is \TOOL for specifying +the correctness properties of real-world concurrent data structures? (2) How easy is it +to use \TOOL? (3) What +is the performance of \TOOL? (4) How effective was \TOOL +in finding bugs? + +In order to evaluate \TOOL, we have gathered a contention +free lock, two types of concurrent queues, and a work stealing +deque~\cite{ppoppworkstealing}. As C/C++11 is relatively new +there are no C/C++11 implementations for many concurrent data +structures, thus we ported several data structures. The Linux +kernel's reader-writer spinlock and the Michael Scott queue were originally ported +for the \cdschecker benchmark suite. We also ported an RCU +implementation and Cliff Click's hashtable from its Java +implementation~\cite{clickhashtable}. We report execution times on an +Intel Core i7 3770. + +\mysubsection{Expressiveness}\label{sec:expressiveness} + +In this section, we evaluate the expressiveness of \TOOL by reporting +our experiences writing specifications for a range of concurrent data +structures. + +\mypara{\bf Lockfree hashtable:} We ported Cliff Click's hashtable, +which supports simultaneous lookups and updates by multiple threads as +well as concurrent table resizing. The implementation uses an array +of atomic variables to store the key/value slots, and uses +acquire/release synchronization to establish the synchronization +between hashtable accesses. + +Hashtable updates consist of two CAS operations --- one to claim +the key slot and one to update the value. When a \code{put} method +invocation successfully updates both the key and value, the +update is visible to other threads. Thus, both CAS operations are +ordering points for the \code{put} method, and we annotate both of +them as potential ordering points. The \code{get} method is ordered after +an invocation of the \code{put} only if it sees both the key and +value updates. Thus we annotate an ordering point for the +key read only if the key is null. We also +annotate an ordering point for the value read if +it reads the value slot. The test driver has two threads both of +which update and read the value for the same key. + +\mypara{\bf RCU:} As discussed in the example, this is a +synchronization mechanism used in the Linux kernel that allows concurrent reads +and updates. We ran this benchmark with four threads, two update the data +structure and two read the data structure. + +\mypara{\bf Chase-Lev Deque:} This is a bug-fixed version of a published C11 adaptation +of the Chase-Lev deque~\cite{ppoppworkstealing}. +It maintains a top and bottom index to a shared array of +references. In terms of synchronization, +when pushing an item into the sequential deque, +we attach a unique ID tag to that element. When stealing or taking an item, we +use that tag as the ID of the method call. Thus, we have (push, steal) or +(push, take) pairs that have the same method call ID. +In our test driver, one thread +pushes 3 items and takes 2 items while the other one steals 1 +item. + +\mypara{\bf Linux Reader-Writer Lock:} A reader-writer lock allows either +multiple concurrent readers or one exclusive writer. We can abstract +it with a boolean \code{writer\_lock} representing +whether the writer lock is held and an integer \code{reader\_cnt} +representing the number of threads that are reading. +We test this benchmark with a single lock that +protects shared variables. We have two threads that read and write +the shared variables under the protection of a read lock and a write +lock. + +\mypara{\bf MCS Lock:} This benchmark is an implementation of +the Mellor-Crummey and Scott lock~\cite{mcs-lock, + mcs-lock-url}. This lock queues waiting threads in a FIFO. +Our test driver utilizes two +threads that read and write shared variables with the protection of +the lock. + +\mypara{\bf M\&S Queue:} This benchmark is an adaptation of the +Michael and Scott lock free queue~\cite{lockfreequeue} to the C/C++ +memory model. We ran with two threads, one of which enqueues and the +other of which dequeues an item. + +\mypara{\bf SPSC Queue:} This is a lock-free single-producer, +single-consumer queue. +We used a test driver that has two +threads --- one enqueues a value and the other dequeues +it. + +\mypara{\bf MPMC Queue:} This is a multiple-producer, multiple-consumer +queue. Producers call \code{write\_prepare} to obtain a free +slot, update the slot, and call \code{write\_publish} to +publish it. Consumers call \code{read\_fetch} to obtain +a valid slot, read the slot, and call \code{read\_consume} +to free it. The specification focuses on the synchronization +properties which require \code{write\_publish} to synchronize with +\code{read\_fetch} to ensure the data integrity and +\code{read\_consume} to synchronize with \code{write\_prepare} to +ensure that slots are not prematurely recycled. The test driver +contains two threads, each of which enqueue and dequeue +an item. + +\subsection{Ease of Use} In addition to expressiveness, it is also important for +specification languages to be easy to use. In our experience using \TOOL +to specify the real-world data +structures in our benchmark set, we found that \TOOL was easy to use. \TOOL specifications have only three +parts --- equivalent sequential data structures, ordering points, and +synchronization properties, and we explain the reasons as follows. (1) Specifying +sequential data structures is easy and straightforward, and developers can often +just use an off-the-shelf implementation from a library. +(2) When developers specify ordering points, they +only need to know what operations order methods without needing to specify +the subtle reasoning about the corner cases involving +interleavings and reorderings introduced by relaxed memory models. Take the +Michael \& Scott queue as an example, we can easily order enqueuers with the +point when \code{enqueue} loads the \code{tail} pointer right before inserting the new +node. +(3) For synchronization, the fact that we allow specifying +synchronization at the abstraction of methods makes it easy. For example, we only used +36 lines to specify synchronization in a total 1,033 lines of +code (omitting blanks and comments). + +\begin{figure}[!htb] +\vspace{-.2cm} +{\footnotesize + \centering + + \resizebox{\columnwidth}{!}{ + \begin{tabular}{lrrr} + \hline + Benchmark & \# Executions & \# Feasible & Total Time (s) \\ + \hline + Chase-Lev Deque & 1,365 & 232 & 0.15 \\ + SPSC Queue & 19 & 15 & 0.01 \\ + RCU & 1269 & 756 & 0.11 \\ + Lockfree Hashtable & 30,941 & 25,731 & 11.39 \\ + MCS Lock & 19,501 & 13,546 & 2.62 \\ + MPMC Queue & 170,220 & 93,224 & 45.63 \\ % 1r2w + M\&S Queue & 168 & 114 & 0.05 \\ + Linux RW Lock & 148,053 & 405 & 13.06 \\ + % Results from: 2014-03-25-13:26 + % Flags: -y -m 2 -u 3 + \hline + \end{tabular} + } +\vspace{-.1cm} + \caption{\label{fig:benchmark_results} Benchmark results} +\vspace{-.3cm} +} +\end{figure} + +\mysubsection{Performance}\label{sec:performance} + +Figure~\ref{fig:benchmark_results} presents performance results for +\TOOL on our benchmark set. We list the number of +the total executions that \cdschecker has explored, the number of the feasible +executions that we checked the specification for, and the time the benchmark +took to complete. All of our benchmarks complete within one minute +and most take less than 3 seconds to complete. + +\mysubsection{Finding Bugs}\label{sec:findbugs} + +\begin{figure}[!htb] +\vspace{-.2cm} +{\footnotesize + \centering + + \resizebox{\columnwidth}{!}{ + \begin{tabular}{l|ccccc|c} + \hline + Benchmark & \# Injection & \# DR & \# UL & \# Correctness & \# Sync & Rate\\ + \hline + Chase-Lev Deque & 10 & 0 & 2 & 3 & 2 & 70\%\\ + SPSC Queue & 2 & 2 & 0 & 0 & 0 & 100\%\\ + RCU & 3 & 0 & 0 & 1 & 2 & 100\%\\ + Lockfree Hashtable & 5 & 0 & 0 & 0 & 2 & 40\%\\ + MCS Lock & 4 & 0 & 0 & 0 & 4 & 100\%\\ + MPMC Queue & 6 & 0 & 0 & 0 & 2 & 33\%\\ + M\&S Queue & 11 & 0 & 6 & 3 & 0 & 82\%\\ + Linux RW Lock & 8 & 0 & 0 & 0 & 8 & 100\%\\ + \hline + Total & 49 & 2 & 8 & 7 & 20 & 76\%\\ + \hline + + % Results from: 2014-03-25-17:08 + % Flags: -y -m 2 -u 3 + \end{tabular} + } +\vspace{-.2cm} + \caption{\label{fig:injection_results} Bug injection detection results} +\vspace{-.2cm} +} +\end{figure} + +The next component of the evaluation examines the effectiveness of \TOOL for finding bugs. + +\mypara{\bf New Bugs:} In the M\&S queue benchmark used +in~\cite{cdschecker}, the dequeue interface does not differentiate +between dequeuing the integer zero and returning that no item is +available, and it passed our initial specification. However, after +modifying the dequeue interface to match that in the original paper, +\TOOL is able to find a new bug that \cdschecker did not find. The +original test driver for this benchmark performed the enqueues first +to make it easy to write assertions that are valid for all executions. +\TOOL allows specification assertions to capture the behavior of the specific execution +and thus is able to discover the given bug. + +\mypara {\bf Injected Bugs:} To further evaluate \TOOL, +we injected bugs in our benchmarks by weakening the ordering +parameter of the atomic operations. These include +changing \code{release}, \code{acquire}, \code{acq\_rel} and +\code{seq\_cst} to \code{relaxed}. We weakened one operation per +each trial, and covered all of the atomic operations that our +tests exercise. While this injection strategy may not +reproduce all types of errors that developers make, it does +simulate errors that are caused by misunderstanding the +complicated semantics of relaxed memory models. + +This fault injection strategy will introduce one of two types of bugs. +The first type is a specification-independent bug, which can be +detected by the underlying \cdschecker infrastructure which includes +internal data races and uninitialized loads. The second type is a +specification-dependent bug, which passes the built-in checks +but violates the \TOOL specification. These include +failed assertions and synchronization violations. We +classifying bugs as follows. If \cdschecker reports a data +race or an uninitialized load, \TOOL reports the error and stops. +If not, \TOOL continues to check the +execution against the specification. It first +checks for violations of the preconditions and postconditions and then for +violations of the synchronization specification. + +Figure~\ref{fig:injection_results} shows the results of the injection +detection. The column \textit{DR} represents data races, \textit{UL} represents +uninitialized loads, \textit{correctness} represents a failed precondition or +postcondition, and +\textit{sync} represents a synchronization violation. The detection rate is the +number of injections for which we detected a bug divided by the total +number of injections. + +\mypara{\bf Linux Reader-Writer Lock:} Our initial specification for this +benchmark did not allow \code{write\_trylock} to spuriously fail. +However, when we checked this benchmark against that specification, +\TOOL checker reports a correctness violation. We then analyzed the code +and found that \code{write\_trylock} first subtracts a bias from the +\code{lock} variable to attempt to acquire the lock, and restores that +bias if the attempt to acquire the lock fails. In the scenario where +two \code{write\_trylock} are racing for the lock before the lock is +released, one \code{write\_trylock} can first decrement the lock +variable, the lock can be released by the original holder, and then +the second \code{write\_trylock} can attempt to acquire the lock. +Even though the history indicates that the lock is unlocked, it +still holds a transient value due to the partially completed first +\code{write\_trylock} invocation. Thus, the second +\code{write\_trylock} invocation will also fail. As the second +\code{write\_trylock} serializes after both the first unsuccessful +\code{write\_trylock} and the \code{unlock} operation, +the sequential specification would force it to succeed. We then modified +the specification +of \code{write\_trylock} to allow spurious failures so that our correctness +model fits this data structure. This shows +\TOOL can help developers iteratively refine the +specifications of their data structures. By analyzing the \TOOL +diagnostic report, developers can better understand +any inconsistencies between the specification and the +implementation. + +\mypara{\bf MCS Lock:} Three of the weakened +operations are not detected because they cause the execution +to fail to terminate (and hit a trace bound). We +reviewed the code and found that weakening any of those three +operations makes the lock spin forever. + +\mypara{\bf M\&S Queue:} Our test driver does not cause +an enqueue or dequeue thread to help another +enqueue thread update the tail pointer, which corresponds to two of the +undetected injections. + +\mypara{\bf Lockfree Hashtable:} Our experiment only focuses on the two +primitive methods, \code{get} and \code{put} without triggering the +\code{resize}. We were able to successfully check all executions from a test driver for the lockfree hash table that generates executions that have no program order preserving sequential histories. + +\mypara{\bf MPMC Queue:} The undetected injections in this benchmark are +primarily due to the limitation of our test driver. One +synchronization property of this benchmark is +that \code{read\_consume} should synchronize with the +next \code{write\_prepare} to ensure that a slot cannot be reused +before the consumer has finished with the slot. Our test driver is +unable to reach this case so those injections are not detected. + +From our experiments on concurrent data structures, we can see that +\TOOL checker can help detect incorrect memory orderings, +help developers refine data structure specifications, +and help determine whether strong memory orderings are really +necessary. Since \TOOL checker is a unit testing tool, it is limited +to small-scale tests to explore common usage scenarios of the data +structures. As a unit testing tool, \TOOL was able to find 100\% of +injections for many data structures and to find 76\% of the injections +on average. For our 49 injections, 10 of them were detected by checks +in \cdschecker, and 27 additional injections were detected by +\TOOL. This shows that by writing specifications, we detect +significantly more fault injections. diff --git a/correctness-model/writeup/example.tex b/correctness-model/writeup/example.tex new file mode 100644 index 0000000..3ee4f3d --- /dev/null +++ b/correctness-model/writeup/example.tex @@ -0,0 +1,165 @@ +\mysection{Motivating Example} +\label{sec:example} + +We will use the read-copy update (RCU)~\cite{rcu} implementation in +Figure~\ref{fig:rcuexample} as a running example. RCU data structures +are useful for usage scenarios with large numbers of reads and +relatively few updates. RCU based data structures scale to large +numbers of readers because read operations do not contain any +low-level store operations and thus do not generate coherence traffic to invalidate cache lines. +Lines~\ref{line:rcuBegin} through~\ref{line:rcuEnd} contain +the code for the RCU implementation, and +Lines~\ref{line:testcaseBegin} through~\ref{line:testcaseEnd} show a +test case for the implementation. + +The RCU implementation maintains a shared pointer +(Line~\ref{line:rcuSharedData}) +\code{node} to reference the data shared by readers and +updaters. A reader loads the shared pointer (Line~\ref{line:rcuReadLoad}) to read +the shared data, while an updater allocates a new struct +(Line~\ref{line:rcuUpdateAlloc}), loads the shared pointer +(Line~\ref{line:rcuUpdateLoad}), and then attempts a compare and swap (CAS) operation to update the shared pointer. This process repeats until the CAS is successful. + +\begin{figure}[h] +\vspace{-.2cm} +\begin{lstlisting}[xleftmargin=6.0ex] +#define mo_acquire memory_order_acquire +#define mo_acq_rel memory_order_acq_rel +struct Node {/*@ \label{line:rcuBegin} @*/ + int data ; + int version; +}; + +class RCU { + atomic node;/*@ \label{line:rcuSharedData} @*/ + public: + RCU() { + Node *n = new Node; + n->data= 0; + n->version = 0; + atomic_init(&node, n); + } + void read(int *data, int *version) { + Node *res = node.load(mo_acquire);/*@ \label{line:rcuReadLoad} @*/ + *data = res->data; + *version = res->version; + } + void update(int data) { + bool succ = false; + Node *newNode = new Node;/*@ \label{line:rcuUpdateAlloc} @*/ + Node *prev = node.load(mo_acquire);/*@ \label{line:rcuUpdateLoad} @*/ + do { + newNode->data = data; + newNode->version = prev->version + 1; + succ = node.compare_exchange_strong(prev,/*@ \label{line:rcuUpdateCAS} @*/ + newNode, mo_acq_rel, mo_acquire);/*@ \label{line:rcuUpdateCASMO} @*/ + } while (!succ); + } +};/*@ \label{line:rcuEnd} @*/ + +RCU x, y; // Define two RCU objects/*@ \label{line:testcaseBegin} @*/ +int r1, r2, v1, v2; +void thrd_1() { // Thread 1/*@ \label{line:thrd1} @*/ + x.update(1); + y.read(&r1, &v1); // r1 == 0 +} +void thrd_2() { // Thread 2/*@ \label{line:thrd2} @*/ + y.update(1); + x.read(&r2, &v2); // r2 == 0 +}/*@ \label{line:testcaseEnd} @*/ +\end{lstlisting} +\vspace{-.2cm} +\caption{\label{fig:rcuexample}C++11 read-copy update example} +\vspace{-.3cm} +\end{figure} + +\begin{figure}[t] + \centering +\vspace{-.3cm} + \resizebox{\columnwidth}{!}{ + \includegraphics[scale=0.33]{figures/rcuhistory} + } + \vspace{-.4cm} + \caption{\label{fig:rcuhistory}History of a possible execution of two RCU objects} +\vspace{-.4cm} +\end{figure} + +This implementation uses low-level atomic operations provided by +C/C++ to implement the RCU mechanism. For example, in +Line~\ref{line:rcuUpdateCAS}, the \code{update} method uses a CAS +operation to update the \code{node}. The memory +order parameters attached to the atomic operations ensure that memory +accesses that were performed before the \code{update} operation must +occur before memory accesses that were performed after the \code{read} +operation. + +\mysubsection{Consistency Model} +\label{sec:exampleMotivation} + +In the example code, two threads, Thread~1 and Thread~2, each update +one of the RCU objects \code{x} and \code{y}, respectively, and then +access the object updated by the other thread. Under the C/C++ +memory model, this example admits an execution in which both Thread~1 +and Thread~2 read the initial value 0. + +Figure~\ref{fig:rcuhistory} shows a possible order for this +execution in which the model checker processes statements in the order shown in +the +execution labeled Original Trace\footnote{Note that the C/C++ memory +model does not include any notion of a trace. We merely use the term +trace to refer to the order in which \TOOL prints the execution.}, +which is an interleaving of the invocation and response events of +API methods indicated by \lq\lq\_i\rq\rq and \lq\lq\_r\rq\rq, +respectively. + +This trace is rather counter-intuitive because it orders +Thread~1's \code{update} event before Thread~2's \code{read} event, +yet Thread~2's \code{read} event does not observe the updated value. +However, under the C/C++11 memory model, this is allowed since a load +is allowed to read a value that is written by an old store. + +It is important to note that it is impossible to produce a sequential history +for this example that preserves program order and produces the observed +behavior. This means that traditional notions of correctness that relate +concurrent executions to sequential executions that were developed for +the SC memory model cannot directly be applied to the C/C++11 memory +model. + +This example leads to the following conclusion --- if we want to +define the behavior of concurrent executions by relating them to +equivalent sequential histories, then we must give up on preserving +program order. + +We note that for this example, if we give up on program order, we +produce the sequential history in Figure~\ref{fig:rcuhistory} +labeled Reordered Trace. The data structure operations in this +sequential history have behavior that is consistent with the observed +behaviors in the example execution. + +\mysubsection{Synchronization Properties} + +A correct RCU data structure ensures the property that the invocation +event of an \code{update} operation happens-before the response event +of the subsequent +\code{read} operation. Informally, all operations that appear before the \code{update} operation must appear to occur before the operations that appear after the \code{read} operation. While these +semantics follow naturally for SC, for relaxed memory models we must +ensure that neither the compiler nor the processor performs +reorderings that violate these semantics. Therefore, when a reader +reads the fields of the +\code{node}, +data races are eliminated since the \code{read} operation synchronizes with the \code{update} operation. + + +In the C/C++11 memory model, the transitive closure of +\textit{sequence-before} and \textit{synchronizes-with} relations form the +\textit{happens-before} relation in the absence of operations with the \code{consume} memory order. Since every time an \code{update} operation finishes, a CAS operation to +\code{node} with release semantics is executed, and the subsequent \code{read} +loads the \code{node} reference with acquire semantics, the \code{read} operation synchronizes +with the \code{update} operation, providing the necessary synchronization properties. +Some RCU implementations may use consume semantics instead of acquire semantics, +however we do not use consume for the following two reasons: (1) most existing +C/C++ compilers do not support consume semantics and thus acquire does not +involve extra overhead and (2) using consume semantics provides a more complex interface to +clients that may require them to explicitly declare dependences throughout the code. + + diff --git a/correctness-model/writeup/figures/CVS/Entries b/correctness-model/writeup/figures/CVS/Entries new file mode 100644 index 0000000..998018a --- /dev/null +++ b/correctness-model/writeup/figures/CVS/Entries @@ -0,0 +1,42 @@ +/fence_sw.dot/1.1/Wed Jan 14 22:53:32 2015// +/fence_sw2.dot/1.1/Wed Jan 14 22:53:32 2015// +/fence_sw_r_collapse.dot/1.1/Wed Jan 14 22:53:32 2015// +/fence_sw_r_collapse2.dot/1.1/Wed Jan 14 22:53:32 2015// +/fence_sw_w_collapse.dot/1.1/Wed Jan 14 22:53:32 2015// +/fence_sw_w_collapse2.dot/1.1/Wed Jan 14 22:53:32 2015// +/ff_sc_rf.dot/1.1/Wed Jan 14 22:53:32 2015// +/ff_sc_rf2.dot/1.1/Wed Jan 14 22:53:32 2015// +/fw_sc_rf.dot/1.1/Wed Jan 14 22:53:32 2015// +/fw_sc_rf2.dot/1.1/Wed Jan 14 22:53:32 2015// +/lockhistory.pdf/1.1/Wed Jan 14 22:53:32 2015/-kb/ +/release_seq.pdf/1.1/Wed Jan 14 22:53:32 2015/-kb/ +/rmw_atomicity.dot/1.1/Wed Jan 14 22:53:32 2015// +/rmw_atomicity2.dot/1.1/Wed Jan 14 22:53:32 2015// +/rmw_mo.dot/1.1/Wed Jan 14 22:53:32 2015// +/rmw_mo2.dot/1.1/Wed Jan 14 22:53:32 2015// +/rr_mo.dot/1.1/Wed Jan 14 22:53:32 2015// +/rr_mo2.dot/1.1/Wed Jan 14 22:53:32 2015// +/rw_mo.dot/1.1/Wed Jan 14 22:53:32 2015// +/rw_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/sc_mo.dot/1.1/Wed Jan 14 22:53:33 2015// +/sc_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/sc_wr_mo.dot/1.1/Wed Jan 14 22:53:33 2015// +/sc_wr_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/specdesign.pdf/1.1/Wed Jan 14 22:53:33 2015/-kb/ +/specworkflow.pdf/1.1/Wed Jan 14 22:53:33 2015/-kb/ +/wf_sc_rf.dot/1.1/Wed Jan 14 22:53:33 2015// +/wf_sc_rf2.dot/1.1/Wed Jan 14 22:53:33 2015// +/workflow.pdf/1.1/Wed Jan 14 22:53:33 2015/-kb/ +/wr_mo.dot/1.1/Wed Jan 14 22:53:33 2015// +/wr_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_mo.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_first_collapse.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_first_collapse2.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_mo.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_mo2.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_second_collapse.dot/1.1/Wed Jan 14 22:53:33 2015// +/ww_sc_fence_second_collapse2.dot/1.1/Wed Jan 14 22:53:33 2015// +/rcuhistory.odg/1.2/Wed Jan 21 22:50:28 2015// +/rcuhistory.pdf/1.4/Wed Jan 21 22:50:15 2015/-kb/ +D diff --git a/correctness-model/writeup/figures/CVS/Repository b/correctness-model/writeup/figures/CVS/Repository new file mode 100644 index 0000000..aadc881 --- /dev/null +++ b/correctness-model/writeup/figures/CVS/Repository @@ -0,0 +1 @@ +Papers/15/issta.cdsspec/figures diff --git a/correctness-model/writeup/figures/CVS/Root b/correctness-model/writeup/figures/CVS/Root new file mode 100644 index 0000000..cd8b2f1 --- /dev/null +++ b/correctness-model/writeup/figures/CVS/Root @@ -0,0 +1 @@ +:ext:peizhaoo@plrg.eecs.uci.edu:/home/cvs/Papers diff --git a/correctness-model/writeup/figures/fence_sw.dot b/correctness-model/writeup/figures/fence_sw.dot new file mode 100644 index 0000000..1d4bbd4 --- /dev/null +++ b/correctness-model/writeup/figures/fence_sw.dot @@ -0,0 +1,20 @@ +digraph fence_sw { +margin=0 +ranksep=.3; + +N1 [label="A: fence(release)", shape=none]; +N2 [label="X: v.store(1)", shape=none]; +N3 [label="Y: v.store(2)", shape=none]; +N4 [label="Z: v.load()", shape=none]; +N5 [label="B: fence(acquire)", shape=none]; +N6 [style=invis, shape=point]; + +//N1 -> N5 [label="sw", color=blue, penwidth=3, constraint=false]; +N2 -> N3 [label="hrs", color="#555555"]; +N3 -> N4 [label="rf", color=red]; +N1 -> N2 [label="sb", color=blue, weight=100]; +N4 -> N5 [label="sb", color=blue, weight=100]; +N2 -> N6 [style=invis]; +N6 -> N3 [style=invis]; +{rank=same; N3 N4 N6} +} diff --git a/correctness-model/writeup/figures/fence_sw2.dot b/correctness-model/writeup/figures/fence_sw2.dot new file mode 100644 index 0000000..ed4ec19 --- /dev/null +++ b/correctness-model/writeup/figures/fence_sw2.dot @@ -0,0 +1,14 @@ +digraph fence_sw2 { +margin=0 +//ranksep=.3; + +N1 [label="A: fence(release)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: fence(acquire)", shape=none]; + +N1 -> N4 [label="sw", color=blue, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/correctness-model/writeup/figures/fence_sw_r_collapse.dot b/correctness-model/writeup/figures/fence_sw_r_collapse.dot new file mode 100644 index 0000000..ee169e1 --- /dev/null +++ b/correctness-model/writeup/figures/fence_sw_r_collapse.dot @@ -0,0 +1,18 @@ +digraph fence_sw_r_collpase { +margin=0 +ranksep=.3; + +N1 [label="A: fence(release)", shape=none]; +N2 [label="X: v.store(1)", shape=none]; +N3 [label="Y: v.store(2)", shape=none]; +N5 [label="B: load(acquire)", shape=none]; +N6 [style=invis, shape=point]; + +//N1 -> N5 [label="sw", color=blue, penwidth=3, constraint=false]; +N2 -> N3 [label="hrs", color="#555555"]; +N3 -> N5 [label="rf", color=red]; +N1 -> N2 [label="sb", color=blue, weight=100]; +N2 -> N6 [style=invis]; +N6 -> N3 [style=invis]; +{rank=same; N3 N5 N6} +} diff --git a/correctness-model/writeup/figures/fence_sw_r_collapse2.dot b/correctness-model/writeup/figures/fence_sw_r_collapse2.dot new file mode 100644 index 0000000..6cc0981 --- /dev/null +++ b/correctness-model/writeup/figures/fence_sw_r_collapse2.dot @@ -0,0 +1,14 @@ +digraph fence_sw_r_collpase2 { +margin=0 +//ranksep=.3; + +N1 [label="A: fence(release)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: load(acquire)", shape=none]; + +N1 -> N4 [label="sw", color=blue, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/correctness-model/writeup/figures/fence_sw_w_collapse.dot b/correctness-model/writeup/figures/fence_sw_w_collapse.dot new file mode 100644 index 0000000..3c0a864 --- /dev/null +++ b/correctness-model/writeup/figures/fence_sw_w_collapse.dot @@ -0,0 +1,18 @@ +digraph fence_sw_w_collapse { +margin=0 +ranksep=.3; + +N1 [label="A: store(release)", shape=none]; +N3 [label="Y: v.store(2)", shape=none]; +N4 [label="Z: v.load()", shape=none]; +N5 [label="B: fence(acquire)", shape=none]; +N6 [style=invis, shape=point]; + +//N1 -> N5 [label="sw", color=blue, penwidth=3, constraint=false]; +N1 -> N3 [label="rs", color="#555555"]; +N3 -> N4 [label="rf", color=red]; +N4 -> N5 [label="sb", color=blue, weight=100]; +N1 -> N6 [style=invis]; +N6 -> N3 [style=invis]; +{rank=same; N3 N4 N6} +} diff --git a/correctness-model/writeup/figures/fence_sw_w_collapse2.dot b/correctness-model/writeup/figures/fence_sw_w_collapse2.dot new file mode 100644 index 0000000..f1325f5 --- /dev/null +++ b/correctness-model/writeup/figures/fence_sw_w_collapse2.dot @@ -0,0 +1,14 @@ +digraph fence_sw_w_collapse2 { +margin=0 +//ranksep=.3; + +N1 [label="A: store(release)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: fence(acquire)", shape=none]; + +N1 -> N4 [label="sw", color=blue, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/correctness-model/writeup/figures/ff_sc_rf.dot b/correctness-model/writeup/figures/ff_sc_rf.dot new file mode 100644 index 0000000..981e3fe --- /dev/null +++ b/correctness-model/writeup/figures/ff_sc_rf.dot @@ -0,0 +1,18 @@ +digraph ff_sc_rf { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="X: fence(seq-cst)", shape=none]; +N3 [label="Y: fence(seq-cst)", shape=none]; +N4 [label="B: v.store(2)", shape=none]; +N5 [label="C: v.load()", shape=none]; + +//N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N2 -> N3 [label="sc", color=purple]; +N1 -> N2 [label="sb", color=blue, weight=100]; +N3 -> N5 [label="sb", color=blue, weight=100]; +N4 -> N5 [label="rf", color=red]; +N2 -> N4 [style=invis]; +{rank=same; N4 N5} +} diff --git a/correctness-model/writeup/figures/ff_sc_rf2.dot b/correctness-model/writeup/figures/ff_sc_rf2.dot new file mode 100644 index 0000000..40f84ce --- /dev/null +++ b/correctness-model/writeup/figures/ff_sc_rf2.dot @@ -0,0 +1,18 @@ +digraph ff_sc_rf2 { +margin=0 +//ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +//N2 [label="X: fence(seq-cst)", shape=none]; +//N3 [label="Y: fence(seq-cst)", shape=none]; +N4 [label="B: v.store(2)", shape=none]; +//N5 [label="C: v.load()", shape=none]; + +N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +//N2 -> N3 [label="sc", color=purple]; +//N1 -> N2 [label="sb", color=blue, weight=100]; +//N3 -> N5 [label="sb", color=blue, weight=100]; +//N4 -> N5 [label="rf", color=red, constraint=false]; +//N2 -> N4 [style=invis]; +//{rank=same; N2 N3} +} diff --git a/correctness-model/writeup/figures/fw_sc_rf.dot b/correctness-model/writeup/figures/fw_sc_rf.dot new file mode 100644 index 0000000..68ead64 --- /dev/null +++ b/correctness-model/writeup/figures/fw_sc_rf.dot @@ -0,0 +1,16 @@ +digraph fw_sc_rf { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="X: fence(seq-cst)", shape=none]; +N3 [label="B: v.store(2)", shape=none]; +N4 [label="Y: v.load(seq-cst)", shape=none]; + +//N1 -> N3 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N1 -> N2 [label="sb", color=blue]; +N2 -> N4 [label="sc", color=purple]; +N2 -> N3 [style=invis]; +N3 -> N4 [label="rf", color=red]; +{rank=same; N3 N4} +} diff --git a/correctness-model/writeup/figures/fw_sc_rf2.dot b/correctness-model/writeup/figures/fw_sc_rf2.dot new file mode 100644 index 0000000..6f947b1 --- /dev/null +++ b/correctness-model/writeup/figures/fw_sc_rf2.dot @@ -0,0 +1,16 @@ +digraph fw_sc_rf2 { +margin=0 +//ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +//N2 [style=invis, shape=dot]; +N3 [label="B: v.store(2)", shape=none]; +//N4 [style=invis, shape=dot]; + +N1 -> N3 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +//N1 -> N2 [label="sb", color=blue]; +//N2 -> N4 [label="sc", color=purple]; +//N2 -> N3 [style=invis]; +//N3 -> N4 [label="rf", color=red]; +//{rank=same; N3 N4} +} diff --git a/correctness-model/writeup/figures/lockhistory.pdf b/correctness-model/writeup/figures/lockhistory.pdf new file mode 100644 index 0000000000000000000000000000000000000000..3563feaf3937b7420cf9b49b3955379e2e28180a GIT binary patch literal 19791 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ý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%0DDI9DIj@-_w?eTBEQ9l~hL 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 ZaaC3V;+YH&03bjASf2Z;Fw4u;{{x`cCE)-7 literal 0 HcmV?d00001 diff --git a/correctness-model/writeup/figures/rcuhistory.pdf b/correctness-model/writeup/figures/rcuhistory.pdf new file mode 100644 index 0000000000000000000000000000000000000000..07df89cb02131a3ca510d58270d9eb1266f17fac GIT binary patch literal 20096 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/OCGs[6 0 R]>>/Pages 3 0 R/Type/Catalog>> endobj 2 0 obj <>stream + + + + + Adobe Illustrator CS4 + 2012-11-08T19:47:19-08:00 + 2012-11-08T19:47:19-08:00 + 2012-11-08T19:47:19-08:00 + + + + 256 + 120 + JPEG + /9j/4AAQSkZJRgABAgEASABIAAD/7QAsUGhvdG9zaG9wIDMuMAA4QklNA+0AAAAAABAASAAAAAEA AQBIAAAAAQAB/+4ADkFkb2JlAGTAAAAAAf/bAIQABgQEBAUEBgUFBgkGBQYJCwgGBggLDAoKCwoK DBAMDAwMDAwQDA4PEA8ODBMTFBQTExwbGxscHx8fHx8fHx8fHwEHBwcNDA0YEBAYGhURFRofHx8f Hx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8fHx8f/8AAEQgAeAEAAwER AAIRAQMRAf/EAaIAAAAHAQEBAQEAAAAAAAAAAAQFAwIGAQAHCAkKCwEAAgIDAQEBAQEAAAAAAAAA AQACAwQFBgcICQoLEAACAQMDAgQCBgcDBAIGAnMBAgMRBAAFIRIxQVEGE2EicYEUMpGhBxWxQiPB UtHhMxZi8CRygvElQzRTkqKyY3PCNUQnk6OzNhdUZHTD0uIIJoMJChgZhJRFRqS0VtNVKBry4/PE 1OT0ZXWFlaW1xdXl9WZ2hpamtsbW5vY3R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo+Ck5SVlpeYmZ qbnJ2en5KjpKWmp6ipqqusra6voRAAICAQIDBQUEBQYECAMDbQEAAhEDBCESMUEFURNhIgZxgZEy obHwFMHR4SNCFVJicvEzJDRDghaSUyWiY7LCB3PSNeJEgxdUkwgJChgZJjZFGidkdFU38qOzwygp 0+PzhJSktMTU5PRldYWVpbXF1eX1RlZmdoaWprbG1ub2R1dnd4eXp7fH1+f3OEhYaHiImKi4yNjo +DlJWWl5iZmpucnZ6fkqOkpaanqKmqq6ytrq+v/aAAwDAQACEQMRAD8A9LXvmXQ7HXdN0G6u1i1b WEnk021IYmVbVVeajAFRxVwaMRXelaHFVlz5v8p2qSPc63YQJC4ilaS6hQJI0ssARizCjGa2ljof 2kZeqmiqAs/zM/Lu8svrtv5m0trURpM8hvIE4RyOI0aQMyslXYL8QHxGnXFVSL8wvJc+oWGn2urQ 3dxqbBLJrXlcROxSWQL60IeJSUtpD8TD7OKrta/MDyPoi3/6V16xtZNMUPf27zxmeLlE06KYFJl5 vEhZFC8mH2QcVVW87eTUleF9e09Jo/W9SJ7qFXT6tH60/JSwZfSiPOSo+FdzQYqvsfOHlXUNQj0/ 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 FjtYUjUiqBT8Rrsq/wD/2Q== + + + + + + Adobe PDF library 9.00 + + + application/pdf + + + release_seq_final + + + + + 1 + False + False + + 558.000000 + 261.000000 + Points + + + + + TeXGyreHeros + TeXGyreHeros + Unknown + Version 2.037;PS 2.000;hotconv 1.0.51;makeotf.lib2.0.18671 + False + MyriadPro-Regular.otf + + + + + + Cyan + Magenta + Yellow + Black + + + + + + Default Swatch Group + 0 + + + + + + xmp.did:01801174072068118F62BC2FBF2D0DDE + uuid:b6550317-f02c-e943-99b1-a50cb06f5ab2 + xmp.did:F77F11740720681184ABF8CADCB1BF49 + proof:pdf + + uuid:ba4dbd99-36b2-2d4a-a0d2-e8c58b81b3c8 + xmp.did:01801174072068118F62D9F7CDB3ECB2 + xmp.did:F77F11740720681184ABF8CADCB1BF49 + proof:pdf + + + + + saved + xmp.iid:F77F11740720681184ABF8CADCB1BF49 + 2012-11-08T17:43:18-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:F87F11740720681184ABF8CADCB1BF49 + 2012-11-08T18:19:13-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:01801174072068118F62D9F7CDB3ECB2 + 2012-11-08T18:34:52-08:00 + Adobe Illustrator CS4 + / + + + saved + xmp.iid:01801174072068118F62BC2FBF2D0DDE + 2012-11-08T19:47:17-08:00 + Adobe Illustrator CS4 + / + + + + + + + + + + + + + + + + + + + + + + + + + + + + endstream endobj 3 0 obj <> endobj 8 0 obj <>/Resources<>/Font<>/ProcSet[/PDF/Text]/Properties<>>>/Thumb 12 0 R/TrimBox[0.0 0.0 558.0 261.0]/Type/Page>> endobj 9 0 obj <>stream +H‰ÌWÛnG }߯˜G莇œ{ßjÇPÀ(Ò胮Ç-ìNÚ¦Ÿßùh¥UKN ++‹æpx;‡ÜãŸNÕñù©Q'/NÕ@J>Þ Ç/_õîã`”QÞ'Åâ·Ãíð‘üáؤ¿¨?£½a…'ɃYýür`õI9u®.ˆßu£†G‹¤œÍšBðŠ’×^]?”›tÌ°Œoç¼Â?­µjÌ^3iòAdc‘_£×)fH¢ÓތD8IQtX§„³äY›VFpˆ’ÑQ §““@ØhŠP†]+Ñk\¢¬…;±á V1è`Þ:9í3— ®‡»áõð +Ÿ“e‰Æ”D.éR^Þä´1¦*÷¿ƒb‰%'§–Ã⇣å’Ê”¡³¼ßW!'U ª€‹üS.¸&ÐýHl‚U`c7úW05Áûv-wM骂·í–Ô¯ýuщ]BM%Û*¸X|w”áï›å"64·í綻Æ}3Ýݹ€ +›ÅU3•ÝÙÊT÷òHÙé'-TÚÊpœgØ~ƒ ó᦭ wGx–a$ø©îxºód#Í-Ü®ño¸6nZtÎmäýl¹›. + €#&J Ê%ð':ðQû Y¾/ЪŠ@ÕÚ©È:dxŽ׉„ 0 +Á=~_w ¯WÏ9hÊõkØ~Òd“Œ@œÓÁ5`ouÈoO'¨™'Iƒ'w™Ëe#nOÆ+'ì˜ÁsN!>J0 +¢òÂz-ÍêfhL¡tVí¶k=ÀӒ_yoJå^¹¤c@TlPɘ©$ã¡&#ùÞ¶BÁ…{q½'ò³ÞŠÏ ÃŽ‘9X/ÐñD¸Ê(¤ÙöÆ]ur?>¡°«\Ío¸n‚þû±Ûè>ýݶ ~ï˜ëaìÁÏBT¨EM¨Üªª±yLAt ±Ã¤C×0چbR–}U`ò(Dš:g=çH4e†£Ó0 ×0¤¨­V)@ +:ã²CZ‡Ô…pnÀ¨'f0~Ôlž¶|{xÛ¸Þ%úˆÌâ¶O¯í ÓOnQý¬.w2¼.§ F0·jƛ#ÊxT¹É[]כj>]¿Šûw Ú/pÿÖ°Þâ~{@§~ŽÚØYM›XÜ°m¹©v.¸8‚ײWÁ¢þ`<·TÌøŸS#–¼(¼¸7M[0RÊ9+&Ò!Áâ5õÑþþ‰`ª÷³@P  ¸k­£˜F$aqºßÛ[ö 6ž2ODºUáÛºîÄÂÔ¯âáEU ®×ýÐh½ +G’ÝÕ]»‘Ñ5î:1öîºlqµù]màäy×­6Ž'#û( ÝR›÷_ÅþW8±Vöò ‡|L(<¤î¡¬®è´€Mjd#öü„•Òdê2yp@.‰=Y‘ý`ët.¤Ž7-Ì '˒ÃÛÕ!Ôî ¼Àå5.„ð̀g¹Ì4þLr¢¬È  Ž(öǝ•%®¼§bÈùìâ&îzµowÖað‹ æ¥á'_¶RHou +Í×zj³LY +„иV&Ìn–°n°cÒ²æRºƒ*ÔG»óHd +_õ¦ÓRzô–¬ÆëÃ~¯ÕÙ$1‚ †\8,ø-/KX„²pëÁ]v~ªðõŸÒj‰ endstream endobj 12 0 obj <>stream +8;X^=acXLq#Xrl5!h:6uI-P+\M-NSacjlKJm&EpL/R(-:5Mo"@rfI.==)2c"%X:Ua-9Wt7C;u[ +:bOoR%n$'j&P3-EB-'m6Q?j0^Ak"Gfd%mUtM,X&9FB!22>F!O5]<*CYKrfdBFp\@$ +GZ%N63\rfIN*Se]%P1]:F^\4GQ;OqUCXmM'Wha.32p33moLj_\WI#0,K3QG[k2^I0q^H'>7amk"$WP12 +]<;58LL#1)~> endstream endobj 13 0 obj [/Indexed/DeviceRGB 255 14 0 R] endobj 14 0 obj <>stream +8;X]O>EqN@%''O_@%e@?J;%+8(9e>X=MR6S?i^YgA3=].HDXF.R$lIL@"pJ+EP(%0 +b]6ajmNZn*!='OQZeQ^Y*,=]?C.B+\Ulg9dhD*"iC[;*=3`oP1[!S^)?1)IZ4dup` +E1r!/,*0[*9.aFIR2&b-C#soRZ7Dl%MLY\.?d>Mn +6%Q2oYfNRF$$+ON<+]RUJmC0InDZ4OTs0S!saG>GGKUlQ*Q?45:CI&4J'_2j$XKrcYp0n+Xl_nU*O( +l[$6Nn+Z_Nq0]s7hs]`XX1nZ8&94a\~> endstream endobj 6 0 obj <> endobj 15 0 obj [/View/Design] endobj 16 0 obj <>>> endobj 5 0 obj <> endobj 17 0 obj <> endobj 18 0 obj <>stream +H‰|T Li®¢»ªaÔV(‹u»fªj=@Q :è ‚ˆ‚$ŒÝÒÜØ݀JëDéæÒu‚àȀ8Š‚0\‚ 2^Èpj{Ž'‡ºÊxìh^áÏl¶šÄd“M6ùóþÿ½ÿßûò½W…cR ÇñÉ˼6¬÷öŸ¤Úè½C£òQi´æ8'0¸0E*|9žFóQΧOŸüx9Q˜dÝöå/m0 1û7>Äš¨HµŽŸ¿h‘³£ÙºŒY7GÞyÞ¼ycօ_¦LWñ;´:Uœ–_‘ ILЄéTJ'~Yl,?¡å5*­J“lhtªñžßÁ;Šñu¼øæ[WGWwg'~µX9LÉGiyU”N­Òða"@d”XC#æé4aJU\˜&†O0ßü—»õÿÐá£ây‹Ž2{:1¨åÃâ•sE”„±* Iñ:M”Jë4wE`ЎDïÎ+U[1Qìpl†MÄ0c0lªóÄ°å¶ÇVãX†­“aSÍ⭝ï±zìö§ñüïø#‹µ?X|”|%q’KÇKWK›‰IÄZ"¸A<$ƒÈ<™Dæ-+’õ[αŒ´¼i5ݐÙ" ·à¢Þ"ɔ +†‘€Q 9è*–Â?ƑˆG—h0;£‡e£äwcgXŠDŸZió ™=9j£4aä2þëm lñ¥ýÜ|6Z¢ =hr‡;ÛCz½  +V(À·hÓös +̸-@èŽ'Ý09 6ZÂFo ý±ÞäMû6D!ò B´×LV>;/gÉ}dEÿÔԒҧ{§è—'òIþ–r=Øà­0Nzºªôä¹*m™Z­IŒŒ,M¬àä¹ÅÉBç£ÌÐ?¥ª@oût„õ$©^4õë" ډlRž›iŽ˜p$Â[jȖ]¼@ÀW0¥Æ+^¼Fü2ßø­›ÙŸV'N7Ÿ¾Æ —¯YéðµZŒœ¹>D°L¤a ÛÁ¿_H@¯èª’“•Uº²È(Ͷ­j3ôQú?19àÅɠ{"ÇB;uOð5} © ±;GÓÄíυÄÙjâXÝêeAmn]îϖÙd®27âèæn´~Šüçý=PÐ ºn›»ý ôyA}¸›M§ŸjL¿Î€ÅÝãõ\噒óWo=/­:ÊæÈ(¡ïDÕ.Å¥¤u[xԅñ_³ŸŠë_Kç”äÔ0×b–ø‡Ì㍬™~û÷­çúýèC%Ï3à7d‡dpÈ×~òŠÉÊIbåúL¤ß‚(~G찇0…F§M£øŸ …I&tÒ¡€”µøe‰§t“`h‘É“õÑɐÙ:m* ì)Õ,̇úuä;4sMÀNM{<€(©hÊodÞdå-W*öʐÖ´UÈJáÕ²â÷Þ֊ê“lI¥^C< œ5ÖÖ)6ÑTó÷{ {ÙðÝ᫘ͪ²«ÿ¼èµ‘“wéûTÉ’^ˆM±1õùAªÙÖ4•ºÅbŒfïTó¡âÌúU]Nìc‹g° ìÜÞ¢ K£‚c9#\q!ûG—ÓÙGròØ®c—ë®1¯ZÜg!I°§Óª uí»8CnF^žB¤¿)`}xõ D°Lë5Ñi›˜Ùßô‚ôíõÇ ¹p6M_Ìï&òµ¡ùä<áÈÍ|5ì:/å•pòvýMåg²Õƒpª_”Ç~$„FuFYuRH¥'ƒ¬ìk‡ìŸÏ«WkÛÊÆä8èFÜ'gÍõ +á‘Ìeô ½;#͐ÆR;»‚#˜9!ÿØöÛó® ¡Aù\Ž>+U¯õ½àÑS;ðê'÷T"„C2›•L1,Z€þæŠHd‡ìg‚ý¶¢‚rvW±;F©÷cœ=›aœ‘Ëê ÛW?bޔºepr)þ\»añMüQ¿–Ø +®`Ս¬Êdw~è¼SVt`>{¤‡8¼sÛá&|óž˜h.B¹kµ·BçãÓ=ê*“·Šù‹L¢¸iô“íœ' ³òå³ME 5W˜Ç§|—p¨|je°xZotì¾Ômlbj’n·ÆÒ—rô£ˆ²=å=à67w ^‚«­°}Áèvõ®ačŽNÒÄÅkÏT—ž.O*‰/N 1W5— Qà‰ˆ²øÖ^qržAœyQM¶Ï <š]xèÛPPÛÐÆtW-åPý3h•æ=˜ÏÖVW]dú*ƒæp¨ìTÉÀñÎ746-)žMIMIIM°4’W’7Õø2‹¿ÛšÈÄ!L@,%³#²#6*äú.Áª ¯‚Æ! ” ûhôWÞ¹¢9ïgƒ-X‚õ}ðû9ïÇWÒÔN_„p?7Wÿß>>?ÿú_œü:òJÿ>ïÛûy’†{B÷ $õ°%»>»†u'©aÃrÂH6j7Uy23•òEö/fqÿRuÓI.›„‰Ò=†é{Xÿ”õ:fVèãaÀ~¹÷¼«14¸ÀŽ^ŒZR €Íø +ÌÀà÷à³¢w­¼}À÷ÎÇáÓ_µ8ªL¤o³¯§©¿¸®zž Ëœq`˜Z$KK=Q´\ãkËs¤uabmlL_]›pû@€Ôcvø4ÎèápèøÒ1@HÖûœ°R•`£pt ¬}´­¦‘‘œ‡Î‡~}‰sZz­Ç÷™÷Îû÷»€ÔbvøxwÑã÷|ã¸ørøx3û¼zˆ{†c{bbP> endobj 10 0 obj <> endobj 19 0 obj <> endobj 20 0 obj <>stream +%!PS-Adobe-3.0 %%Creator: Adobe Illustrator(R) 14.0 %%AI8_CreatorVersion: 14.0.0 %%For: (Brian Demsky) () %%Title: (release_seq_edit3.pdf) %%CreationDate: 11/8/12 7:47 PM %%Canvassize: 16383 %%BoundingBox: 6 14 564 275 %%HiResBoundingBox: 6 14 564 275 %%DocumentProcessColors: Cyan Magenta Yellow Black %AI5_FileFormat 10.0 %AI12_BuildNumber: 367 %AI3_ColorUsage: Color %AI7_ImageSettings: 0 %%RGBProcessColor: 0 0 0 ([Registration]) %AI3_Cropmarks: 6 14 564 275 %AI3_TemplateBox: 487 171 487 171 %AI3_TileBox: -3 -211.5 573 522.5 %AI3_DocumentPreview: None %AI5_ArtSize: 14400 14400 %AI5_RulerUnits: 2 %AI9_ColorModel: 1 %AI5_ArtFlags: 0 0 0 1 0 0 1 0 0 %AI5_TargetResolution: 800 %AI5_NumLayers: 1 %AI9_OpenToView: -74 406.5 2 1835 980 18 0 0 43 129 0 0 0 1 1 0 1 1 0 %AI5_OpenViewLayers: 7 %%PageOrigin:181 -225 %AI7_GridSettings: 72 8 72 8 1 0 0.8 0.8 0.8 0.9 0.9 0.9 %AI9_Flatten: 1 %AI12_CMSettings: 00.MS %%EndComments endstream endobj 21 0 obj <>stream +%%BoundingBox: 6 14 564 275 %%HiResBoundingBox: 6 14 564 275 %AI7_Thumbnail: 128 60 8 %%BeginData: 5086 Hex Bytes %0000330000660000990000CC0033000033330033660033990033CC0033FF %0066000066330066660066990066CC0066FF009900009933009966009999 %0099CC0099FF00CC0000CC3300CC6600CC9900CCCC00CCFF00FF3300FF66 %00FF9900FFCC3300003300333300663300993300CC3300FF333300333333 %3333663333993333CC3333FF3366003366333366663366993366CC3366FF %3399003399333399663399993399CC3399FF33CC0033CC3333CC6633CC99 %33CCCC33CCFF33FF0033FF3333FF6633FF9933FFCC33FFFF660000660033 %6600666600996600CC6600FF6633006633336633666633996633CC6633FF %6666006666336666666666996666CC6666FF669900669933669966669999 %6699CC6699FF66CC0066CC3366CC6666CC9966CCCC66CCFF66FF0066FF33 %66FF6666FF9966FFCC66FFFF9900009900339900669900999900CC9900FF %9933009933339933669933999933CC9933FF996600996633996666996699 %9966CC9966FF9999009999339999669999999999CC9999FF99CC0099CC33 %99CC6699CC9999CCCC99CCFF99FF0099FF3399FF6699FF9999FFCC99FFFF %CC0000CC0033CC0066CC0099CC00CCCC00FFCC3300CC3333CC3366CC3399 %CC33CCCC33FFCC6600CC6633CC6666CC6699CC66CCCC66FFCC9900CC9933 %CC9966CC9999CC99CCCC99FFCCCC00CCCC33CCCC66CCCC99CCCCCCCCCCFF %CCFF00CCFF33CCFF66CCFF99CCFFCCCCFFFFFF0033FF0066FF0099FF00CC %FF3300FF3333FF3366FF3399FF33CCFF33FFFF6600FF6633FF6666FF6699 %FF66CCFF66FFFF9900FF9933FF9966FF9999FF99CCFF99FFFFCC00FFCC33 %FFCC66FFCC99FFCCCCFFCCFFFFFF33FFFF66FFFF99FFFFCC110000001100 %000011111111220000002200000022222222440000004400000044444444 %550000005500000055555555770000007700000077777777880000008800 %000088888888AA000000AA000000AAAAAAAABB000000BB000000BBBBBBBB %DD000000DD000000DDDDDDDDEE000000EE000000EEEEEEEE0000000000FF %00FF0000FFFFFF0000FF00FFFFFF00FFFFFF %524C45FDA0FFA8A8FD7EFF27277DFD5EFFA827FFA8A87D7D52FD057D27A8 %FF7D7D527DA87DA87D7D7DFD05FF272752FD08FFA8F87DA8A87D7D52FD05 %7D527DFF7D7D52FD067D27FD3CFF7D277D7D277D27272752F8F8527DA8FF %2727F85227275227F87DA9A9A9FFA9A97EFD04A9FF554F7FFFA827527D27 %7DF8272752F8F8527D7DFF2727277DF827F8275227A8FD3BFFA87D7DA8A8 %FD087DA87DA8A8FD047D52A87D7D76FFFD0BA955F97FFFFF7DA8A8A8FD06 %7D587D7D77A8A8FD087D277DA8FFFFA87DA8A8FFA8FD4BFFAEAEFD0FFF83 %FD0BFFA1AEAEFD15FF7DA8A8FD48FF7E8383FD0DFF5E1083FD0AFFCA9AAE %83AE83AEA8A2A2FD0FFFA8FFFFFF7DA8A8FD43FFA9CBFF83AEAEFD07FFAE %AE83AE82FD0DFFC3FFFFFFAEAE83FD15FFA8A8FD43FFA3A9FFFFAEAE83AE %83AE83FD04AEFD11FFC3CAA8FFFFFF83ADA8FFFFFFA87D7DA87DFD0EFFA8 %A8FD40FFA3FD05FFAEFFFFFF527DA8A8A8FD11FF76C3FD05FFAE83FFFF7D %27272752A8FD0DFFA8A8A8FD3EFFA9A9FD08FFA8272752277DFD10FFA8AF %CAC3A8FD05FF83AEA8A87D7D7DFD13FFA8FD3CFF7FFD09FF7DA8A87DA8FD %13FFCAC3CAFD05FF83FD18FFA8A8FD3BFFA9A9FD1EFFA8277DFFC3C3FD05 %FF83FD17FFA8A8A8FD3AFFA9A9FD1BFFA8A8FF5227A8FFFFCAC3FD05FF83 %FD54FF7EFD1BFF7DFFFFA87DFD04FFCAC3FD04FFAE83FD19FFA8A8FD38FF %A9A9FD25FFC3FD04FFAE83AEFD18FF7DA8FD38FF7FFD26FFA1CABCFF5E10 %33FD19FF7DA8FD37FF7FA9FD26FFB5FCC3FF335EFD1AFF7DA8FD37FF7EFD %18FFA8A8FFA8FD09FFCAC38CB5FFAF83FFFFFFA8FD17FFA8FD37FFA9A9FD %17FFA8FFFF7D7DFF7DA852A852A87D52A8FF9BA15277527D52FFFFFD047D %A87DA87D7D27FD44FFA97FFD17FFA8A8A852A8A8272752F82727522752FF %59F852F827527D7DFF2727F827F827F8F827F8A8FD0DFFA8A8FD35FFA9A9 %FD19FFA87DFFA8A87DA87DA87DA87D7D52FD057DA87DA8A87D7D52FD057D %52FD0FFF7DFD36FF7EFD25FFA8FFFFFFCACA84AE83AEAEFD19FFA8FD36FF %7FFD29FFC3CAAFFFA8AEA7AEA8FD4DFFA97FFD15FF7DA8FD12FFCAC3CBFF %FFFFAEAE83AEAEFD15FFA8FD35FF7FA9FD15FF7DFD13FFCAC3CAFD05FFAE %AE83FD04FFA8527DA87DFD0BFFA8A8FD34FFA97FFD16FFA8FD13FFCAC3C3 %FD07FF83AEFFFF5227275227A8FD0AFFA8A8FD35FFA9A3FD2BFFCAC3FD07 %FF83AEFFA87DA87D7DFD43FF7FA9FD14FFA8FD16FFCAC3FD07FF83AEFD49 %FF7FA9FD14FF7DFD13FFA85284FFC3CBFD06FF83AEFD12FF7DFD36FF7FA9 %FD13FFA8A8FD12FF52F8CAFFFFA1CAFD06FF83AEFD11FF84A8FD36FF7FFD %27FFA8A8FD04FFCACAFD06FF83FD11FFA8FD38FF55FD2DFFCAC3CAFD04FF %AEA7FD4AFF55FD13FFA8A8FD19FFC3CAFD04FFAEFD4BFF78FD13FF7DA8FD %19FFC3A1FFCAFF5E5E83FD0FFFA8A8FD39FF7FA9FD12FFA8FD1AFFCABDB6 %FF5E1083FD10FF7DFD3AFF7FA9FD2CFFCAFC8CC3AF5D83FD10FFA8A8FD3A %FF7FA9FD12FFA8FD0DFF7D7DFFFFFFA87DFFA8FF7DA8C3BC93FF7DA8A8A8 %7DFFFFFFA8A8FD05FFA8A8FD3EFFA37FA9FD10FFA87DFD0CFF52527D7D52 %522727275252F8FFA84BFD04275252FF7D2727275227522752F852FD3FFF %A97FA9FD10FFA8A8FD0BFF52527DA8527D5227527D52527DA80552275227 %A852FF7D52275227522727522752FFA8FD3EFFA97F7FFD1DFFA8FFFFFFA8 %FFFFFFA8FFA87D7DFFA8FFA8A1A1FF7DFFFFFFA8FD05FFA8A8FFA8A8FD3F %FFA97FFD11FF7DA8FD1AFFCACACAFD0DFF7DFD42FF7FA3A9FD0FFF7DA8FD %1BFFC3C3FD0BFFA8FD3DFFA87DA87DFFFFFFA9A3A9FD2CFFCAC3FD48FF27 %27F852FD04FFA9A97FFD11FF7DA8A8FD19FFC3CAFD08FFA8FD3DFF7D7D7D %A8FD07FF7FA9A9FD0FFFA8FD1BFFA1CAFD06FF7DFD4AFFA97F7EFD11FFA8 %A8A8FD14FFA8277DCAC3CAFFFFFF7DFD4EFF7FA9A9FD0FFFA8A8A8FD13FF %5227A8FFFFCAC4FD52FFA97F7FA9FD12FF7DA8A8FD0EFFA87DFD04FFA19A %FD54FF7FA3A9FD11FFA8A8FFFFA8FD0FFFA8A8A8FFC3CAFD53FFA9A97F7F %7EFD12FFA87DA8A8FFA8A8A8FFFFFFA8A87DFFFFFFA8FFFFFFA1C3FFFFCA %FD53FFCB7FA9A3FD15FFA8A8A8FFFFFFA8FD09FFCACAB6C3FD55FFA9A97F %A97FA9A9FD21FFBCFC8CFD5AFFA9A97FA9A3A9A9FD15FFA8FD07FFC3B5C3 %FD5CFFA9FFA3A97EA97FA97EA9A9FFA9FFA9FFA9FFFFFFA9A9A9FF5252FF %A87D7D527D7DAF27767DA87D7D52A852527D7DA8FD58FFA9FFA9A97FA9A9 %A97FA9A9A9A3A9252BA97D27A87D52FD042752275252F87DFD0427F82727 %A8FD61FFA9FFFFFFA9A9A9FF7D7DA8FFFD047D52A8527D527D7D7D277D7D %A87D52A8FD79FFA8FD86FFFF %%EndData endstream endobj 22 0 obj <>stream +H‰ÜWýrÛ8¿Ð;ðæ&7ÉÌÆ´üíô/ç«ëÝ&öÄN¯{™Ž‡–`›JT)*©ûô’’¬$MânÛIöš©E?€€äÎ?ǓýA(ç°ß¬Õ‰·³s¤€i©ˆ¥’¡Yª•!í^ì¿U«#h0ìÍrà{P)—ñeY橑Þ=TœÅä¢ôz½Gv÷1åZ²`)ÌRø4ƒëf- {ÅÚ¨ì˜iÄù>íQ¿Aº­.Ÿ>‹oXšò/†ÛiöšH;”Yòxy(?ZAڝitÛÈû•_@úàXY±+@šI!Uz@ŽÖhú["‡‘?@yK ®+"§2֝‡·k¿‚’i…{BøUÌ`؞r¦ˆiâÛ  †~cv˜qžgÑ0€ÍNא›3kÔeŠÖ aflÈÝÙ0BÊ´F×p ø‹·‡UGhÿv¯.`Éí&bl?îåj•L"¦®ÓûA1Ì)D‰ÀM°1kõºÄïúÅ7G –»ß$û ߯µI»Û$íF£–ëØÄn8ܐsƒs ôÄmb«U¯»_ǹȨ˘›°5 ©ïü?“!ėò§‚Y·íŸ¿ùu€)SKиùRdÚfg¯XãûŽ­Ál³ï%Oå{kã~·EZõzÓ ~¯Ù&ý*îYý­&ñýrI¿øuz££PŽ»·3Æ-)¾äñßó1N¶Û¼·Š‡›½ë6HÏýXj½Êÿ~ñßيnk qn;æÌÑY%êµ³ .{‡G22±7)yˆ›c^¹t¼rl9(ž%ޕ×ìÓO™Ô¢.¤ß¡KÅn]îÑAÈA!'¥…lz`Ù +Áè 2 ô\câ0^–ÌA˜ÕFYÀ¦ÅBÀgÊ6'Ϭò PVÒ£àD¡" +¥(wê¹Ãð +†—˜Øª÷¨tXé°²‚•%V:S2Í4Û@=š•Ø-— hˆÐãMS J/RLâÑy&hš0e"¬(JD,磤l]¢¶2Yc¦¬4Å: ÁT&u6”ËÕb©CXÐÁ ¥‚¥+¯$%ؤ#gPñ]CL£ì>Ù{€+¾R… @U<3ŽXdÂL +Cz¾ú§ Rãd(oc +ŸÁ";Äìâ(PJ-°†yüЌ%¶<‘ăa¡73 l¼<1ž§ €Üf òdË?'Tš‰C4‰Bd?6‘1ÄVi1q:ílCwĐßp“ eÐʘÿQŽŠ¹=ɔ´–ÚJ)í¶3«Î£ Žçé+Óב¡I»×›:›ã1Xh'Õ+™¥˜"TRô¤2¸Ì8);q¡:ú°š®Ã4t ‘*ú +¿Gqé—U5—ŽšÂ˜V¤ÝFD,P&ß±Û[ lA¸’víÑU/™Ê"Á2uˆÂ5 ÊyÓÛFۿͦ)›Ó¢9³mê$¤9ÅȬzœÞ=[¯è&½ƒt]{ú_§û`¡’LUÓuޕßñórƓ®I1,ð)c'Êã–…^WŠÍ„°WâÍãl&özSsXóš3òł¢O‘=~i¢d˜Ø8jÔ¦·¡ú^ŸŽ"X2âùý6Å`ê‡øý.e +|έè÷è1¼“4üVž´Xl_ ^i´ê,0g“u4—bFÝ7?±œçmΆwŒ{cNï<ñìn,2d½U2K†ñBz»î +8ÅÌ7aÍÿĦ†w¹œ°M2®¡Æx²÷¤"<¼ÇDa;-¾ÏKÃoLqG=‰o@Ȥ¢¶¤` ‘ÿ0•<¯z,X̱ôRó;Ž§ß˜aŒ6º7´-”2½Â[#v¦´Ôé¦wõ9Úóú&9ú9TYº"S)E©ö.«Ôž“-Õà_Çc+b ‡+å€û+á¥ïÕ­‚èÇW@ækÖ~Äðxµw|m¯ð˕ï[Ëv"žF›|ªPƦS&k¼ EOi3ÑÀ6b"Ú¦³±VF‰yè‘ÉŠ%`uêÕ©ENJ…mÓö«­oÿéžøÍ}Ç1½ÆãÁ£¿Çx%²r€Ñˆ%Əž³È/p|gAÁ­“‘W¯uÛõ¾jn¿ÓkÚA½Ñh˜7@ÝÇGšëæ˜W¼{p²ÆÉo8øI·¤EÎÈÕÇ: ‘úáÂâ>àmÂõ²7ÁCdß{¦]!•eB|ƾ:þk¸?káÅö ¶vÈÄ!Ü°MôŸÝÂ1ÃÛ9>2Ì¢ãùÖÆî^]Ø«»²g:FÌÆø‹wŸîo|XšQ¬ö-)ôÕU7灗ðWrÕ¯;–«D£æ9Ý#>¢<·õXâ]o{ÇL3ogF‹9挙q{qfjýÕy‹Ð!Bw)Ô&ÝÎÌ'ô» +ÙM©©ÛÈQaÂkŽT/P »È=>[®©Ù!ôðò´›°0t´7Ø4†diI.˜yñ/pOºFl$Š¤<ʄÝÎâôá¹ á;¼þ¿g"ƒÒrk¥Ǟ6—L…“ª¶ü#%“^‰›\–”b.$»uRüù¶¨êuÒ)n»¶;­b¸gÄübŠ%<Ñæê]ø[.hÖÈmí41Á {‹-;bñ K'eD至wç2„¯n*þá;/„}lé²H ´Íb 7J(ô^è"ÛJbâX®d‡Ò_ÿŽìx ¶lú~á|4Íræ vØ$Þö¸Ìí~5 áÁ9áSt…¹C˜ñ‹WƼäÛz£þ6Ûé:¸BHQ,#ºÜ«&ü¸p^%÷¤³ì0lqC­hOà¡#nü&½ˆÂœ›‘Øãr±áãj‰ŒxeÀ]“_:Ñ «†i8Oaú–&Ÿ×Ò[Oº¤vî¸ñ*‡Õf×Ða6Ô§Ãå4Ó°Áw±¥üß'çœPx¦aÄFgËVsÀ¼ÚG6£è%ÌËúî‚hÄQÅ&¶´ ‡krµ\5ð¬3軦ê†0ŽÃ×пªº&!z×78ÞV±Ï×ÔÎüv%æhìë‘øªQ¦Ý.ñyŠ*©“ø\‹gõär„.V² Û/ȹk:d¢³,ª”LÔQg ŋê(+ Ôuûwƒ"¬D3´ò@Õ2”¶ ‘ä\XyϦ¹ÊËÏpPÉж“s|fØ*ÔÀìÔ5F ¢œˆ7°bþádlKÏù|õdp"æõQØÕ`Qu`)Ñ-èÒÝÀ4]h ,j]!c ‰O™,qODˆg4%io~]*ýïáÄn¬v{Øö¹ÇJ§^ߗX:ý¤ÐG‹cÁƒ9$°£¿äûÐœØr_Dƒ~rqDyÞ’n]/¸õÃÒó}¯Ìr՛S™'Ï)Ìã)£s’í¯ü±É?;û»£÷ÊóºâÕÄƆsòtÁA}~Ú¿ûb<UÔǁë)› ÿɱ«hÑ)&ÖÒ¬.Å|÷ÅZnƒÕý£cÂfiÐ`pÙ%…-`Y0 iºEÒ²ãþ²øÃíONŠªö³¯‚‰»||±HeŒìE.ô¨%˜ŒZïŽ16dÜ]²‚µðµBüòfF—”'EX¸£1ªbgˆŸàz鱂âl?³9 ¨ùW§ª¼F!&J¥ÞÒõ"r´à” ݟyJRŒ$Ž§ÄB/D걅âóQÔ Â\ü»£St°Ò7œ2úÌ=“ð3i쉺Ȇ4!ñ'Ÿwµon‚ ‰‹v\µ@þ!‡ +A†#À™øI,^ض¡|üàrW› +÷–B¸1±"3þm$Éïè8ºÞàȵ`{´ÊÅ +LkÌ°c)”Ž¤‘«Šf§–s%œÌÖP¹r]ÖRàDՋÂôòÔ3Dþ©˜œ9þ½žºsÕ†ɥòn€ÊðÚ5ˆkòÿô®h˜v1‹Üʦâhµ¾»áŘj<ÿµ× ª’P:ž½¡!“Ö+“L[܆޵‚窾49²'=4·¡’<]º¼£¾Ÿ«ò ³ddü.0ƒF¶tñEÓêix€eo‰zcÇUW¬q¢êÏ÷)šØ²À¬Ù(ü²—\3c~ŽÙL>›RÄjÂ|Žÿq­"O®¸#™ÛjYhÙì ‚ܒܾòåèo%,RÏ~0A7åÒ#„+×O6É?4 ¼Ô4èD±g†+(üÓ¬½p7L¾FÔê PøØè–.¥ær‰=¹ EïÿuœøÌ!²(¢ 1…&¡ÜpˆTz-¸ÑçŒï6JP葇í éÓ[JŸ«¸ô ÕZõµNåƗf݄4‹dR€†ÒÒ  'ô¥VZQG±Å'84±ü{‡DŒžÊè‚1ðÁÙAxŽ 28Š ¶x¬|Xá`ùð—FË?•®ŠbxõŠÙj¡ÊGê\24WVØ6+k ÕIkYYJË%QBþRXCà ݙ.Ãt˜‰šÆø¤¤sà¢ú„f,ÄÚ!£{qޒó»¶âI6(îHZx<#u¡Qô@Õ¤oÏ š¬<‡Ó2ǘ^¦lR–:¿Ä,bº5Å5l’ÀV.n!ñÜÙ¦L¬øÍⲐƉiÇÔªœÌgeî<™’HzU®â< ,‰v¶ËcØvt3‘’T ñïd+.›—M² ¦¤‹xY5DkJÜåe‹L@Á,dïæe VjÉ1fMóÄß3>YÁñ)Ö #¦¢Ä2cÁ´^!À8ê—]VėŽÑ€}³µ5Éjå¸äé@w¥óCÒÁp\ÞÀLg×Ò +‚‡Æ–E—yˆf×3T kóq”>—Ge*ìo:º/n/.ïß E]AkÕÓ¯z+Ôq¥;ŧÿœài¡b’¯ŸÜ1ƒbûÊ®P0ű%>ÊQ‘3¶."gZ…²õÂÆý´…'jo³fž1¥ $lyH'`­ýÆÉ¢ÖÜϜ¹>Vm ’ÙIÇcQ¹Ósö,¦bê„-Ë®8ôR«R×Ò%²=ÆJXŠÃ\5œ9–pŽ€ú¶¢§²8ð/ȇÛԑ¸*¡¾WM¬ÍäC‘2¡ qÎõ…N)û½, ”·JÄme¨ðÐÄv¾ÚXâ$ +Á›¶ÄÂ0”‹õ?ž½Š²Yä ¤Ì13g‹õ ÐÒBÁ'Õ`ºë64ˆ®‚™0+M(O”ÿ6jR¦bÆ%Át tSŒ +€CŠ(€e ¡›‡ŽÓÄA&|ŽÙŒ'½.½.€y]÷:U‚%Þèr¢P­+þ”t±¯m6Í%yªl.„ËËq’rÊgiB†­’·L¦!'E¨K¨/Ÿ¹Øå*mÉpÞڛ#†Ÿ* }ÍovHôê #BH؂hó'_F@êLýp„JA­†.ã¢NGŠ¡­ )Ùwç@¹hD×FClM\ tImwecè Wá6¶¹_êèT…sJ®¯APÔـdž’.­£3ª¢ ÿŠTR¥ë­¨…*Qo0x»¯Á€âcãÃÅæÝöñí»­#üeçloób·Ûf§óikb½>ë¿Þ)mõ \æëŸÿ>9Xkµ?Ÿ¾?o|h ï·ÎÛÌ՚ý“úùۍZ£±V­råA™ìT×ÛGßʵwlÞæÿÔ+¯6ÚGÃ×,9ÝÉߟ†íãõŒwï5¥\ޚ<»j¨ÿ ÷5•þF«ùß©£<|í6þÛÝéÌéw#gºýþ`Íí+õÛuûjCWÏÔTcëÍÃqóæÓÝ}çºW¾É¾4Žk}mÏú_Û-^žo+;n¿tª_mxÁêÿø~á*㯷ͮÙ6¿´Æݩӛ6ÿ«%ÂñcSÑjßíã[·¾p™÷¾M¾Qømó§2Я»»oÖ;£Ý5Ë÷á ÖÝW‡¥míDÛÿTêMߏŽ;{›Ûݏ;?¶Û½­Ïýqÿzs¶6=Ò4<¿Û'ãáÔ¿¹V­à&3Ö´Œogz×Üø°µË¶ïÝÎp´ùSøÿ¦}t6Ý{µqptóµÝ±´­ùö»ó£Js~ÿÎh6+|¼×aÚ ¶=kÕB‹šrÆo lÍ-Ҽݫê-£WÁßÚù»ÒîéšÍ˹ÿ‚‡íÞàxíödçpŸC^wkï›=úmûøF¿kÕÕµ¯žÙÿq_]ë©#Iø ü˜Œ@e0"ç`&Hädxÿ-u $°=sfg¯ö†¯QWWø+gvn0(Cœ†Kt‡®í œ2ÂÚO‡ÌÐlϊ$õá,I‘OÖ£8ˆþɐBCÄ‘<¹ÉÉó[ ‰ŒÂš'¶#«˜\ ÊcÌ,ڋ¾AèvI"“‘ƒQ)«¿š|:¯lz¶*‘'o +¿Š7¥‘P¸)ða)@ù^ëÑ<†¾Å‚4BPKó¯lŒîÓ«)ߔV„¤EÔ£üùéu ô¤Ucªîn‹¯ˆBUÒË#wüHéOn!ÖkŽ0˜}z֗GÑb]¾¢H«ÎH\®èHZÛºuEÔ˜'õÙޒ—l·*_)TEòÏTŒÍhûàýó!\#²íÏ#6(C'?¹tóüÌ7 çËwӐµápuD÷串j@æTÄó“[îÏÜztÌf%Ryç^P°cV‘ :ABØ3ÃG_Ý#kwìÕ8r²‹¯ B l±ãT(æøQBÇôXñij˜'Ùf?êw Y¬È=ô¥ÎÌŸçàt}-Å°bE*$@ooT˜†<3"”ƒ¤ÚzÀ4§_ÔòW"=mÕùD?ÚyôA5¿ißñ~ÎÉ¡à„ùÉ%Ìz®ŠOn¾YšPa2Œ${럴E”6º\/¡AÒÈQ2š‹•¾Gιªø«›´"ÅûQ"“‡žÜ–]`ÕTSd)žèP¥ +N˜Ê·ƒH¨Âê<Û +›]{Ï7]°P‰ƒƒܗ£Š'”ðumá…g&Š \-ý’æÍÓ í~« Üîæ¯%¨Í…Ó_»FK“آ÷ÜÓ¯{:_o6ÉÕ&Ä¢Šf5bÝï $+¬}‡¥Âæ(Ÿ­¶÷ëO;&ÐKlŚ"'Ù÷zìXæá"ÙwNè Þ¼ñí>9&Òo_Tì©3.P—Í€oŒ ¢yËðcŽÍ‹a ·¡ +=Õ¿ŒøÆ¥³n1Ô1ø°åNӔ{˞Ÿ‘›­ˆ»DBýt’…ó€#UßV†Ÿ™@ªÔŒÇ§BS7ß>9û7JÐ b§ü4ª>]¼>\ÁÉÏTñóõU惙 ËÖᴒ0‰I|ÀRnêDv>HÊVzdaSþö¢°žI¦6X%C9Ät0¤`3GC)¿ÐÀßLfÈ*$ÅxýÑMåG¡EÖÄø![YÛë¹ÂQ+ ?Þ%ïrWٚ Œgß[¾rò² åÞQ?»öŸ:âÁ 7)QGî +(j’2WœîàÀtÖ_/(r ÉßuøŖ?q ²Ÿ®ÍÛ»¿FX~ù%0þ",úŽ¢Ý*+T¾ƒ…. )?…mEH\á°Ùlÿ*Š ›Í&€7Ä­†7¦¼‹{mlIŠÍdî„ü°Ðnå‹å­{¯bì Ž˜ø)Ū4ž `R$j…ýbÜÿS¨ÿ6^ä]lšc7Ç[opêâ†È%¦¹1”Ɇl?]¹žA†ØRïûýèà›mu§pÞy&}-jo ¿ƒ^©•q©—R0t1r>I%¯Ý>ä‚ÉEZsgK—Ã'O×Gne¶q"~®þ¾ÎØÇ¢ƒÖØÅ¤‡üY<úUßüïV»Û¶H'×öúqq©÷%U= +vƒ„Ñœ¯ï¤ +מ&0Án¸-u/…@»CªLnFlh¬ìo#Ïþ,¡íƒ< 6#Œ†l{#%LtióÖleLJ… ccNaïɊmu³°š»-³QöϾ1èÆàYh)ÕßyC/˜”`Z÷ÿÍrò«‰1)ýËåäVsê»EhÈ0m‚ç_W‚ÑíÚàoŠÃµµ¡$7áSÞôA˽6ç£nA@c¬…“Åêÿk³Hœ–®ñuŸÊ¿Kª@{A€"Ô¸A@¨¹?Îh& 9*ñNö]…}†VÃÒÛ*ñiÁ›…œ ?¿Ë'ڛb“¯´TwÈNœ–"¿-Ï Mn 6´>@Óÿ“Ûšÿ¿+:¯H¹µ{éUƒ›ÛLá<çφ!Ò±ò=Ûâ/K +ëÅ&Ç76¯õ#5­g+Q®å`ÌMµ˜Xë˜Q¸¿çU´¿vŠ‹wG +®Þÿƒ¹aÈ}a]"`©j±[‚¤ŒÅ`(¬£¯ëâìdj¶Ý†› +¶ý¬R¤…•ßÃ7. eøp*òîYu3Û$Ž¬ +2H&¦Å‚P«rÕ¨¿·-›Š^zn¾Vn´É?»^tV/&Æ{™X_&U²xor_•ùéA²™•²ÿגŸÜ·T¸Óiъ¥J,&³é±±Ý‰¤Æˆo6ޕƒb¤‚­/ǝCžI«¡ÛE3v /y´‹ÉAîô\È+0åªûMp¶ƒîTW”‘ß±0,}áØÉpÇuj„'µ Kh~Ì +Ź­:WŠÕ0Mřš¡ó!©p +ŒqŒ}‡œÁ”·ü½cögÙ¥yê€c›¿/’F&½6EŒì…Up¯‰Ë¯% ¹¯…0?ÈGñ#³ž«¢-Ñr½„6ËQ2š‹•ÙÖй¯ÙûBåDuƒHRTÒQ†Ü÷÷ªg^íQ3ìÆWµ<“f[&x >ß³¤y³¤$杸…öŽL8LåÛAÔ¢ åâ©ùØ37qÊW#Â&\§€ic‡ÆŽ'7–Xn%?äÑÐ=åuw†¾[ÇZÜâª.ír̛Ñstyé/ïgT±t¿ø4ûuQ‡I)Ñ)÷½S&Øy.+“Ì&i£àh~yJï|ÌÇÔ üu’x0Å¿896ÛòHoÛå@ˆ·»a¾¨ê|½I(/îÜGBXS³“}TÁ å5"½ Šcب#¨Îlã'å“M«¡Œœžž¤^Â&é +JŸß‡†›[î£IBw¯!&˜ç´æj,~ƒ&Zÿ’‰­Ùۛá«ÃHrm×ù|“\ëú\T`ãâÍpèîÊë ß9Ödq믆ʩÒJÓRKo­#]W¤^>ð“iwtqâɝþØÞÿŠ¨H”§éÊIz>ô¯E}!¥Êzz)÷} +*cœâqå#·=¼ÝêZa¾E‘ó zIi™,Ý͉e±}ˆ ڙâZ¹Ì(¯®%e¹%ú¾Ã˜*˜PÓ8*ÊèŒÌ¢‚V:çÙOƒ çsþpc!{Ó¹W¯Ö_@›-H2}´±Ã«(, +á•ov¡9+/r…þ¬âxN8Š·­¥$øšÄ¡ÛÉÍÛã}qåò¤ °“ F˗÷¯jÈ̋Ytýì@ÔçhŒidù*M²;ó¾ZFh=BœML¦™ô@yçæÄåûêÉ÷#žÄZ÷K0÷‡=f¿l„ bÏÅr§KÖßï‡ñ`T¡l«’|O¼*bÃð“&Zmqó¦ùWkE·Pd ¡H/Z¢'+3ºa^_aBkº+•'ŝlÖ»]tVVt栏ŠËäˆüS †¬\A},ÿ©§š÷,…*më;$Ÿ.‰0_Ž}²wOT€’7˜F‘mBu¬}tw.m²óxåÌE[J„ξ¯76r?î´"SkûŽ¶v=2ñdÓï)üþ-ºT‡ã[¨Õ¤=bã̉CÃàÂS§‚oj±wdw|êÏziº`|mú&S"cÀ¹¤¨š„rsI‡e›ïlX6ã’WpViÝ=˜=3¼Ö‘¯f~ö„-²u$“Tò9ÿQ§>•ý%/¿~ÈÍURB ±4±¤1X¼ 4¡¨Æ?ëé)ŽÇÛåðÞ$tø¥J=zËh3ÿîÊ.\¥_±E¦Î€Ý¦iµJ@œšà Þè‚C¡³‰­ldNéwO&E‚…ËŽXƒ»ÝÆ&ÉÛ½ª1Û؞òSŒòÛüU"~9`¶•i͗nØÝÓÚ×N\¸qTnLis¾[mŸ/–?sáØdœºÀgZâO²q[5Øßür¾óùhý¼Æ\è¨bóQ+Ù å/8)óHÏ@‡‘¿º—¯CV= Yˆ¾ÒìðÞuË4µ‚vþSXû÷¾3[øX|牱5P¼Ñ'àhiº” 4ƒ=sCyGWî,u%´·KÂh‹â€‘ø–N.x&S2Nl$³ŽJ¤[Œuv©f};ð¹´kÎw‹41¹0SŸÑòÌd¦‡…m$X€ÛoNDàz{ŒœŸUý'ôîCjûâBmoEãðâÇѾÝzEÞ>KÊß×/n-½VÌ= å#ǁPu¦¦!/‹f×b'?;»FL&u™„ÿQ^0Ž4•MnïvÝLºP‹Ë/ÅenX.šj&†\µJÊ÷¤Ñ«Ï€ O“ƒÐÎtÁâáã P¾¿™;?0­mJ~áÉ'm?]\µ’€²w³‡W€zA<þÑOK£³æðÂÍbŽ[¤p>¯ðü1ÄÃ: +”0»VãŸîÐtä+Ž×¥âÇä贋ƒ%-e€!ƒbº­ì)`ãÏ0r¯o>«(3)Ÿ„>Øm$&•>ûŸäåÄÞ£x½ò>œž…ñà¼äÊJÙoíF-,%­Dؓ&à‹•9‘!ñ£MÆ۞$ã;kfWÊÂn½ÿ³Ø.×áØó¬5ϏÓKÉŒÔIKØz]Ïw²”^¢<–aD0ƒÁ¨÷ã5/Ábý”Ä…VèŒ +÷ª,“ —My¾øbõêýù[r® 2ÅΘFUœÀ\ôÌ8ğLjº`8¨_äDÞ¯a{EùµWà‰ýŠ~.;8‘Þ‹ëc¼ÓøZ_¦&|ÿ*[žÈ=?Ã)¶ ®ÒZ¹ ››ìGìœnÂܯ ~(gOŸô2 6)'"¶ì¯†á#qF?V'…Ü7§`¹¢bÏúîRB9è—iv“ã«žÛVhw9éî¶&ÁÌÙý&"Ñ,.i%•·EùÇÈÇâÍo·¨²ÈËG?¼·ùoøÛØ2‘aeîŸ)~*ñ©2>iî›ÄATz"{lê*'Íw-7ŸÃ›–˜bÇ{9—å'ãu˜Ñ +ÎaÄÍføæ*Î9ö0ï&{4$Ë ±…g?;SðE®JíŠlÙšß›¯xÖ=ÀÉ’«“hz÷[¥Ó¨1O0ú¬C6٘7–"F_Gè:$ =$ü,/‚¨Žïà!:ü—‡XȺà –‰Ia‡Œ´œLÿ—wxGä[€)Çâo•ýô­q8­öšñÆMN“à[NÓétê -k§·Ú«ÿª—[äú¾?µÔÙ^WTåò +rT&F¼¦pûÙy§j'S¨ù2±êb¥IêN·3j¾·¿y˾¡L»X.gRÈUTS*’OÓH¡;E1©#HayJ˜Oñ$ÕÌ&îÍû“u@& +҉ÞPڈîVnbþüý4ŽäZøÒÔuÌÌwx­9u"³¨Çüyw†—ë^4Q#œÐäoÒHxš–æd¡1Îcâ¸R0íÊ\¸ ª³g©×d®Zv¶o§Ü&Š)‘K¥/³j &1j,¨ìà£Np}®°$ ±L” î|íâ ¼åø¯12‰¥ÐRÎb°yUúo½_üéhz š¾xá‘òå Dž¶3 aóïK×ò‡ u»+»«““ûäîÅ¡#<µï—FjÑÈš=¦øb–‡eú·±È€æÌɗœ¾¤7ê7±™RB&Ýsø[Ú·=Îr¸>ŠÔ ]'¾> ?šl쉰”–bßÉÏe-üRé`ÁŠ¿*ÅãkÔi՘]í]éT¢ˆüZé;twÛÚ+¥†{ˆ³?”ZZ.jÅ|óÿ¬WéZò<½‚^KöB«¼ €PÊ*È&È&*n¨ì÷ÿ%-%]’RÄ?}”´9™33gNâ?]<¨è뮞ë5,¨»0‰ |![¹¡hB¬—ïÏڗ"€öÇ|áõ¶…•]×L´Ö»œ/½ò~Wq «¯dšzéñ¬vq +j̐Õ_¨\7° îÂw‚oów8P¾°ø(A)š©Õg2>V±?ãå;Ï>ÒÛ{žžGº-_š›†•'´â@^Œ°«y«©‚JÃyÁúæ«¥„Aý–H‹óU\ÌfD(P˜ê÷ë Áš@ÿÕ¤ñ tÌ׿ê-\ äÕќ«#ƬëcNìÙ¬¾gÄU0ÜÓi´ja,*vCSòשðk‡¼šMˆ¢ cÑÛ´° ]_%¯ˆ«If¹˜W]L w›¬ÍëÞZz®­>mÌ«1>ÿM\ \Ǫy´ja,p}Õ,¿^*‚´¿ñ‰AÅ"6×>Æp5«ýà®fèfqQLµóóh.)ßç=³r+Ÿ ´ÚÿB.fþ’7‘-›+ô†…0 Üyå3°…‡=à¡ §'ò‘zòpK`dš¦¹¿vÇØT#´¿îtû ]¤iÀ*Iõ²“Ì úH¬#µ?,IõvÊeñz@)Á‚yŒAùï¯@Áe'Þô ý¡’}=¬.Vwa)AeÏC‡ʖžÂo(tzØk—O*¶¼z‚1è Ãxtô²q©`½ÖÇe_ÖHðˆ ê.LÃDPåæ€@ab…w‡Ghb*{/‰ `"û!V`,€#™’@›6ôÞVº†¹oŠ:cV½p5xø+´7[þTÄÑ{BŽ7ô>éMþџüÏÁ{ŠQCjbZZ[—UØI'ŠÞO¥úÓ ¹—‹±¾‰TfÑgé Ô=r!ýÙk’à½(à×&ê'@ë…/]lnÕsƒ¿€šÈ.IAFÒ¤Áwà_ú­_P ´ + œäE=OƒYj/µn”-ìñå šFô’{iïý¶²j\ð28æÍJ}E 0v8r6ò>ËÓðá9°ã×˱.ˆ`N½lñ@`LO`Z¢÷`m¡àÁ~!ª°1Êx$O4؉ác ð xèççª#Êaö9©rŒtå1íåáá}ÄøïU¥Š‹¢õÂ)ƒZþX·ƒüÁþ¼G÷¡ý|1E¨X_[²珟}κʬtL–Ýf›ù=q+ŠvPî‡b_D¥ÑFvZY¨®ŒY­¬«ðéÌxŸ¬µJ>›ù×\x`Ï;eC–Iz¤aÚo”É,=‡èMÒC-Ý~pm ðpd£ôÌaF5eVî$XcóDÉæ<“ ´½û•†ùÐIaFR.ƒz…9´¡¡ÎøhÓÄ¿FÝý½ë;‡»)åöE“ªEP%'WäͲ‰²ƒÍ°[AÞA,¨ï¦n9`컂Ӿ³ï:XÉO±}.#ždPyìUPv1ز˜º'n\:Š!¡´šPEýÿ=I˜Ú( ÄÔÆ ?Ûv"¦s)±>ÂÉj1b‘÷E eua–”( ÙßøT§hH‰|̅9–ž™¢£þìg?˜ŽzFýËó[âX¢è“ò ?ޝ½/›uÚJ–_?xÉGš¹É³òæp–N¶3tõ¦’:ŠvšA¢¥Ó<…½ç×g0AÛ‹ò×ÕÉö¾’ÏØìˆáQv¡h‡›EÎ RS~m3þï‹þ%c±¿dL8±½ÓØZÐzq}+ò/ìT:Ý£³Bo O›í½Ø+‡ÎÐâul›qÓ1ÁÆwå[Ñ8ãÏéÊmÆëÀî+=; –Åf2ÛÛ҈˯Øa_>·4³ÃϦ“αKÚÞS`!ˆe9Ö/ÒdÅ3:%üQ¢'q‚=ˆÅ[þŠ“#Š¢0\ÑÔ½•1#ªšøi㴑`ô¡‰Á¦²ˆE­~.¿->ÈéN;Ú¼mOð¸û,#6²sù 5Èh³rDÑ'ê—p¨±ÃëÀ+ˎ`´å²‡9t!Óm×ì)§’þ~d"ëÚãäµ›'wSTü+»ê!e€óŦ!ááÅV2Aío£S/[tPŸÔÑ nÞÅsÈÒݒJ'·¸×âû€¢å©Á)Zð&–;ÒÍ +à'dã»llpÁx¯Dʆ(‚7ÉymOƒ½T覒DzÙÁ²¡¯ å1íåí +í»Œü»Zɾ:Ž„&rljfࣩ»%™bËø¨|Œ¾Ø£år¡„îš-ç%VÆQvІ:(³F˜ÙLË+”áÊ)1DZÊk’{8FŒN +’+";±ìC¢|¼’‘n> >D‘ÑJG¬VzY1Zi3ù”3­æ Ó x~ÉÝޏ)ç1Bk1Ø9a=wÉ;ÖTú»ØIƒ„–<¿_–ã üMg:´êAÙVºmW,sêaH•jÇ8ô~#É;ðc†y÷Kb.퀲Œ:‚—­Xݱ9¤ó²ÐG]Zn|ךú¨ào¶}gßu†J"p }¶‘iÍʧsJGæu³¤i­_HÆCÛ,µ=S“{-ؕɻÚYµªdÍväQ´ó}ŒÉSNgåaŸ³;PÝE»M¢]&Ÿ²Ï©sOuJ„ÍráÁo‡¨*Z À¹ÿ9ãLŽþ¶ïœÈ‡'Tû6”] NàV™ˆBcøêûˆEº[pžŸ¯û9{áÐ9ÊÒF¥J*í'ôÃ\RÚ{óhɼ/£¥ª=­0Ì ¶3O3¼•[¯Y`¬°Õ’…“ÌZ³À˜ˆh X3Úx,G”°e`ž<‘ lGˆÚ3­€\l;£åwd5&i¥iôeK;…6%wÙiŒ Ã~ᅤãÄ y Ç«0üRUʅW|u°H†ü&Û{LäN¥‰$Êïi·QÐØL;h´[¸ý]ãò{Ñ+íìÎï+î- sÅ ?¿§Y‰(AvÄ®!ÿZæ!ô5Äoá>q -/ÃÐ×ÐÉ~¢Ón¡{+3µd!Qéfì'ˆ €¸fÅ F\h)M8š“Læ8ñ¥Óµv24ö.H¦ L-b„)û»¯˜Ýu:inK¦"šèB8·1xM9™Ûr¯öѤoyt"r" „Ä©9ÉÁð"ÓÌðŸ%ðë,áºRà0Õ³*“=åÞ¿Ò`EËX›½{‘Éüg†:%.‚K)®ÌeqrÉéïd“À%™ÆÒÕ¤ÖaöÅ[ŸqkyBc)Ž1µsµÅ:âV¬XüìŠSŒY1Åêd.âhŒA1 +µá„Êô½‰€}±fB((Á‰ Áå\d º6,`#®ŽèʹbٜqpqôöôvÔxlîÏsëڕ¦ÿªL*? µ^˵ò¼}ߨ¦ï²8ޏÆ7às«~™¨7‡ãæk!q&5LcÀ¬œ@Bv>Éðž¥Àʔ4ãøºz‡2Ñ%Po?]¹;|7äÁ¨gußÁ´\LÛí¿ Ð㋳rýiäW®{ü™Èç*Í®—RÃlñêí”æTß¼”UÂ)T¯ŽÛ|3¿×e8=”cGw©g†ÓјéԐšË"®^±\ó-ù±Ïtš¸œe;N[P§§Ñê´t* )p8}Çe¤À‰£¸î:-bNÞSÉêÓºÓRê9¢n±\§Y¦Ó|³sÚc8=”•ÒuãÅs +rÁ +<á8mÅÙN[·ò#ÃéñEDQnþëN¹ŽîØN¯;¶SMë71vÜÆàß3î'ë—úf¯’ûÏø]±žçÿx1}¿ì•XL—¿ÖšG&AΣ’õ~à&<‚é)‹aݽ ”%åœ?ôªŸÈ>·V”ƒ&PԃÜ¥×k %ÝÖ)Û¸×ÀveIcۖ:¯ÓƋ&eÕ7 —ÖV!¹*‰ ª®³$@Í&†È‚g‘ó^ÜðXŸ}P‘[Ò>P[J€ÇŠv¬®6ܐ”ˆ(ÿm×~›Ö9ŠÏê^ú–:}ágvŸ<ô Dr±G uÿɯ“W%G¿pŒ ¾Bç½€ q™VØ=¿ñ*/ÂEÇw„HHö­ô53v­±k´ñٞ•ËµkB#wŸ6 ím|‰À ’¡!ã†èdù—ÆY­VÙÐÕjb[®ÈÏGûQ&35׃÷Ø©õ Zj@ñiã‘DhÚíSãSwW‹µ:q¦4Ò"YÍ{Ù8µ[Ý×|àÛ)¡ü[b5PI©¸¹mÊ,9œß“!þ²`Û&@ˆˆÊh +Q¹öÛʘ]y;=D8µ›6󯉩æå¼ëNnn%z-T²dï´YxÞÔ:A€]Òk'Ï ++IB”\Æý]šT†OD’»¹U3}5ã>Ö/Õ©´n¹—˜ö+­ ¿;4¤Å±ŽM&@Ŷ¦ «!scŸÓb5÷بAéo+˜v%ð*²ºûÚ{ å&ñx+Z¬“(­Xö¶´‹U™%‚*ÔOÚôxTÚå–hP23(¯ubý[Ä̟ ¨$o.ÑAvÿªåÛ.¿E´ƒùùtÒßq`ÅcóÁ÷LV~n,ìIoŒ¸*á*ö¦J£o«Ø[9ùøMs7Ún+eîP©»>[ƒòTG†¸6üeà|lG±>Û0qE@=¢0LTÙû‚0Á2 ™b¢7TÍ'ݵá*& b"bïB\ìù©˜in˜ `dÚûË^rLZ j2ɅìЙîË^í£)¢yè°ø}Œ}¨_‚ÊAq”±gò1Árð˜ Lg.xB]òŠÃ#÷ý<òãç‘Ô’G„G2&ù2˜g`aú¥’Í” +ÏÆJÚB®Ò)dºšÔ¨×|'>ö¼v$ñÞá$³ê$Œxž¤!¥ÁûŽ:5Ö¦¸bŽ@Ä'%Ø#@ˆÂ-BÂô J՞–È* + ³ÀãÔ $ìlÅÇ jÆä÷A!Y[ìûŠc'‹üÇk×DN²ÆÕt،ö“´+Æʒ„Ϙ›:6øqkðé+ìo›£ãÑQDd@Nô‹!ÑÞCƒË”¬äÔDèԊÕÁÏ.‘š5c˜âmYqS¯èß*/’Õ¼—{GËbJ7XÏqðí”q?M]‰ÏÎKlЗTÜ\Œ6µ7¸Pô÷+‹«Å|…9( ²¦ÒºE\ÛœÈ$Ëô‹Œ“åj¹·&Èr±ÚW¢¸âó9"ˀËÉ9GÈqÀî@1{É]"BT줵ìž7µNP/á°AË·IZjèE¦M:™Awç¿/åÛ(~ô&”:Ÿ çE"!tÃ'tÖ-·®«’è.;¤Rݸ ,Þ²¹° Ãà›xuŽ„&™…ß%jñ%•ô“×á½è¡s°Ï:uùùt’Þ~ 㝬ÃI~)­¸½”ÕL_ÍÀÇbõÀߨA3L• š)0É,ÚÉbÐXezÆ@½w:C@kÂj÷1¼ìjÇX<DcnžB4î ðV4åä#ӊ9cq[öÙ[^qŒáò‘’ß”s‘]²iþO~þ1O—~—å#‡)³àN&`ø1âB,†‡›Ú3—äc·‹YÊûO~)ݾ˜}Z8$²5ø“;Ì øî51՘ûµ˜6^4iˆ«àœ¿‰ØtÐVñýïa–©jRëpK¤€)Ž1µsûƒ/ƒßŠÀ%”Ž(¡é„iGÝ«}4¹Ý´£=­£qø˜igό€\%ejI{€v̄!˗vÕiüÍ­{]3ö¹0-ý0ßqaH€0¢°a¨/õªl80Ah¢2<  Eö†QòØ8¬wx‚ž!@ˆ{Ù†BêÕ²†ˆÂà+h‡!ÕJD„Ú[Æj'mÓ¢*²q“BÛÿ“Ä¿•†ˆ¸F3•®¨4¶2Ž–ÄÊp7Lk¼ú†F¨’¤^™D‡bŒTŽ|šûÂ":ÀX)´t՞Ç•´û¦z0I'ßJDÐÎà+L4 ÛÎhùY©³Hj±`;æ58ÏÏ×ýœ=C.¿›Jë–Í“ý-ë°Æ7^ãsï_é +@ –aaDxêe‚ïúüC„Ý!k¡4ÀÛTiV)‡0— Æá¹÷Å#ðyòŠI+%p:‹ò“$L£½/ÀØ»-üx!Ü:Ne¹¿üóDwZ=2RóC%œZÙr›o¾]ß3ÆÕöä_–ÓWÔié>†8=¾®ÝÛWÌY™qÙsjÈïso)1§Çg«Ø_7ÓÖÌijD8(X+¦Ó|ó$Ípú?ëU»›6 EŸ A $@`±¶¨´4 tŒµ›ZJʇ jªªˆ­€xÿىãÄv®cÖþ‰°ì{Îý:çä8ÿ{ḿG½™V€±¹»&ühÏ\ŒÀGuß8}EX’¥”«Éý¡ƒnw÷íø(ꗋYõŽÉªßŠP¿H"JWÏk•sóýúw.èîäÉñfîŒo2oüöJꎬÎ.Â<½ä„(uI c-,Tw¿…‡uS ¥b¬A°´[ýü[4W'v¼±ÓªÒ¾¶±ÿruÑ_|ï’'ø,Ç6~¯ Œú‰ÍÚÑԐ´‚RP¬æCÂ,± ½ªÁíBâ^QÞÜ]rõT†–‚þM ©c8.¤ /0O%'vÛg¤i~'NúÌSÄÒyY+€–‹îxƒª'¸êþ›?C¢j\­žêþnõp8>fòG«Ÿ„OPãÿOú…ð®Têª6ùœ~9o¨ò”в¡˜ŠBBåÚ.ãúüI+ÕÁÎ!s,ÝY)ÒæL¯·rߨαÚÐtÆæ·}b,<îUs +9øh·º@óŽ`‚S€öµ3ºÊ­ÊÆ K`±_œ©]QAåß֊dY ÓÉá„?fL̖ ú‹¾K*'(¥b0PB+z,Ï|o,ózÿ bRh©´ ,ÙöCîÔðe ¹“Ñ +òËX™PEÂÒeEBJ«md¤V­ki÷êHÿ MÚW—ÎxW.]k¶ï²?„æßôœ>Y®q%Çÿ›]ƒ•Œ¬"‹£I7¿¨R0ÑF¦‚uªïÉ$/šA®Î¶Yó5†Ô½2Ò0>ŽPAqsG+7ˆ1t¼‡çXOºA2ò~î±mf±ÓR®ÿjuI endstream endobj 23 0 obj <>stream +H‰¬WéVâL}‚<KK0  3â[tDá ãȧ,÷ÿº;!éÝIGøÓÇ£±–[u«n•ÕYLû< •÷9#½O»SEUR·÷©Âü<”*§“eðÉÃUªpZ™çŠwϵ>i—ÔÆ©(*ÿ.§ñŒTT¯U%÷ÄTñm“µŒeŒ[ô?…s}¦gJÎð£lîÇ}>ƒ{‘«2öXþØ!E€VPÊ¿H^vžÂ2>û*衘eç|œ‘.çQ󓝃Œ\ia”Qy{©D4¹£ÉðWúÀi¿b'yg®§Šùû[ô‰åà¹QÜeßi©õñVþne,dEi`©/“q'¸1º©÷—.@ìHƌù#Ӕ 3ö*­zGCìU ÷”äk>þçhˆ½–O –“ÛX£6…•:“e¬‰K½'ƒÙĨ…:Pv¤ù¶¤3kSØò’f"¶)rÏ F Å°·ÀÊ­ž†v—z+6»!0¢ý´Q…´äÏië1‡ÝõTQkÞxvDL¯ÛEa™ø±¤Œ‡:m<  `¢ ·>¼+m×¹í "ˆ&cåÀ + -Yz¯¹F9èdóˆÒ€v´ø[÷ç>  ÇpŒ, ÈJú‚Ky$äÅsC.Ü1/.äa¹µ•ŠñªÙIðLuñ~m´¯.̆äS $ÑC]  œÇ§M<æ§.8q’áä {ŒÀÉ_Xp¶À›æ„dÍ1Þ Ü!qŽÁoãJç@!/fP@'*™ÙÆ §›Ü0ÐÈ4·Øêùr½´ñöÒäÞ·Ð#Lº"t¶ØGC«Ž ݦav†èћ1æLÎFóqbiï ¼ØÅS’7 sšXBv ,Ğc¢õLzï óÑÈF/š7¦–‹£Ô "9R‘ÄLE +ÄMazV‰˜`æE) æäÿRB竬kZîõŽù¼´Nb,]ÓØ[äû°\À¸8K²Ä +8¿ra³Ó0ò\e Cìs"+Së?Rá¼}w&̲ dü¤êáÀ–PH™V‡ó;ÐÝý´NËyÁÛÁ£ò÷>ETþEò2z\’Ûâ ÖÅÎ7É»–LÑíN͖Ü;ËêtÏÔ¼ý ÷ ½C›{Êû Ä1æÄ]ù¥„BCVð£n±#žJÜ&ò2^ûñЗ€ft2‹¿¤þ…3R ”±¬ÀïØÍ ˆ«nmïÉ;ïJړU 4©[)S€O·"S£m©‰L™jœ1³àã­7¡1Žmç×coíÐ+ ÇøÁv •¤_õ9í¤¾ v%!;òQ²J»¬ì¦%iÛ%“ðFg;á ™²æiŒ”š‰„kóAæ€å1?¿ö`Îx+Á£HF̀9÷gÑðwp…ÇÔü02®a†ï.&”³XF᪠~Hzˆ ¬ÉÓ´ýËñ~—_¸Æz¬´a~[2ß]’îð®¤1ޘ»³æUSŸ¶ÄdœaÐXæÜx?„¿(œ+©×9†œ@Vº~Õç´Ó_ŠÆ¼+)vüd<_4 ±]™±í\©/›Žbu‘ïD»P‰ÂWæNᕷEêR°—,–—€/$Ý4¬ËÞF‘†ýe ºš]| Ý_¥•z$SnæøÏ1 ±ìájâ=ŒÚh]DBA<†=¿^‘€4¤n±îQhØÝۅ;¾”öÈØÔ cš²îJËXNnc-óƒµ æ€ßͤIÕKJß.°‘QÎk˜¼½&á¶q(€ŽÌa]¯„Ðñ”92Gà:–1­yóÅ#ê±ÞÙb÷÷í'•5´pÚ³b{ `GK–Þk¢±ªï¶sÀüŬL¢RÝÿóµCž‡܊\Š[í‹£”ò+Æjy-Ÿ ð©ûÜ(î +w¯ÉMFÑ€„æÞ·i8^ïÓü.0 ]$4'Lä5Ø°hHÈg‹›‡2w_¢øCB`'ª²/”ã5YJ’–)§.Ú'ÛØh[júµ|,S¹“•ãu6zѼñ3ÆÐ:$bgǺ+A%»î#Õë®d ®žç¦ & ‘ëº{‚Ñ\Â0SêõÓ.a¼”zOÞ»„ó>›ÌÁ„,6 üÅ¡ìÃ\ꌀø ¬ê³ë[êͽϢˆËðׯ0êRê­¢þÛW4·/*ròç´ÊˆkCÕw_Ð0ýT1ë·5ÇÛ¤3<ì+i¿–êËdÜá4ÆXå­<È}ىõà;Ñ@H`Ýô™ªï¿àOŽ`/Ù~cPüYÒï²}öJ6/´\i?†äîӃ †äñìw(ùûçü©*ªJ7ǧªÒ›³ÏåbŽ‡W¾£Ÿ”Ûª\ö¶ëõPü${óúÃvC!Z%\Dã{KQqDÇë0À©•FARt±Ä]$+Å8}‹O£í¹Ó¸Ó\bè85g2æÖמÒL§j­tvÇpz‰~f/Æ4§‚ÜöŸ˜¹a=tÊvªëë¾í4K8ý^¬Î¶CäNÐ$À#Üiî!Š9ý~ÕƜÎb±ˆã4uñ_çÍ© "€“WÉå.WÒi®ßg; ×þªL§jmT7oˆ#çJwÊr:ñpª«yšS€t»6þ6" €Ï"¡aä¬Cwú#${ezCNí ª +©™F Ÿ¬BüÚÎ\Õ§wya~grßú2|wⰸގç"¶&aÎ{¢sG\ð¿rܜÉØòt(Ê@jS¶]œ2ŽvljÅ>€.”q Í/<¯R¾Ý܊- Q™Ó•z,%ÑOÇic„tµâ L¯ Ö® \!Á~ŠÛØ%{oPJ‰yƒZ×Oé¶b[fH‚HÇ©%I œZ¡à¥uÙ J +'g¥ÛÕÇÎ+¸Ôá>ÇÄ$».RÞ!¡Gàì§ ùüÐäßeø*­zŒó1X~'~|áœ)xC‚¹x¥‹/êëMnÈꮃâ1/ö¸ê˟h\aV‡å¥Óñ˜ê :®úòšãS_Z'1A´Žœ=m]õšÎ&ò’ÇtÆ{z,3ږš~7+|¬¸s Fjé035bÂÀäØ©ñ(ýçD ˜íU\˜ª¡¼D÷ËJoƘ"Ô¼’¦%¼PªåQ+½¿ô?©bæIe— NK¢P^'‚0,ä:æËW 4VúsÞà8€‘jÌD~—$8põ©Bj»PÕ³Ï9'Ì$ÜÛzÖ b_Xä¸êW(å¬AÄâÕ¦o!àcu`‚A¾IÍ=A±™Œ?çìs"¹ltZdèd%y¥¾l:Šò/’—Ñc#6Í&Ĭ&¶Ê˜Bþ¥Bšé`2Nªôˆ ÒhþÝ`}'P'ZØ 1ZuA 6‚è­H8ë«CDêÌ¥¹Ï=\gº¯xÛ-#2$1"¨M±ÁZj¾jœ ɞöæ-FeGQÎÏ£~K”Nù*øyPýv¹˜`魏c5ƒþðIîýƒŒu}.dʼøü‘[å@Ć>‡O€$Çë#"FN´{Ù°Œ]¹'-Eî+l ++—>̔zO>r©ÃMaëìJ?%Ì0Q q°îJ– ß«¬ÕÓÐãMkà¥Ô[E=í§m®·äÏi•R¿zª¨5oh3íJR Ð¥XÝ­-Ù˾Pd¸ؕ¦ÊJ€ÈXaÂkédß" -Yz¯ñ¬Ê"@ˆý­óŸ”,<=ç† r‘ rû¥\ A c† *Ÿ xR—ô!C:u…¸iÏ~V¤zJ﫧÷koõ$¸%‹ ×Péêü™¶$É Ï%32V჋qûEñ@ÌQjÖÈË.F<§ˆ‰õ …tnIÁXö#®&Ò¶«™¬A ®&g:÷Í=W#KY=µÊ츒mGI~!7·šµø Së¬ÙЋ#ö3[..dïáöÊab³AÂ:ê\ùmbí[œøéÊQÙµkÂ]öƄىwSvˆŽ³N•ìÛ­ ¶’]©ÒÚØ»œi¨½TR0Ô¸ƒdEé;µêûódu/Ðø]…’,Zk1I<%YEÖkø£[‹Ø{¦'Å}bÙ29ó’w“‚-d¹È%âÛ»tÉËñJŒe˜bÝmUËî1&Ö'b¶]ìxÿ£ÐÖsÎ&'lV<®íˆ¡ü{闧!l¹µS®Ë'ßj—ˆßÎbÇرÂÐ:åæ­|@ t˜,@l0¬Œk™mâ¯oôîv¡äq^@{ý„!ìC‹ƒêj«”~Î 9ï ¸„aç(Ú@ˆyÌfìtö—6þFãÞC›|;§ÀÐdƒPå±Óìì€áŽ.vÐÎZ¤½£°ß2 1–HÖ~iLÐÚ?hþeãáj‹J‚‰·±¿ù,¤_:”×àkËc îÄãeŽS‰^W“£ ™¦¢žÀÉ£ D{æßÏSLÕ%¢ó¾¶Ôìt§òf—Ë.+jcgð 1egKlg´2Ûᚒn'‹f›¶ U‘ÞZ&ÞMÙ!aM‰¤*Yg]#ñÂë‚K‹a·04µÂ ‰Øk«Ö9ù·0­öˆ’­ °w1Î)%=|—ŠCã1˼<ÚB©ª‹kË5§Ô~®±ýË]yS¯¾ èË­z²PnZt06w…JŸ›ˆe”›æÿ3WŽVh6µ]s T…ám}ÖêÅA:–¦Â¾‹ŠÀ5vP‚Åéú§0„=—ÂP›^¥¡”ï=;¥ÖBFCÙӑ ¼äØ,TË¡PN×V¥°KÙ‰ŸÎƆßùú!¤jÍXtáhLöŸ×‡Œ¹Ò0>î¢kº`bÈ䈷™æw4æ€Ïþޖ·³9x{å²"5U)ÑÒp=åíía¸~Ù8Y®êÀ,;–f*³H»K:Yñ¿ëáxÄú©èç¶iû aÃUðW²ò˜ú±°=@àŸöTÐȋFÌZ±¦À¤c­…OÛ$ê ðÂ:VID¨àw±›ïR°{·Ô>Í +«UJʧÛÃ>C>ãQŠVP‰ +-în(I¹krçÿ”<—N­²\»þJ£âÕRF¥d1‹JÃa•Ãß·¨Ï?B^P3´æÑÝ9Cw£Lµß§Ï¨C¾¢NCüBe͏º™é%^Ïëh¸á{hT|¢qè6€ÆOìju¡WëÜðlµ^««oeó¸ö-óy¹‘ø†ˆ¥nÏ^©ÐË¢•>£©f;â̄žµ|‡û´ÿs%”‚RttEï”„÷¾ö'ÂݗZtúæbv¯}à`¼Ò•Ù ‰7‚´ö–ªjõ6×oÍ[Rɍ]„¤é#röí_’âþEoàdIÿö“ÆzµŠ²}îâ"¢ì  \Ô87™Ç»/ÜùŸ(üeÒ¨tß-¡²oÑZ­Ýç5í_,‘ê}c÷\JˆtñA¼äo¨X|VëÁâ²»>›dWQbÀ'ZšÔ¡*'Ô^)5’&Zۇаy¡Â¯ï=*Üy*Ráf·G1‘‰*m^ÃË9ÉÉ-*"ŸpØÒTäóf@qø$>œÁç´ªff›l‚ä*÷±h¬sõn÷‰» ÀK‰©T«0~ J#ö±˜îÇ°âðc† CÍû"ê䔎 ÖøQÐH8V¡õ_ —.}ƒ—õ<„aI-æ¸_‡ñc÷J²Qày¼Áë¸b§WÁçșÎ2_x›"ÒQF?è=3Œ²}¡„ŒbñI¹Ø¾È‚ã4¸FzûªÄ›^ ¿Ÿ²Û d¼0»/+,¾)kö\Îräcð‚£gö].EŒ°E { Aí BùÍÄ8ٟüØÀc[¶CÀ+›¤f Uàð'aXâŸðXèýK,\^°ÛàÉGà Ê¥u‹0c‹°<ãǞjVÎÜòjþX?ϒ¡ ý*É$x)ˆçšÓþ5¯y‘ó 9q>{bÿ^ÏJ×ù _ÂT’$µ˜PUcöéuËü`ñVØeÏø½Å62,žµSJ!מ ¯ñú2wŸûì4IùÇÐT2©_öOï-{Þ VP^÷²^^cs~§°ž° @“ÿ€½[‡( ìuɪ¿&ÞN„ü‚ß…È/Жù¹‚ÁއRº¨’_Zj§/1‚Òs0oó`¢,BÖ4y¶sŒúkâ/¤´ÓÌ'’~š)˜og<í«—h©(51tbÚ]zÈgê´ÝFcÛPK[šQöÓ 0 &;Í°W ð + 4ó­´0×T¨0›¹ßA3:E7ƒ*ͨŸê3¤Éu±ƒºÜ"þn©}4ù^‰õaÐhE$lÌ £Íöº˜\6é/4{Ÿqø‘º ~ ¿ôy„¥¿ ƒ±6K µìc† “9—$Gxëm‚Â[XáEƒÀ,Ö~”~‘é\ÕՂÔü¢ ^â€ètœ53Œ†ÕtŠÛ¹&,‡g|—:e¼S)Œç¹g’UƒuPlZÇJ¢.V)¸œÿ:ƒä¼\“Éâ*¤ßWƒœ†ˆr!¬îM¼UhVå*¯æÜ]E\aÒü’.éªÒèY&Si ÍæJÕZ%òï‚q›´5D’4¾_áhGÐlªœÁ’J¼$k¸&¢ØK”ÈJ2ØêK/^Þ +Yi,= o­žhU”šx3•3›¸Ï´$˜°³Ä%öávDº9 ŸÏ—v†ÁbYl¥ËÊR€ՀQaä¯ìžc·‚$éÖcÐFS\Fbr.äÏÀˆûNú~[;Yª§õJcV!¾‹: 4_ŠÄÆ#UG$ûªÇ¡8}ºNƒ¿p\U^RGøËðóò˜ËKp‰{ C9y_º€S„CChj~€¯4îóf"VHFA]·w ܚ 0Éí¨±ƒ ¿c`´’gÒ!!Z@P†ó;¸´üv}2ÊäbÛ~u¥ ª —d„cÀzýÊk‡ÊÑÆ«´1 6<àMb÷‰¾ A°ÊF&þ™¯u{Œxƒ ø-8’Äý1*}ØЫo"èöŒ‡tÙÖÁ<¤í-8·i„p±ß¥Á;½ôË7!7¤BD3€‡üU6pÐÝö½ :öWw³Á…8À½Â°ì7w°aÚ.¬!8!öîpeèX9‘òïUCÎ^ûýzˆi¦±Â1©îÛ¸BpÙ¬ø-¸÷ô+!ÎÏÌæZ{K—ÊÞ÷ø ù=ßRN6uÄ`“x—ö¿yH‘c±ËŠ?T“cNá¿#ˆ I8Æ¥Èڕ?JܕŽÓ~Ù®&ÇxÑmÒ·wØã˜MÇóòÿß¡N])Œ`•ŽÈYrB*»;H¬ý´ùòý-Pˆ_j?@ho"ÿ¦ã%'Ë lã6Â%¹UI<à˜´/’¬›ÿ¼#Ì©ìm‡yaN”#…ÓPÏÕ6®«×öªº¯4lyŠå7_ð®ý‰ g¡¡,ðÓ/vçá<*ú‰Þ}îžÆ´ œa]ßUõÔÒ´WhËôak#åLÁbNÒ¥qP¨–Ä8ZÓÝÂF+aÑ Áv¼ñ x‡“Cï?h„ð å|LŽwS ÅCæºTr™M +7>œÎ?ò6›Sê°8ôï™Kÿ»f.µSÒÒòbu§AKCøb‚ÈŸ­=äÓM®ÎÓÝp=Ïý)0l…‡×¯8Ül$åÞ?jëÜe¯w/gn>óÊó”~Vcw¦z³VeÏÂê®´wSï ‡»²©ìá-.­>ÀÀÖ ²pŠ-’ã²f9¥@&›Da“r¦³ÉG6Mߢ4Î^òo±³˜À÷_ÏÀ1¬§;™wv Y.’.nß0µÈÕIÂ)è~Ñ,®Æ˜AW8¨ ªß½ò'zù™ëä–=p-µ¸”ÀèR +<ôŸ³É±Bu 3*Kn‹þr¥"©™èƒ‡4õ8- õZAíÜ㍄{úl؁zˆ0é&M‡×a¶¥½˜NÂz.3éC *£!:~ˆ¡+ŒÎ¢i+oº[­!3Úë>ƤϛÌE\Ú]o`dQ…ÊPœ&õnö_:^z™zH© _”™Œ$•»»/²† +’ íC\½ùÚ;ù׊ûû* |$þ…¿joÂÒd¯`[(Ñ©[N +øî.¤|À¡òüŸ…ꯉ´ðØý¬ê]2èqˆO)Ô*Š”Êe³’Éñû¤jj l…Û4£•„ÎÔÒ¸´¦Ùÿaô….§Zzã¥ÂÅ}S¯—¼~Ãa¼Šò»a2šLn+‚~ƒýFÖWKþ™Mä„jãöj¾¾2§ +uVnüñB&ç´$SA®¿­(ÄMN¡žëE9Ï?Ôqqä\PVõâøç·(XE¦z÷—åkDxk)™ºÈD¤ûúc‹´²è‚°ØLsÀÚEO#¢MJéš ½ÚX ‚?Äë56#ÈeôàròàxºNŸ>š"µz 2ñóÂ(ù¼Ž~Xo»ólº;îßizhåõ¡dîî¸Z…ÕgD¥(zJg?t~öG+S(PïϾ¶N‡Þ/…+Œeè1"«Œ°xY Ú Œ#<ŒOKº[¼(„?ðyýÙ¥Æ89¶Ù]‰ÆÚ +Ó¿Æó…Ú{™öÕ]®q£±^ª±ëx¬TÌҋŽZ™§CÀûb± ]Åн$‹¶óW,Æ8—kUêr +Mš^H—èaEDÍî“Ô‡F½“µÁ«nû÷V]#õ' eMŒiԒNµ¾,Õ@±ý7‘­1,ÔrÂ"Ð9cÜ®ùzñ‹uŠ,äâ[7Èê.ɶn…ê;Äö·È^µ¿ÐÜç#"’3šj‘?Ì:w­ŒÔË +цSRep©™šaÚU)ߎÍ+!©ócFiû/-1} »®¥þÞ\bO¹öÖ÷\Λh9ïˆ;)¼—ÆÛ»¬¾ž ¦aËzVžnâÆÞÖÐö1Ø͂¹è>èòzÎú‚8«Uz}µ±5Pÿ_p<› +oz]PĸPT8„<§•q¼þá;@}Ï.X7Û:Ån_;Ͷ]i»¯ýz[+”9mü‹¶q5 ´ºÀDN€àFSy½ˆ¯ÞÆ– Ƙ>ð0÷÷²þ7ê²/>ÿÄcLF.ãßy ¤üù7Fx¬…C'eÒµà:[‹³ø‡£ÌCº\rë!] ®¹…}Ì­à:[è}·‚ë@n“Ï2”Áu ·÷‚ë@nµ}̕à:[m¾8\ĶÁu ·Àd·‚ë@n=¤kÁu ·Àä“x‡¿äö.+˜r‹6¥Sx{¹EÛø)¼ƒ½ÜÂ)'ñörë!m·ã¥O³ßB¿¸\r‹ºÒ¥à:[ÜûîׁÜzHׂë@naŠ¹\rkñ/¿\rë!w‚ùw£Ìs"ï`¬eûé(kÒ´Sd µüÉ(ƒö‰~4Ê<äi¼ƒý(C^ìÞÁ~”A.'ñÇF™ÈÒüx”áæÞÁ~”¡ÝòÞÁ~”¡\þ£½º÷’ç¡ðpŒ–UJȒ"” *â¢(¢¼àâSqÿßI:e´TÚúC›&'ONžáDv0—2|÷ͲÃEb9:•É®ï`›ðGd=„-›ðGdáôíØ“0ð‘{M‚‡°eþhàVÚ± 4 à”vØ9ª8˜Ê€ÇŒ6á”rEʌ*枔!kÃ&üÑ$x[6A“2ÚV*óz.sOÊd})¹,e؍+¹Ì )ã™×»@±¥ÙÁœ Þò¨ì`N +JÌI!vPvC +²ŠŸÌIù1'²ƒ9)h*vdvÐý-nñ Rðæ×R€s1u¸Î‚ÚÉû®3¤€\߶ÃEÊØÊæÈj«™̑õÎdsdA_ŽÈÌk;AàoÁ[:’Ìý­‡p&;˜û[…ùÎæþ’ÅùõÛRæ±p¸ÎHb~3‡ëŒ”a†1q¸Îø[aîp‘2¸/¦×)CÒ=)ór™{R¦û17¥LOKi_ʐŠI¸Ð-d±c ÷ºE|$á@·ˆ-Èæt‹ï‹ÙÁœnÕ,vlv0§[XŔpIex/6¯}d=„ýÄkYÙ)ÙK¼»¥ìeÜ+eBÏeîI™‡Ðs™{R&3?ﲔé®IÙõÊ)3¨˜‹R†î‹šËܓ2ÅÁږ2ږ”yg²ƒ¹”a}q ;˜Kî1²Ã>)ã1²h»‰×>²°ŠíÄkYp¶¯}dá¾Ø± ”2Ýõ¹)e bvlÂ¥ 9%6ÁBÊ^Û z—”Á*ڮݓ2t_4ZwMÊP'«¹Ì=)“]_Ì(e7)Úi)ÛT1w¤Löc/.Kêd5—Ù•²ÂÁ©L^å(Â=€n±c ÷º•µò(µ¤Û¯B̶ѳŠŠ9mÀ6zVÍbv-ŒU! õ½ ¥”å{Œ_c÷ì¶y¡ÄŽ)Au™x^º6È×ñIzÇ ™zàSE–£r:ˆj%µž +'O¸rì“áÉH¬„îþŒHêt‡J½il{²»4º4÷ƕŸg58«ÞrëE¤U„Žð…™É4+0¯·ó&ö–u**H÷1$y•Öo;@Š žäë|AØ{™‡qbL˜‡Æ’†>É®<•º¡ÔÐÑÜE°ÐðAÉ-Pêóuýz¥>ƒuMVBÍâÓˋ +Ep8«1“å4ÿòY¦"ú¸ã¡Ì' †L×Ð|µv}ÃO–_r°ö4-pq7쟥àÅûšy þPÚÿ’Ü`EÀåZS~ôEN# #MW,õ–ga\Žd^³¡$4Ã( +žÌ=dpÁdOgÜqŽÿ ÿË©“-"ø3}‹v¾€k^*AQƒÁ~ž`©ìå©.K0_ _õ¡<ÒU¬j +¶Õ!ÿð'J›ÂÑfU¢8ÿŽŸ§')>[†ÏÞglDŸ!æçۃ…¹YjHn”ÄU¸7ñ÷z‡íå[åHú÷g[eþ†ÀCȅƦj”£êa£ÓjJéÒ¿gÜ ÿŠ£$X-¶¡ù±£à +[ÈÎÅÂïõ@Ŷ[Œo¢®W…àßÛHê^;n_ŠÇªæ뱔ø•Ø85äÇÖÅ}ž+ä‰mzuýmò萳­_êu²ù×ÆÇL#ýSt!Üp̋˜2€ŽMž<-$yÒ,Å?jOmäú’ÀIíÚKáSöÊ4&D÷œí-\Å?¨†HH°×¸ðWsÀaÔç¡lòÉ#޼ѕF¥òÜËb’Uؒ™¼ »U”d.'ÀÓÉáJHÈ=Â`òG{¹@u!cQ*Ú¤¨Kˆáq|áֻƺEe•³7JÙ.$ñcUÈJøÑ ‘õe³0w#V/eG!´e!@ÁZ!²îo—‚ø×¢ÚÚõ·å»‚÷²wУ%0 M–CFKt.ƒ&+Ë!ÿy͇ ½tî,·Þ‘f–Cç{‡€ƒU -ÑéŒ,ÑéL–»†ô z·D«!³Mqm Zø¬æ‘-”†sëN–F–JK¥÷¥u'ƒ²œçÛ@iáµîdim `ßï·îäÑh*óŒ&–ŽÞ÷¨uòhº³Ñ ¹ê{"ö{Ï#1Ûþ¥<1“·l¤ôYÅ~š™|N¾*ÿ¦?àÒD8~~½J€¨eñ¦q`þf” žN¹RO¢ ,‡]9öʒb¼û +M*;s2ùîÉ»7–Žµ½>±èCù$¥›\±ßÐ|;P^ÔDJf~œOe PÒVÄPz«0ÿK·¤j@³€;¹s (û„F™.íECΑ.iýžÜæ³bñ–Ì}Ÿå˜»€² ++ùßhLDýЯ¢PÂħŠÕ_í¡;àHfwŸ·‰‹bj0Énd­íU‰ôÀiõ M'^µò»Ø·€(܀S/àß̱½9ØÿûG֓ÄZUü´Òlæä˜|õÚ7O^r¯qO£x i9vs£iÛ͍£!ӑP]‰5@­Ä±¨EƸzÙéÐs—ŠÕçÙvö½K»;wõ•ØûÞ³Ö©íéT£öj&v¯71¯6ìEå½Öº¨ µšÜ²z}ÉøDÑúxá¯åéRF:ùrþߤŒ'Ýf·j”?–2ã¸6p«j%Ü›ÿ”·ä„wvß˗·®¿Y¾,¸u1Žk·Øcv{ùÉl® ܺÇÀµ[èd§Àµ[ºY8î܆,¸§ä¸6p«î•N€k·Ä)9® ÜZn.\fáýø[¬þ>v‡í¸Ew±Ýa»¿…Œ9® ܺÇÀµ[Ð}§Àµ[mq\¸%Ln,ôk·.çÀµ[ã¸6p«rìÀ­}ü>³ b{Ù¶gª¿—Ýa{fM{å¾¥ÌkHx˜½ìÛ¥ ™¼Ýa»”‘©ÜÃî°]Êà[¶íú>ÇR†v»Ãv)SýØKuJŽw«³ô¬‹ùf©dì/ ˜¥gqö-]Ûôù"Ë×¢©~"ê·L¤1¿`øÁµ±Ç­œÖâ‘O|v¿ÖÞ҉Êá ™‚ÔfßÔóÊ3=·X¡ +gŸSàm$±or9˜‘ÂGbp¦Ä…GåE¦¹ÃWê¢!ò*“O¾ CCbk‘¯H­øï?$À¿„f‘FÓÄP¾ÉÁ冗ØÃa¹Ïc€ŽÞÌËÃLI yM’~—Ç~Já¨ä¥Ü@®µ<¾}Õ4—ø8<T:÷fcZ&ÚãÏ®1\ElñIÚ;Ø,úñªò¡I…Ÿ'oU©ÈŽcáçtJê~f@ÒÞBg_0%å”{´î +/)Hj\¦¿¢^9Ӊ$á/ t_öJhªÞg| 'aƒôÜ?íë“u¡þUyÃÏ\,)ÔÎoŽ4¶¾‡Oã“(Œ™X5Ý÷ÝB†”Ö:Ë#J쑒\0f'û8õŠútÓÇäì]±øí>ñ@1^æ4þ XOñìQҖEžJfOAïKå­êʛ¼~ªX¥”^û‚‡¤þà)™•¥¥¯wý2_ÿ׸|¨|•I챚Ķ2à`¡ýf1±œ/Ë^¹RƒâĐÛNQ,ÿ‹Áe™…9ÁnKÔÁÀ-фÌL}’ìMfŠP¦jNö²çq©è>Ê +õÂa:GTÄû£·‚Pk–€0¤aM#® ä4÷ úÄý³ò©ü5™óæΝH,¼`Ýý¡»Ï8¸o´"úâñ×`bvºÏ½Ïxø°:û©9c&Ò9´õ Aã H˜GI­Œ£lQ1Ì‰Ï Ôh%`j:Z÷ñ¨ª`u)þéûàcýiÃ.FPq1̏™ÈYáÂ`²¦[<šê”Äò0Äë¸æÖIlnœÁ´âi#%Y=öOE—Ý.%SÂØw,:€Ð&g¦ü{÷uJÉbäƒÄsû毛{zi»ˆ_­ÍtùÄ£wὌù2îtÐÒ¶¶ øڅê4åÖÜLO,¥Ó8Ñý¶dò&ì×t¦{ÎlZ*)´]ݐêWU‘î…ûó(þ%SÇAÀòa”˜dL-™ZÁÑC~é¾õ£­OS5#¦^ w•UTäAÄoÄaÊy-Ç7ËMδò×Þú÷Î ó[oý{gM{ì'où0w2PWûq.„SýWÞä­&ºIÛ+Q_Ä@nZ0 ‘2dúz]ºæ®­úŽ‘µ,<Íù̯•Ø8X¿˜´ð¨Ƃ‰AZ#}ãÛèëÐð­î>ʹ·üöC žEª²*‰® $gˆt2NÚk&°™O£6'ˆ=Ëây +îÌóÔ8­YÛ}™öA,1ÆX >=L%l|ë–~ú¨´NäìââÜj?}™@YöÆÇ°#ο6Ù8ÌØ7kdq.V[‚t>#§EŒœÖL ›F4-÷½c‘ËwÔP­¬O.¶Däü .Ã:LàŠx4±%¿2%¸¿ì´%˜„6¾'ÛMIklÑO …Ł’x’‘f£(ró¼€:ҝ5äç|Oì&éùQ“´Q•ÔÓbqâKgïÏâO†´õ |òºþ|ƒE里tCQÿÒv1˜îYI/²a4%êÆu9j,‹Hág(HfH;óJ0 ¦³ +-Þ¯ò84϶³ï]*V¹ëÀø ìÐgMxÚ³ðdb÷º"ñªú\äÑëtÃÛdö» Á“[V¥Ê¾tÙíýVäïþî»Z ¼¤Vœ†ƒK‘¼ã^I”}v"Y†ù}[‘6%¨€Ò>ä¬Â›½È_êU÷%`-UY,Ò©I!¼lò•›[ã T?ؒàݖKËÀ¿Ä^4R:ôúÅÿe/¿Ÿ‹ƒiSÀŠÁâU¯B„Gºýž¨ÂÓGˆð¸*=•ñ*¡iÒ9O5'Áv0é„Õϝôì1VMªÞɁì¤hrŒú· âHxŒÒ<º%­Ž+]n¾ÑùDஉC³oªËs‹ªÉ…g×æ….gGË ¡ œó^”t\‘3&Ÿ€}rÅP»ã\ëêl=À‰Œœ +?Ðy©cì Á"éNJèåƒEt@p"§—«ˆ4š&ªÐ*ï˜Þ°_b‡IºZ5îù«‚ž_ñ'L­Fo6¦# ™×5YnñÉÍA1*Þ_×ÛÀƒ÷°™*ò?| îK&Ýáj…8}ŸÆ' xO¾Nâiµ¢FÃK‰t¥|x\¬ÉÞ³Jە¹O܅X‰ñ hírT,wZ°Ø2|ƒJpÐØ1|é !ÿµtÞ³dQ°h ì_´‹‰€5ↀ‘Ñ™ |&íؗ`ЂwV"j$‹h°(Ì7µNîvo aŸIãÃÑXÀ0B8ñë/³¡>s}¬éªkh%B_ZÅax®ÐdƒPü$1ü! +8:ù ÈÈõ®‘–}Þ¯Ÿ"÷½ðÎ@I¸=få*²I„K‹±!BŽ%ÈÅØ!Ǥz~¹u"A.Ɔ9– ºWî!Ç„Ù-B;$(ã/rª³Nõ/Í8nô‰é"ßbY]$Ž¸:á×ö oT*ð/‚ìuóUË´} Òfÿw{Pg^³ìAÛ· מö úØÿžÅi endstream endobj 24 0 obj <>stream +H‰ì—i_ª\Æ?ÂPAـ榀šZ9–Ú1‡Ô²ŽejßÿY{jÃñF±wÏ´‡5ü¯k¥ª‰¤œn¬rœÉÿUãùfz š¢Ñ¸¢©2#âhrÿlȌ‘-sjû6ˆŠyQá´`@“Øt /õ/ç**ô}3uîµ¹ôÍP@wYµ¾åz¬˜oÞ«hÄ´uò·ˆGóÏÉ~ ;¶41}Îá¿feoÒ(ʌç¬$L•¡„ŠírJ,DQKKLT҃÷º8¼ŸÉð +҄i^KIþN­‹õV°Ô¬#”Ã/‹’ïñÎó÷¡Ü¥¤=§¥þí¤*e[«,qFÅJN#×@ãA/NU—}[^áogœZafrºéù@B$ÄÂý*Úúj,ìWy™ˆÈ©ÊÛ ^ÀGÑ\úi%ã 4ð:,ÁæÈß` ї3¤ËücÁÏ©§)F˜VʆÈÏ5„&ì{H˜ªJ•|4/òì“ßZʟšãÖÂË0_#a[ïòíQ5¼”–—°þN_÷!%½±¶Xœ³jæá*öêsëÁ –µ¾õ‹é/ÿ±ôtY¢%V=ÑáÑ7œÓ°v9a}“½U’<Ñøó’³Î€Ÿ~Mtɟ>Oâ Hýf#«Šwœïv†ÏÙ¿±ÓÞåt±–Šöð½QÃÃ"¡­C©¹¿hÄÞAö+!#4½ù0Ãk¦®ÝDä˜r6&ÇΚJBË4™d_{Š–æ™Fæõß>ËÞîs=ÿ]Iò?´¦çɲg§m„9§?r¾ÂŅ¤§£öƒÛ y ½ª ø'|äKø~·ˆS‡]³ìĖ#ðÔÃPô·$Û ËÈ;I2¿ÎCr…&b9UHäÍ; /'!cÙŸ­H‘âÿå(R;Λ}(Ø31VÇò¹LU»ÓKžºÄ*Ja±P•¡žæê ]+üén}ÎûHàµéϵõ­²1µ¬|Ï`ì1SÿðNÎ¨‚pEθi2¥ÛÛ¾Ôý¸?צA„¼ ™Ù[y‰  ¦WqëÁðšÔ ý}…Þ†MÁºð°…pù­°®+9ëJŽlî"Nò¼µ} Z®ËŸi!AWª«4Gz J»n†ù½1$UNڛšWãï³Y‰'p&µùíö‘˜3‘{‰²2@†ðôFG å¬ÞNj¿/vÃMs»½sÿ-¹j-¿=”2P'~4~I¨hҜq_ñï1øÏz°¥¸Aļx­À{ZЄ¾ ’Éš¹˜}!à]¤8#•µn…e!åÓ?~¡Í¦2=b54é¡Øç[x"”덄Ä aÙPÎ" <Ñh’‰8ñ×°ßãµI~€~3;^üYš2қyTH„_„3D3DFP)1RQq5º€z©H"?Јˆ@^ðbrúæªÂ/àJBlµØgíR¥€çVÁY-|Ò®û ž×cžˆKIÑöá-zAq^/ò…s “ΤÃõ~åm«¦G¾Z›Ð —/ìçÄ6ºŽ+9Ròm3Åú_r´õûI…³i7ZäâgÕ¡ðÐ-ö3…³I…¢Ï'M”M_)åh†ŸÓj³Qç=ôŸÀÌØ+ÙÒ=Áq©áá:¾h±n/#òEî²KÀøGE]ß%+eۜA³ûÊd1acv‚†¬ðPr¡ ì:ôƒ´¼ž'э—ìBù;ùõN®ãût(ßÌÊ4Ñ Õ ·>Ì4™7m ­Þ…ÓeŠk&gj3|•‰vG>óöþNÝCÑÆÃË{Nv'­áڇžgm¸–ù-êš×ÖB&p?ºßü68¹ ZžÉæ=¼,¾’†®Üö¶"+µ³§\Ž{M]\gƒ´\²ÀÇLF¶V¶VŒW>m"kõ¾ƒØº‰,f²³Øº‰,QdG±uYØå_±Å ñ<Æ0o„~ºsâñ•mæRFøìçaçMÆÃ?=7`çØjãIWÊ·ªp†Þþ´ôµå‰Ûô“ 9gÇ ýb¤xl{Ömgݐ6V »‹ÑËÚlñÛ.¬ „ðßB–ë\ˆ¦ÕÔ®#ø›læ×V{ßOl#?¡÷·£ÔÞ±ÒÆ,DãÁ`ÄHØÆÂÈÁ—9„¾Çã íÿY +—ppã½~r^}lïõ“ó¢èc{¯Ÿœ—©b[Þk3:˜œÎ 8/ÖÄ@ï?18(WƒÓy´ÒÅÄàt^°9¶‡”Eþ?‹ýÎ,6™®kv{؄¥Œ0Ù¹M8PÊÌ®tl”2s~qlŒ,¹Ëñ ؗÈRô¯°/‘µý˜[†&åpèŸ&¢÷² šŠÞË&h(z/›p IÀ]¹± Ýf·M8Ð$PûلMî—=l&p̹M°MBšÝKÊ(z/›p ”}qn”2RcÎmÂÞR$¸…ì»®Ü∹®ÜbEv ÜðہRFòò_ÀyöÉçf*Ûr}‡×na·Àu€[ÒûÛúêGÜâ]\×n)Ú5pà–T²;à:À­©/_€Ë{*ƒ»ev؍[Š>Îì°·¤’îfv؍[k׳Ãn܂ƒ=Êì°·í¸p‹kìyì +¸pK¹®ÜR´kà:À-®1§À=ÜßR´kà:À­5‹¹®Üb&»îwÜ^οD–ôþf‡Ý‘5çJ÷³ÃîÈÚäÿ])Ãyùyv8¦”aŸ|ŒÙa·”}òc¿&eí~vðÆ_„ÝRFÑǙvKEgvØ-e؍oÍâë¯H®d34¹?G¿'eԑf‡ÝR¶öc¿*e&Çö˜º4»¿”Šev؍[¨±£Ì»q»5WWÊpÖ5kïrdö¥fÁ)ý†ûR³ØýW՚ü5…4‡]ß%?‹3sûm‚ÔÏI ©ñ‚÷Ùb2a•ÇÄÓÄ@v¤ošuÒíuÍßnGö‚M¢ñ ÇowÉ –•™T6'L•¡$ò=VGã¡¢JÙN¼h¹qX¬µüº˜ÔËÃKra³s2[»©0³/â…ö‡Îø¡ä4UfúÝ$ô•Â‹yñÜ N ZX'0?M1´R6D~®‘Pú„©ª$PÉGwHµÙ‘ ™lÇÉbvòˆD‘ôì:M-è}(‚îÀ«u{åìÚiV€ Ú:ž\ˆƒ¨µR’0ÊPµ¯‚ä÷Þ§HLpÅßpj{áùGEäÒR’A“„/ iÒ\ÉRÄ+Òc +xQsê*ÉYJN7?š4"<Ðæ2“¼‹Ã“òŠÌ,iø;þTfàÆÆ~¯O /ŸÊÀd|eÃ>X1‡_µÐZiț§ÿ£½:÷‚øä!ZBšºx¢ˆ‚ E°q +*¼ÿÍlzDŠ/ù¡ÙìÎNù­K´öªô!©~%çþìQÜS ò?z珒ƒ8ðX7g_ûPåÝ{³·‰¬ãÃQBÞWÔÃ¥Ÿí˅»rي:£€Îۏ»Wº6{žÄò®à±AòÎàßî§ E­“—íý¨TVî=JxʎûeÕïwáh¡b©U¸ ™i%ödG+0Gªˆ(Óï2€UÔ«K<þÒr`–B·ó‹!'oÜê‘n$¥uŠÜ²ÎÜbã˚@"o× Åò %F†´ÿ‘@ц/iO‘ê¢ÎÍN¾ËïsR+îû‹’$ªDø£ö,&õ‡©º¼Ÿó ;®9MÁfs9< ˆ"ÏWdJL¸BŸãv7oý†…58³­$|3GFÁð/߁Znñ¡Õ¼T–ÿ.ÔüùP’‘éy]У1z2¦ßD⠛ȍãë?ük¸žáy*¶@EDZY°‡òLÍnW¸ßÖU¸F/´ÜLËLùð˜\Ò)Vߥá@e–PÃÅ@¨¾¡‰ËÇá‘j‚s‚†;z‚@ƧèÚWU¿HWS­dä!ÃFª"L‚6C&61Íl0R>ïÖz®¡}ø€ÍRññDØéør± ¹ÙbºYðâ;:5¿(fY_䟜×Ð _àì[BÕDÛ7±Ò –6Aldþ`¢÷K÷êÓ>¸=.h ®UxRv]-"8Û@10d°±¾ +¤ ‘%C£Ããx/Š Ö$5âpôB[MBž)Èp|KIÈ3—´Š„ )¨ +1SHe1á±y« +VE# 8Åj:£ªò‹q5˜éxk‚} ’ÌâÁ%ă])KGIlºP$çÏ0@‰Í2Ф*(ÿ’Ë*ÂafÑM†–Ó͂'„Èß©ŸŸ9u(_4SLeÒe§…‡“b±’òþËR1wÀ=e +ìäµïcbõo¿”¼õE¢5_$7ná¯_øéóÄå¡,u±„dVz(ȝuœ’EÚRßֺЗï&€ãôÃæ»H †ŒÄAëÎâ"ی°0C}Ǟ3ðçú‹?º#¤ø"Í0*ZSj$ORÉj¥p¢^•ë¾6œ’­A³ƒR>Ò>+©µë+$T!ARiœÚù8µn*…Nš0/ß=ùThÏ÷_ʗր*š*åNº™ßè´Õ»Ùh«v?K|vÌi|.$ÞáϪ P]€«ÒÃÀM¹WZ­="öjÜÑÿpRƒ¸_ +ƱΡ†¹ÿàˆ.QúL¢ó·?]¹õ’Y¨Ëš¹õ’YŠ^7·^2KÑëæö‡Ìfè5ôEoѤþ¨(z‹&õG} ¹$C!TLõ¿EUKÑD×BªQK×n[ÕR uí¶U-tò]»mU«ó‹K×þ¤j#ȋà¶^G!¼stѝ•§÷@§’)Ç&ä<_`Úa(ÚÇ>¿žÁÙəƒs«ÿ€ã»'p%÷§E™ s*ÿ’HÂã¹PFƒlN*^¦ZC²Ý/k3m+énR…%rÍîÅÒÅÓs`óæz•ªõæ*@X!-§ædF®àƳ¬X³p*§;åþ ÿ´še‘ª$•Aþ%—U„à }I2vþad‚Ô²§mf +,’™5ËÔÅPpÿšÃU1:§Ó´ø¤­à cb'->\¶ kßy)´›!9Áž?äzïs‘}ʊ‘¼”f„G%ƒ2•xø3¾/•¥§ T¨‹äæ¬_*§ß2r¾“ E„êTfÒW)2/é8Y$3Ÿá<ü™üÔzýp_¶a–7,öË4F“µvLBð³®`2 Y燔Ϫˆ–¤½*}H«?Vtø(î)ù½óGɑ<$ÖmŸ=O"9×g"Ûy²‡uñËÀöŠzè8/«~;OŠÎ@¿}¶à<&¨>{ ƒ$¹¡ã<•wî½'y®â¼_f­»H¥ùUÁùaVÜvYcåÓñÚ«l-q` ?ï0A ِ5¬‚‚( +¢( +.ƒ€lßw®Î³ŸªîӌǛNÕݵý‘ +¤\ž< ¿Æ§ô­pSœ9‚DàL)!DÀDw!Œ­!wåqI/õ€¨Öït8óŸA-Ž¢áìi¸¨7Š&Ù¨ÊiÕ]Â'¾¼^>ÐÊ`EÞn™ †¡”L>¢=ÝqY`Š¿M–ÉQ%àtꎾ·>×4AQicJ%ßy‡"ŠI¤À!¹1@cÒ òµÆœÕY—ïß­£´2ÕÔúP½»%¡95\$)õ`L?:ˆÇu@ìŽöÑQ샄¶$¹üè ÞÍ×âåŸ #q‹ +¤®´¡‚9¶¡ämvL%´M¥Q _6•Zqu› •_«èràE *ˆ/Ÿ*i“-ÞÑåØ2¸MÅä%¿M ˆÜ6•–þ‰#rӞ,Š« {4üSö֑gnÁ)>`šÒB³CÆ5̍€6ÅSàò÷cܾs«Ç‰©*8À¼{wȳø€¾ ƒÖ ÂæqHÀ@4°çP½ïßÐA2ìD)Kù€úâRe`L\ÄÞ:Û­‚ì.PW+½XEe™¤)¢²bÿQµÙê ™¬[ME›­Þ‚Û„¸%ˆ^èŏìY,•qf±[#®¥,AQq \œ8UӁ{ûRœ n¢³3òäRF²Õ{doK½ràÀÖ¾ÕTí8Êãßêö FÝ1ô•RË@ÛA‡ƒk*4'T‘!“)oTBÖ¬² +2~ب)D‰Ñ®FSò Ãc€Ë65 ôe¢Ðø‰>EdL¾S‘餴0a{¬SW*–öÄ'óe¿XϽ= -2bŒÜÊ~8yöšêëû?XliŽÅýV2nf[þĽùrP}Ï^d'W¤óƒÏuƒ=š¿âcûÕbãagrÇ÷¡&»†¡_÷¦B§ ÂM^¤o}ï%Œ<<8ý¿N~ɞ„GÍVt½5L‹óáðbøŸe~ú¸'Ë_ñ_jöܬT£ùáãt0u ÜýÝÃ%v4V?a[pf¿öì’Ë?ÅJ£ò^3ÙÏ?i”«ì’Íý.ð~1ãä—ßeÏI +ÏÉwƒ.'ÅsN(/d\v”p-Æ1ø±T+ݎÓÖtÜËç¹UA:©]å«îܒæGŠºˆ–c÷¥$„è*7lfÔÅóQü¶qË_çÓ/‰´~¨äıÿܼ­¼å Ý{©OZzúŒnjÁfì³ë² o‹+¸ \©Íɗ½'Ÿ\µ9!Ô÷ÂFÇøHp¡l¸Á…T_ßR\hrvƒ·áMù¯ÁҁJÿs`é@%!€?–TB³ù1°t ’K*~ ,¨d»üX:ö<üρ¥•É?–T"ÔüX:PiәÏÀ’öh$ÊXÝ©tw:ʐ©Ðj3ñ¯Û tl4›mF<½ ¯ Í¬â ì5eNÓ´ŸmÖOÛ ÍødG Ð×š‰yiUüù;SêÏy:sHˆ ©KA!³©u]l.€“Úð÷PÂ¥ˆÊX{ +Ìȝ) XÀd¸[}ì0­†L‚£¾¶— +…ßW9.a¬.¾Dáø”CAúò´JÒ~Áv9€ŠNˆîÃj5•”¬#Weã-ïR…FypY6ïGف›A×±‘\w!y)7ۇà<× Vží"W¹ÉZXnÊô[ß[y‡eE¡1ß%#‚PJJŠÄ…aÛ:ïjZQ­-æsc‘H®(0ù£Ó"îRw•×ÌzáoÍ%*_‚òӑcÀÃãWÑmB~-l˜L_º@NF@Öb°3Ȓo^o*]Òü$?Ÿ'§A7|ß M¿ð‹¼cBz£ê†‰v»‘µM¼ +®“¤.r-¿ÂM"ö'º:ø8/#G”:ÒD¾"-Tè×ÛÅ]˜à¢•wË5ÏïèýŽŒç3(‹öj>ˆ·X9^*H<ÖO4µ>ô¢ C|çÙÄn<üK0sD:á-ÌW÷Iƒ°e"…t÷)òÎÍk¤‰—Gù‰@dÑõãðW¼ãpÛ6ŠöØyÞZ§®à¤:ò„y,'V  ®¼U¼¿[à'©›٘ڧysüÃ4@‰9!¿8·pãvª[·Ð^K Éå‚î<ü`¹ ®;.ðð¢y=èYN€ó¸€¥û‰,}.¤ÍÙÔ傴Ÿ@&³m©XH¶;Àa¤ÒMÃõs±Ò?ʬ+l'¨Nb·¹©Z N˜ç:]Ç Âƒ¯yóIˆ‚Ë‹üwqù •¾4!n˜ØÁf²ÛDðïM¬>ª—]+B”ÿñ 6»Cß½†òiY“οË5Ôt~QûnRé_ðð[MÈâÕýUmËAÿ]ßï0²ü‰‰]3B¦)Å<ö©‰µ3lšPvg8s&¤'£‰~º¾nâ[I…œ”ý› }W:•Ajӄa™ØßsÊká-UÍ5=5èèù&áDƒéÇƺž´SŽ}u+u—®ãá¿4úfž«Š+Çþ­â՝Äα?Lhß½†«ëxø»†ñWg 9¶yŠðöj+G’'¦DÏ0OEÃkŒÍ®ã ò®ž0ä¿?Ã"ßM*Cù(#þ@䯢aìBnHãÚh["Ú®yùÙôõ¥±•F˜ 0%jfü0G§2Âô~(VéJ S„3Ózñ#6öՇ“ÂãhÓÔö(dܕ²¦ög!œN}F‰—þ[!3H8ÝòÒé~ž¾ ü:úhD$K`ž™),ãY„ҜÁ2¢ËÛŐ Š°ïèè¾x'v«p—§^æ9“¨qs>Ý•µÉ½-º&ÿ` d· ¥lâ “åçä“-Ò\ÿ ù*/–àT¤ÓV©æíÛß$—2LX¶ ä¼Ç5ғO!wRò)Ððõò~ c~jPÛ=Þ¶}&Q•‡wÓþ,dÓkŸH eü¦P•Ç}­œá.ÈÿõÇr|`f¯»º6l(0@tŠ’zr>Â~p!©!îÇmÇ\(tMôjÆÛ9_cb/“Ð.}$sœÆ0¦œ7!‹ª~v+ûa†‚ÿ£½J»šJ‚è/xÿ¡%‚ÞQ4,H‘ÅÄ@ž NH0 £|™ß>·ú%D<&êã³×ꪺ·ª«7M_ß}M«cH¼M^öM‰âšDYý½ÿxf{®çæ·Í˚?hM'²«Êþ֝!÷Þ©ÚY·Þ¯­íì^ÑKU.ZxñLß¹Fµ´ò„RÅNÁnµ´¿*ñÕÒñ†¶ÚÛjغx÷'i¸¨–+ÍÆ°¥N, °I⥱ÿŒ$îãs¤ºªÑ®‹bwãbs(û°²[²m_]Óæp®õ¡œ03ËowWȖ£Ò–}¼ÞêžÐRä^Ê0⅝šÂûmo:€¬¥ˆ0¢áÖùp ݽXb¦Eu0Mº6ϗÕz@kåþÌü`þ£È?äEu±RIÌï亂aŸ½.ö³;ÉÁâý"ŸEœ¿šUW«§»NŠÜ«žÎ>šIÙIߝ[~QèP~ÒD6¥Ÿ¾}¹V°¶üÐÔ6Nñ=Q÷•Õä6\3ÿdf¤òZÁn +{²e ¡çß®,þ]k©…ýí§)ˁÉÕùºöhí)-’×£vá£3_ŸlP|>(í«i”ò«¨þ±8[Œ5[=Gw•–¼¢º­ÿï|6—MÕV¥l,wZoòσ¥îñÅYÞdSSÙÊç´À6ò“ÓN½y™÷2ɊŸÀ¾>2©SÖ¢ci´~”M§µLVX¯–FµÖ,N»fï’=¢¡Ýõúöê{Ċµ ¬cÓÐF4°S6‹uа‘ VÿÝOøld‚ üiœýíFñÛmfb¨)v_¢óúÄ [gïk‘àÍÌ1iØYf¡F=5”·h¹ô»XQÏÞcý&t°J¥q¢Q.ú@ áƒ7¤ƒS^Á!£“©ƒ )«¤u‘íÖ2ÞIŒ +ÆX.³LÆÈ-ô0Aòè ”qš k<³»™†«`3Aq¡”eNa§gǙÑS^ .t”L«À½‰Ì9î¤WLÉT¼rœ)g¸‘¶i݅A0‹Ç¨=Tä-̇IØ̔Ö\E˜xœié°Êo\¡9¤peŽ$e`7Œ:ÎúY•ÈFD«>ïåùv§ÕЩ×<ËW;­ü3ú’U·ÝÞå¨?—e„Ú1`Ö"Ó¶»3$M‡ î]”îVv$ÆÂ÷R°õLÂOVY Kí¹Á¥®ô[œ.:As-a4u³­!Ç>­™:Ìîb€w¬KËPh°êjސ¯Ú77\ñnb3úäI`S_ÃFæߘt&’%B;bra‚–F“ Üџ§%`¤¤# ȊJK.#ä€”„TŽÄ%h pDX\‡mÜ3‡°E +:e4šh¢Hn“ð\R_i—æÛ7Öhã»N|íºn_–þ®¬UXà%à " +7Zσ×ä.µõhp/"R€/ ̏P)ISVRÄcÀ°”§yˆŠ ¹:ÏråÎí¯7N†Šù…¨È[’Ú/‰ +]Yð’2<]d*Rv÷GäÔR5á‚-/‰KAGAȌoŠ› ÎK\q­ÄØ×´øŒ’=Žì(/\EÜÓåSŸHQ?–¢ãË ÿ„ZºÞ=@²"á7!·9®÷Ì ŒaÔ!‘k-$3 +E®f&%î| ¾ÿp¦CCç+Y” ‰Ñtu ύžb ghå (q$Ý×wMWqL?ŽMøEÍ5’Ç,ÂAJÊ7ÞOÈyKJþy–ráÇy(ì"U˜©à!ø}‰tV@ +BªfHV,`Җ®*àSc$¿ýÅúÉ@³c€6¶æ„Mâ’3E:/ù%P7š"Ÿ IºË„#ß¾¹ô§)³áj–Æ‘ ´CI¥/Õ3-\’Q€훻R5IÐh-Ó~”çÅ6N®EÌ S Zj‚ØAҍtp}¡xeá͕ÞBâöªy’¿é5OÛxsô›ÿä¬ÙétÍA~ŽvÒËûÀ"gý¿ºŸh[FËñzÛxžý'À=6©& endstream endobj 7 0 obj [6 0 R] endobj 25 0 obj <> endobj xref 0 26 0000000000 65535 f +0000000016 00000 n +0000000144 00000 n +0000021707 00000 n +0000000000 00000 f +0000024726 00000 n +0000024540 00000 n +0000074969 00000 n +0000021758 00000 n +0000022120 00000 n +0000028374 00000 n +0000028261 00000 n +0000023430 00000 n +0000023979 00000 n +0000024027 00000 n +0000024610 00000 n +0000024641 00000 n +0000025124 00000 n +0000025502 00000 n +0000028448 00000 n +0000028656 00000 n +0000029633 00000 n +0000034894 00000 n +0000051182 00000 n +0000065251 00000 n +0000074992 00000 n +trailer <]>> startxref 75173 %%EOF \ No newline at end of file diff --git a/correctness-model/writeup/figures/rmw_atomicity.dot b/correctness-model/writeup/figures/rmw_atomicity.dot new file mode 100644 index 0000000..8b1547c --- /dev/null +++ b/correctness-model/writeup/figures/rmw_atomicity.dot @@ -0,0 +1,12 @@ +digraph rmw_atomicity { +margin=0; +ranksep=.1; + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.rmw()", shape=none]; +N3 [label="C: v.store(2)", shape=none]; + +N1 -> N2 [label="rf", color=red]; +N1 -> N3 [label="mo", color="#00aa00", weight=100]; +N2 -> N3 [color=invis]; +} diff --git a/correctness-model/writeup/figures/rmw_atomicity2.dot b/correctness-model/writeup/figures/rmw_atomicity2.dot new file mode 100644 index 0000000..483367c --- /dev/null +++ b/correctness-model/writeup/figures/rmw_atomicity2.dot @@ -0,0 +1,13 @@ +digraph rmw_atomicity2 { +margin=0; +ranksep=.1; + +//N1 [label="A: v.store(1)", shape=none, group="a"]; +N1 [style=invis, shape=none]; +N2 [label="B: v.rmw()", shape=none]; +N3 [label="C: v.store(2)", shape=none]; + +N1 -> N2 [color=invis]; +N1 -> N3 [color=invis, weight=100]; +N2 -> N3 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +} diff --git a/correctness-model/writeup/figures/rmw_mo.dot b/correctness-model/writeup/figures/rmw_mo.dot new file mode 100644 index 0000000..7a41997 --- /dev/null +++ b/correctness-model/writeup/figures/rmw_mo.dot @@ -0,0 +1,9 @@ +digraph rmw_mo { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.rmw()", shape=none]; + +N1 -> N2 [label="rf", color=red]; +N1 -> N2 [color=invis, constraint=false]; +} diff --git a/correctness-model/writeup/figures/rmw_mo2.dot b/correctness-model/writeup/figures/rmw_mo2.dot new file mode 100644 index 0000000..0d4ce57 --- /dev/null +++ b/correctness-model/writeup/figures/rmw_mo2.dot @@ -0,0 +1,8 @@ +digraph rmw_mo2 { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.rmw()", shape=none]; + +N1 -> N2 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +} diff --git a/correctness-model/writeup/figures/rr_mo.dot b/correctness-model/writeup/figures/rr_mo.dot new file mode 100644 index 0000000..179991e --- /dev/null +++ b/correctness-model/writeup/figures/rr_mo.dot @@ -0,0 +1,13 @@ +digraph rr_mo { +margin=0 + +N1 [label="X: v.store(1)", shape=none]; +N2 [label="Y: v.store(2)", shape=none]; +N3 [label="A: v.load()", shape=none]; +N4 [label="B: v.load()", shape=none]; + +N3 -> N4 [label="hb", color=blue]; +N1 -> N3 [label="rf", color=red, constraint=false]; +N2 -> N4 [label="rf", color=red, constraint=false]; +N1 -> N2 [color=invis]; +} diff --git a/correctness-model/writeup/figures/rr_mo2.dot b/correctness-model/writeup/figures/rr_mo2.dot new file mode 100644 index 0000000..fa0a6f7 --- /dev/null +++ b/correctness-model/writeup/figures/rr_mo2.dot @@ -0,0 +1,8 @@ +digraph rr_mo { +margin=0 + +N1 [label="X: v.store(1)", shape=none]; +N2 [label="Y: v.store(2)", shape=none]; + +N1 -> N2 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +} diff --git a/correctness-model/writeup/figures/rw_mo.dot b/correctness-model/writeup/figures/rw_mo.dot new file mode 100644 index 0000000..a8e99fe --- /dev/null +++ b/correctness-model/writeup/figures/rw_mo.dot @@ -0,0 +1,11 @@ +digraph rw_mo { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(1)", shape=none]; +N2 [label="A: v.load()", shape=none]; +N3 [label="B: v.store(2)", shape=none]; + +N2 -> N3 [label="hb", color=blue]; +N1 -> N2 [label="rf", color=red, constraint=false]; +} diff --git a/correctness-model/writeup/figures/rw_mo2.dot b/correctness-model/writeup/figures/rw_mo2.dot new file mode 100644 index 0000000..e7f611a --- /dev/null +++ b/correctness-model/writeup/figures/rw_mo2.dot @@ -0,0 +1,12 @@ +digraph rw_mo2 { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(1)", shape=none]; +N2 [label="A: v.load()", shape=none, fontcolor=invis]; +N3 [label="B: v.store(2)", shape=none]; + +N2 -> N3 [color=invis]; +N1 -> N2 [color=invis, constraint=false]; +N1 -> N3 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +} diff --git a/correctness-model/writeup/figures/sc_mo.dot b/correctness-model/writeup/figures/sc_mo.dot new file mode 100644 index 0000000..5d5f6b1 --- /dev/null +++ b/correctness-model/writeup/figures/sc_mo.dot @@ -0,0 +1,9 @@ +digraph sc_mo { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.store(2)", shape=none]; + +N1 -> N2 [label="sc", color=purple]; +N1 -> N2 [color=invis, constraint=false]; +} diff --git a/correctness-model/writeup/figures/sc_mo2.dot b/correctness-model/writeup/figures/sc_mo2.dot new file mode 100644 index 0000000..a7d37c3 --- /dev/null +++ b/correctness-model/writeup/figures/sc_mo2.dot @@ -0,0 +1,8 @@ +digraph sc_mo2 { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.store(2)", shape=none]; + +N1 -> N2 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +} diff --git a/correctness-model/writeup/figures/sc_wr_mo.dot b/correctness-model/writeup/figures/sc_wr_mo.dot new file mode 100644 index 0000000..49a5f03 --- /dev/null +++ b/correctness-model/writeup/figures/sc_wr_mo.dot @@ -0,0 +1,13 @@ +digraph sc_wr_mo { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(2)", shape=none]; +N2 [label="A: v.store(1, seq_cst)", shape=none]; +N3 [label="B: v.load(seq_cst)", shape=none]; + +N2 -> N3 [label="sc", color=purple]; +N1 -> N3 [label="rf", color=red]; +N2 -> N1 [color=invis, constraint=false]; +{rank=same; N1 N3} +} diff --git a/correctness-model/writeup/figures/sc_wr_mo2.dot b/correctness-model/writeup/figures/sc_wr_mo2.dot new file mode 100644 index 0000000..7efd810 --- /dev/null +++ b/correctness-model/writeup/figures/sc_wr_mo2.dot @@ -0,0 +1,13 @@ +digraph sc_wr_mo2 { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(2)", shape=none]; +N2 [label="A: v.store(1, seq_cst)", shape=none]; +N3 [label="B: v.load(seq_cst)", shape=none, fontcolor=invis]; + +N2 -> N3 [color=invis]; +N1 -> N3 [color=invis]; +N2 -> N1 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +{rank=same; N1 N3} +} diff --git a/correctness-model/writeup/figures/specdesign.pdf b/correctness-model/writeup/figures/specdesign.pdf new file mode 100644 index 0000000000000000000000000000000000000000..203ab8dea911690f3239eb2e1ab0fd45732b53df GIT binary patch literal 22332 zcmagF18^rn)GxY8HrB@0#eB~3HPgSI zI#c~S#BxF+)bun=P{ad;1DylS136F(_;mQT1{P3UT(nZgHl_eGe8#^T1zHhvD}b>B zt%#LAz*xxG(ALP9hX=|L;9#t84dt4dr6C zb2uM_^gsJ?XZ-E`2UnSyTj9kW0o{yuIW%4@4q4oqZQ}Xqaff=DR2;jt5-Ee=HC+w<+LyHT*5;0E@Iy4ove_2CKUY4}K@ z`QY`@z@x6mrKwH#tNZhAEws7o<82}YpFih5-qlRY+{1LafDq`d10REB`5NsK=#Q^YG|lC@Z|Q+y4x005Ne17*I{^7>RnKZRHz+i z=^|OmomA_-<9~6e)3``OVKurVRkkXe3eG98hrwOuwr87Ws9b zx|c0a$-x9CMz{I8;O~^D==OW8C?L4MeXU2o1s8D*J;Gfx1)oBGYMlh<@c<{H^_|ezGf7LEYVu_ zmx7t*Gw0SM+COW_-#kmK>nc|;Ncnz#Sc!#!mbv&=@R>v2w45jyteJuc_+AwK6XXN; znV|q>I2X2Kdw=LZX4M`Ic@t-Kb({~YFR*vgE%#B5iYqRQAdY^h!|JEjyP}IF*VOld zTexqZzo_hd+ABQh*?ZE%-8xjBG%I#1wp^G_a^S%%@tqO0$ zr)^hQM61pFyQ#bg!Q4|*_tN?DXd;}`_0S_&wr}z?S5p|zM47y>Ud`kO@r@8$Z7ySh z?}17@*Sxe2Gi?ukJ4SmPpsU5$2T8QDR&Pa~ubyaF`AB@-8 zMp};OoY;S^vP!-5ku4eSpriaVFi@M}sp6igZCt6F`4k?IwQxkgiH+QuET!U|u_bHb zcs10H z@CzBmf?fJ7nb>3%4SHU}#%Ya(WOgcV{scpzv#m{oBZH>R>@*%WYhciVOoK6(?fwB8 zW~%Lqu%dy@PD@)f`q>|eMOy&DYnyATgKeLnUj|IZ!lefis^x2MsLo_hp;*=Jk=zG+ zZNhF6aD3+0bT{oWqk0D}dmqWy3?_rEdX#ooU3vsZx~Qkm8_!5!Eqy55%c2GWYIh_& zuW+zyOkst|pvU0L08uM3cB!_Bip(NkMqu)z^6A$ag|C!1y!r5(H!-B6>U737q zS&JyryN26{m9w(LHh8Iw3P(S1J%>i-ONqCb4$U4ncp@d!3YgYH@CwSjxkOP(V_d*{ z#B|th?8A5LN2VgW$CPj6kIg)##{Ugbae?`qsSoapK=0lRVtqS?eMUd7H6CgN1Bs6r z`X!AfGvv%As|+m!`m>q*YYVWb7wQ&esIjN6-X&Gd#)~)(kqERa>88H0A9-c@C~N`L zXiNbQA!7DRuUWmSHR}?-8#j{LFhwJ22l8^ZzdT0*pLpRu@f@Y-!|H zt25ZQ$&w$28^32dJD=FLtiuLcCMb~qhoVE+m-RCeHCxi5ycG1Jpukxaq+4}`#5jxD zTe3wx4CBi_>N`bkR7Y6F6Unw0 zUV}#)om2(_l3(xqh);g1LJye6g2L4~Qvf<2z4QYo!_sF5z%L@{mg0Vv{gI3LGjq;r z2tO|5hc-AF0ZlzJM?chc^djRccxM0{siQa9*(qN3_G9d$8hSq^FL>AG#ENWQ-xWr5 zyREX-0?1XE5(~Vu^<+@V{f@Fd4hgdNnEPI9l=VI!3I5faCLrcs>G?7(m`op7>xJUa zC1(*=}>ixE~{EB>lFL87^eVxYNNQoD*sm^OI>&l>`b(ZZbF2&z z$dajP5RL)sIk)harJeG4OUnk{L59UmWW#3m7yb}f?~xYDeHDSL~PEB@-#G+l@L%-HMbKFu|PQY zL#98*p4n~)4Qj`JXbCQuHi4)dH;^p9)$yh~^)G_N{m2F{FFPmzvq1Q~lrv$n_UBs} z3jNy?U$tPqD^P#fbOTLgo>{A)x)Gu2cHm-bp=tzng*s2gyVkB%dAG4JJ5Il>;zREM zr9zU6rW?WnT)1Yn34@co(KZ@mCj|-sbLV%46f|iFCfm(mj&h31E@}a}W z_0Rcb`RFsjX9_c%SXX$t9WcU-yvVrUhA3i+?M{O-R6^$d=~4T2VyuPY9K06OXG@^F z;dwZSgRYWVtSviIZpixEn<9#`bIU{Yq><5Sbtk+OEAluX;vt;3dK(5C=P;-F8^{`@ zX#mRD#^}G&-M`Ym3>oTQV*F2FU}azHOv^X3X>QeTsA{*9a}nYSP8zwIluecv|K$?Qki#4uiF4$Z&G5w5NwRR ze7;u$YNpc|O{X){*iB8Ql>sKIfkbia0!a3*qOR`srW+~(qZ@&I_qW%jwW|*k4ph3t zffSfoxEpadpA))>{X_`)MkCEP7*%Zi`GIyK0`=`9gnMyu%*I85$T5Ub;r2g2#;Rt> z>%37f)($xH;c*n2Wb{6zD`jnSFyVYY_!f`}h%0J!x(GjJ0V(&i=#{dD+Nm%%p+q?} zK2R4Ukn&N|vQr|mexIoEU#w+b?j#Idryh_aHI4YP!2LgX=Yu}{1j-ee1}G9Knt~-BD^v_vF^z_a#BZeU)@%Ql#mGBVq=Re6|SZqmWRJvv`Y7R z(ME6L91p47QmA5gNOTEHM)mK1zQPD}+lT1>8Wp|=KfF+T)pkhddLn;VhaWqHEo2d# zPDmLQzjtfglO5O)k%`^un`2FIGOHrIRa}j!6~=yQFv9(PC@9B|>N@6hFUxkH5?9hg zbQ61H*cRS;T@3C6y+b;Ke*?e!;N+Q|oV)mLl{w0NILLZO;TW_sk+YEIgH1>` z>EJ6}8zrza>qS=b^Wz3JcK+d8xB=O?iIP*Wd*)MrlRwz6ob@4G;?{yP@bRYNNS3}S zgU8+5+1J(6(a+6KRTl!5n*Nr+Q_^3=E&S1fTYS(g+V@_ZJLke3MB7Cl(dSoQ{WOl4FQt0t>fgSY1 zgVl? z=^FxM99@Z)x92uCjhxut!Xq>cI7|~Zg+3U@Qv2}~$BBX{^ARaD6yJPjewsIR4E(ZmVvHqLyOwIm^fKn5RQ z+>0gg2FMd>)*)tGoJOsH)-SndhuWy>Mqv&=~3^zg=8;;KdV>3LEIQTtHj7di%}%wu?4Mn+*=(D7?tF&i`@wW;V0 z)?f#~Nk2)?Ye`ZiuA2mM?NYR3+&cRP2P0}Nq>`|8UL;7Tf{^4n&;LEMD~@MuR!#s^ z)t)Vc%OLXJMJ=1P~P) zmgOCW;&JKivHUKB62sE4Mjl$F5eC*;CT=CCrrJe{f%CrRDRw-!$<+x~GGp9%P zeN}sepeX?Zz017#Kuj&0d`CM{KJ*|XqgW!z2%`sq8pi!g$7pE!x-Ql93?f|haY+49 z2HDf{_v&>h{k+srkcvu!+F)UeX?#`=RRbOEAJ))WhaKWOhpL6%~*F{%oSDRYOR zGa~lxsL;p4P2>riOQXu`_@W^5$!7~MmgS|(ZBUv*cmx#TXJZ?PIXf&EZ?>7Tcv57F zN*WZow2u3xJKXSmB28VpW$J=Zn1k^>W?`{5XZM3cTp{jukHz<5xk*Q+?E-|98Y#(w z{0o2OjBL&5zPN3DJRO#od!GTfT(tLHT;J@ZX&qhnOzXb1))<=Y_`D36B+0oYr8TZ7 z$|lwHJ3wl8muKI*Gn6SALtahJ%aaf$GnyyF&eW7>>zf?aRjJ(}Lx4*pDeB5hYRPi#jv*N9%D)to7ESyIKcJ@)& z78jWu5N42MdV;dn? z>Wrm|p~Y@@Z@(U;iFkMa zmRXsuS15g?AQ+Mi;Jy%8u6p9_yd_lmGtBDkl~ne13U9n&sqAdr5zrjjH9m;~1=M5(Kn{gGZWU2E7>S5!x9 zSfw%_Un|4ttEAGM!eoNdj%_kcrz#_wm|8GW?ns`oB{j)Rn0$XaTr3~_N%Yj=?7l^G z>+a=Ek&~ocV}IAQDtECT5TdS=j_z}YI4#BkIuBpZo>)^}S}7VpSK@wgCXrbht-^tD zyg27(MvN|ypCuNYr<59L!Z!CM<`Ty-w*Ef4w%1hxnygT!JnOaxlB81LYioze!nxR` zOgwD^TU2cH`bKg78^@`v41{DR83bo2=1=z5!N~bAI1}+UBD3dRL1L#~m8A8h_K^(* z3(nM)&t6`YHLT{RI(r5$-qu3HOI)C54ZYi>d%R$$QIA;^12~3-?b;lJMa@NN1VtmC z3?>-^epyh0kg6Z>0UN=s3{WB}pJpE?s4A41!Vgf;BOMO>^ggPv#Yuap`RgYNiS??^ z{4KrciTZJ`Ex99+xGAldL9~TQCu9px0{))HbUtv20(A}Eq%saIy7(Un7yKIhB!p1p zHMlm=Fc6Xhc_XT}kjh1qC7^h0%slt~(dF4QpSyWuXe}uVP)++V!p5vN>e}tpo7qs` z78Uh4?i>Y`1RJWGXjIkfcLIl?x!vqq+};KSV~X-=EVckl%z^I7$foz^@iEvt{b43Q zx8I^Xgw3*)$H*fnjlRjnvt)}l0N})A99j-tWD= zg~r|=Nje;i4+lB0^WY3?pEEn%XK5`b-L@ z&uGudyGG9f+$sG4azlXPBR| zW(_tBq)?*wyJo1D`T7E0LefXYDuoJ_Q$__$?Esu2GkxL)>Jj#aN^Y^A_^Ha;DBDQr z{A84HxA`J?hmPwDB|m=!0=lzs3=FBJ>I<_HDp9MDKYzFf7=za`>eqdSb@86iC=NAE zS8rY=am1=T$*R~wDHU?rUZlFaAFQ7A+Z3&DZZdM!6?ER*^09aDZFE{rq?58PXDp`I zh2S)CSBwk5JEN`0a<`ECcR zPF^aPCZJ3mkuU-36?Isf!7Ky0dzpLr{Q9A5v}@$ivh){ECY$rj?osT8i|9!bu-@!b zJjAO>xlAP`W*m(Y=_}^|4KH_2FAt>0cG&Gh3V_>K>BCo+jvM^scp3q5KG3=l7RihDX#=a6e*^LNf^J)vh*4;N8H40i>dJC2m=< zs&e0`MK6AS2R2*C(w@U?btE_g-9CfDqTvyrKZ)$DO?+j4jSN)!B}qqdZV+-dbzv}6 z4QjWl7#ixbJ+)%GBj$M3o%uRbqsSsw0A@l6_4Oz!R1BIzP|zCJPM-sI1k3LrNP8@C zs_-mG!8p~Lh!H*h^<6!7u^*cwnLYG!z9@dcUX5pS4~n0%A|K>4=UY<&Ja>L7sx}XH z+5^?y_skyMwPg=sbHjzS>3F!5H}J@ZEFqQ^&ajID+B4nPzb^)#l&f}k>X}+iYio|xV4GSnomKeVlx39*!)esC+9^=Wn)q2p z5(Ui_78J?byND}FgS4|YcdwvUmDNo>>LZkBPh_YFR5-DZ8Q%Mt`FZ zjyJb6I-Q(vmvtz(6v)V{vSLFOOYVubv(~oz8DCs!yE!>Med46t^W~gO6x_!vKjFA1 z6eeBZ%4$K{EP}M(9f3y1We`-SeSP(LTZLYj*7ocy(Nc;#3)+Lz@XqO*`WqEWtOY(4 zmNYKgZ>99sFVC{mk4tf&cyZxdKxUN`5W^OuPeEupt4}Ihex_H?e~5+cPR*LA993u4 zoPBH;Z1C_Zw7ZY2-4S&gJT`z#HDnFBNrNbQc#Tyn!@j=yy^S|!9C(omtBO66)TCKV z%^ zPx`Zw4M9kjK=Nm-#>5rGQH6GBLSW1LO6bcUQo5rYgohwQaRlY7pB6SfqLLd7Vub>8 zgeAl1G2|*yEUq(I`#B3tm^Dr65Vs~WkK0n37tMR7zj8cS2b&1l3diz8L$qV$Uc&4; z&ZfraE7vkjk(tL!d6wbktY{vIEba3!t=>31O+Zt(l}~T^toC=nbr6vPN&@T9%bW1B zNUna?U>a4C_4OSF+FbkGFl>D(j&?W67Ojx^NlekyZ@S}oEj+Y{tbX=vkC;I%v$moa zm*!D_tMFVitCNLdojPJ0sc5~o0<)CwWrBd=D8h{s9C!G`(GNw!KW4&(EJW&OAfp5_ zWy%lOb8Tae*)UT~OI4gXW6fMJpKs78M>F0)0v$s19`*NPWJ&W5vVs!7DKgR1$_!Ax zDsBEQ<)v?37@AXoXLZ{XHbyMT(=A@YjFh-^ipn#f*|LzIr)?;2ViY~M?Ur8Q1c_oc zakTbIs`GY~2Airy9`-$z#eiRsn5P57M*LJ^6@rFGRT!pP&9Fyqk%4Ya@H^ns^Q$D6 z4rzXLnXf7QdmJ;rFcC6dGEvsatTC2gadkz~U8;=&|EG|+g%S5u9QWb*t3;0E!jv=MYBn( z+Q(6NXpk>Mc|=}Ums#HNR&(w?JxdqcB}U2fxM{0G)s~lgv%O1QO!LL4(V?}L5fh-M zk+ZGLDX`CBJjr&$<**MMAH=CbI}B;=zKc#Ncy!Efs&gu%c0w{MG963VDjM(qNMs$4 z%F#rSwOzV!;nwLC@9!iYTOn&2RaVp zp$+A0+>{|rCYb)#XR4Hb&2N8_4Ceh3R72L3iKwGex&)JjvdOl``>I}Lf#*b4L)cKY zvf-0^a2x?pRT73KswWK1LFoCwNTZN5~ya{s)2qquk0pT|L5x{SJ zvT-HoEa5)6X5O(yz$OH~R1BQdxK&bE4E{vXF#B3JW>5qKsX?gp4=3aDfpPuEhI+eKT zseXE`kzn;)1<77^WwaJ8h3?2XmNH0`G-Xh*2qss-Pwv(ig`R9LKAVO-e;$dhB@UFV z32nV@xX!pvIUk&wAi^*|HVh*+<2xN0J7v+hR>`s*E<09SiNO+Ie2@uKA>A@BPGZP8 zK|5knro%4SWv$?V8D6Her2jncMLj`W)yv6p*f}xICnKxBgY)iY9Te6D)gKfqP_rQS z_=R%pm=acJyYm)VP{*JfJ(KJm=^&pgU1px8<{Ajh2--FdbyRw9Pb^q53#9}FMW_(u zfFmdJW73a5Z`pQuJ(*9E!!i~O^MO8qSxhL3MGRSqvjW_hlm3$uyvFfX8IEV9F96$W zR}U6E3H#7KmLh>akXO^sQB4HvK(8P&dB!h1fLG&immLmwUoR5`8vJ{>FURqg8xA$) zJ#q{Xx6JEsn=EA+#RUd;`-rERU*w7MY>jG+$AL z_f7qze1X96avB%&y>Irh+4S?%fqoeK_t|gKLGR*8wPbA($Fg2x%>?bSM-a>BYWDWv z?F+G7BkwL&K1zb{*~foM~_up2HK) z4N2EJ8!yf(*}zGM;f)xe`n++k&*{99pGo%^XAq?J8UbZDSBcYYncvHdJm=HF@n|mB z_acs@ON!^K8$8){rhkIIaKVtLXOGXCE?k;UIyjv#xliAN;+1W%$S&?YULVM#He_vY zGVsU_lq}VSb@H~WJD%<|U$NQ+DsYPPgY%L3%sqY`RCrQV4tJhT5wrY&>ibBFm(p&6a&Yfk_56i3z}UfiLXvL zQ>yEDjbstfUj0*jRv|^5=xTzvnXDw!W%GZ(hTNCQ6DFdupgkkcE03cRC$$ezS+h%{ zYR+0YTi+qHis^+)P52NK3`I-Zz?uma5SP}$Vy-KIE0!%Pfhe9MYF|~euMn>or}Q6< z;}|I-f(ug4;Jn?C5!m1VXt6yTyllQy&E)#wq&a-~Rv+T?{{Ale^~Bg09(PdF^*;M` zGwo8MHMMAxljT@GD`Fn5* z?tQa7H3Q#CN15y-RVnj_QyAi)7|i_^c3-3YjUrfDW^9GpzFjW~$gB>C150I4CXmTp zVj{PJ>hKPeTZcBLWgX=E+HZuLZg1@%j|=ykoLA~k-UfWzmv4^3yMDm8{Wt69&D(e1 zcb;zEGuodrpO*pNKYI^fH}7Rz-lq?OL3oj0R=h>G0rSNR7mu@L@ONN@F>zr4$*+VO zbJ{~kD-MLtBCw43(v1e!hVIFN6D(I*F0OY{-j79ipVJWAw>?U4wzH6tPhUc-q*wF% zfD!mLZ@PEC`+=H|TSwl`ixAdNyFPf``vFF8HnM{VNkYVpU$N{FFMP{ir`a@YKV_cj zd4)dd+PQu@|N4l%1RsXSqdEBAyZ=>^91;pYo0$5hJ!&r#`;dlWRzc(@;fa52>qRzk zGs3V{Gg?}}pc52{T=G;*6|`}X2a&5?9Jt^ni+e8ZRvN(YzBM78iP!9Ph!(P2jz=@W zMvq}FBZ3t-7rRq&e`^mVYMeU(FNA8*xuUNA;c--~kl2FHs=5=qLHkC~4G+KF0lVW< zv*Tu(@eMG&-EqNj(RMJqd2UBC&+NPCcws^Vy9OkQV-m^E_AoFo5(y>^d8rn%tjcOB zpz`@xpvJnZV!MFHaJ)hksMKGuC`CCfpF8)oGcb=LuRN_>x@nLyISCIAkkSou`k*m9 z)z&pG7Qr{Uy~8_ge$01~4+L;>Z}FTs9JWMWtU1&k9HZ^?NOCaR>c1f2m?Ufne-9M9 zAvMv%u1<|8P8Z8vBa4aGowpS>GLaMEwjv=~7AZPXvzDSQp?_W^%!4^KvXI-$T_?eh zYv(vfZPS{j#JY;^Cf0uNedK_{HLC(n&51EdgHRXA^*oj#pfBTB=$jVh(cu~qm zb{;-+nlt0%_ln8)mQ`6uP!pX6STGMg2y)$e*2hwjw2;maGbRE6vEpH%!hH&7pGf0L z3K16Cu`3n)vWo7&B=MtPTRJI^JZnuFGG9lPJ5OVcJ4-iq)l&DoZ)2=IIC)7>$@>gA z(L|{pNTw9&UeY`XV=JeOiaSH(n{J{!)WIyXxxnZK`q5pJ3f5Gs>Z~5Y+#@!vj99hcxOZaRat?0s)b2a_)I5KEjV>P!p*j5FbK zal+8hXmY*n?+1day3a=M?J`uM%Bzz1=^WiL0@dOAOKHP3`35Cp8{go0f5;Y$L^ zE^Mnvzc#)NRKRfJLX|L&3V~k2(K861GHtLw+}Qpg*zt8 z^mr7Z`}9K|<5%M^$|FlGQ#TIq#AN`JEx|VnodMBTTMVd!2LhIQWeG&1n=vHTwLr=W zMU8(aTxl9gfIrl_|b{5dSK$`DIs-n zToRv5vWifIbR=WuIey*zNdkDomTz$#U~oiZ>NRlau=?oMQUz=rbmnF6l=Vz9kUo@D zGDV^=8rekic`;U^aTxM^c%pHty4e#%V^H$K9f`!GL)FI~qH&7&nGdi0N)i^83^GR} zX3bbK(l}}>Hu>dv&C46&agKWaJL~Vo$LzGQy1UZb_+4`9Dr62qLIFB#YD5i^5Xr#c zs}0aLHx-Z;bpk3O(|*D@oV_&gz_PiH_nM4V%rr<* z(qfXJ>f1vrNv2LOgI0ZKHU@UYG=%UVkM$t7{?9zD-;522rIm$^_i(|1avxzf-;kPY zDRp6MW=3FsNC^V6;;Lb@xX~gc1p=-PLZ{tZb=ClY0o!ko5JJW|y5F+GBXLjG9VR3u zq9nmZb0(5DGo!rBjND0jRG4cx2pR)(W=75y4qTX7)y^Gwp0|DRcEE1v_L9LR&aFO* znt&OA5fK9?Jxf>vEk?}s>NX=*+%Xc)2zzzv-6=8yFDEmm7abQ;+%a#5X_ zfsGK~s}M<@rK=SQ;u^seAZ79{-~eghpg+4zTfo(ojR8kEOzbpAr0tNEzT?xGG)-|c zwRo2Knt;*BKQhi9kr>zw(iWb4NR~L6L;NQzwck&1bj^s`MFEmAI`TdRkhN$$ec>DR zHq^cyh_CD9cZt-CT2(@G5ewKttO;u)ZUIuG54vsnK{!I2pDn?3$#{IL$QYkd2Q>p< znn(79$&iCNgUd9P(!aM*1B2o^AP22`-{=fv#tA3!Rq7@eY|m*oh4*>_I{1e(x}ubW zJ0v$-=HiSp7|pU2U&N&LZCbcYDqv#9 zpGlgcCYsC@qHM;baT9roLmgR<_I_?5wl#v#f0umbw>lIXvx^vc#SqwNy$~}@;grtc zx=~YIh{g+R#k{QCm3~l)d#hX{2+Q=>S0_L5MlfuK$48FdCy>bypGvT8AibqZMPiC% z7jDOICp)!U21Vi}zG4iQ_&TQbvy{!$N*QV-UyeeZe`{w;evQO$dFRAkk1B=pCVL0D z;Ia!}J8BbMWwjfrMp&ru0J-lSwcPSd~+>)x$r`-KJkLwnF2L@+SY(wqSbUeK8-7D zbe>m1Xu+yo`e?fpo!FkAW>fOLe4un0t$hD{$CO3(F8GeLd$j)k&A|<`>^^{^QO~vM^S|vEu_~<#yHDaMn z7)ZYzke=SZPPBcdcP9Rz;hw0|F6u|r-3|if-0MsQtN+5^DF|yJ7dM3;bY5}?DfDBh z!WaceA3@1L-9}$eFJYvcSk7c8vVS$Ohdlcb7jkfJ zMdi6orM7Z{22O3+7{c#l*~=OS1xjgM6WE_SG(kP!rR|3n}#OjrMj<;No?9AztjaP=ZgpZVua8IG?+b?H9Sy}yjQ!rH2y*~mjDHA9fN;FQv z2IJ3D^sc{?7l^t4{>ae}A<@q_m^@1cb{4TQY72)b?~dzQzU6bv>gyk#wr(oI20_BaGPk`%PIL!4d?j=sl(vsSN~D< zpO)Z5i<>ibfz?|Q1~Vz3i%_yZWz$o^9U|U~|H;W=b31_T-};fiLm7Q*V_E_J ze;1{cxq-2RKET}8Mp56!ky;#}Z)I)>^{>pt)DfSB?XUDVKtRCORg;>5l^&m(k&Y3c zo{r@&X^xJbNt^aR{rPQ7t&IQKplJCW4UKI8`0RAdP_+MU`)@$aKu-@vE2wWLW^8V1 z2KbLqC|X5;v9$_5+uxXfxA$@r#t`uoJ>fcji8r-aamTUMv{nRv~@5HVx z#T!y%qXavde-Y(O7v)mIr?t17!8a`MVxc4Ys48d~FuTGs!8Bk;zomxE|L1t6c#Yb? zaq$2J*Z+3N+^(xFY)W+LkG*5dGc*`oL#Tf}GA75(!{Yjhvu|v9Gul-~ zpJvhHk5>e@shI5e2h!G>!;dw{w1*N`)Uj8`dB-p88RC_XR7HocN`d1KaeU z?vNZ7C?}WcmRMZaC%BGftUq3=&W&oqJFH9|<)Z%w2(tgr`us1n(JDF_0RBNw$-&9^ zKePh+j>i8M`Tqtwa|cI&pqah{{$Ef?>Hn9^zzRjHYHkEDbJS#HVa8`+VZmo$_zM+g zmj7rBtgQd3``a_q(c%9a|Lgzx{cDVjjQ{Nm^-upFasSn`{+);Iul=9jf6w_6C)M3?bsoP*P&rAW|2ou+21+;9`TyaEg6z-xdcuEX3=9bdA;XRO9iExB@e$ArDDeH&9{5YEeE3PHTx^>8r-|~%{*|QPdLII(IXy>P^uuttm&(32g!fk;s^u~t^d~!uS`R)k@&+ZOtDVyDyeeaHt zm>~{KaQ}$h9F@TD23i<6P%t#xFMX8VUB*}TS-OupN?bma0mviQBn>1aEVP{1(64Xp z58^Mx_L!Xjh1t;i&ZGV0-yrK@vzHz)9e0^)e|#>2Naiy|(dIA!_o&N20A8+~o}g!n zH;>0mU>s3+AHOx#*#`MjvNtIAQ`&KBVUNCPa=;gf2B)0p?7{2<(HjY}1WmJGjf-$w zj}Y&hr{W*hKcc7fk1%39!8E-OY)aeQhaivW>M>xWymQ>AK!9HcTz>DfY@;m&ihpDp zF-qes8KH7_twly=5gw7(K^yG8_FpEy5QsgWrEfp*SJ{K#W}h>dviovsgVTFo(B>qe ztY@$luktj*BRd1qCfq z((ooI=p`}|W96ty6)7mMNhg3N)m}e6IXDbt zO)-qQKzDiP_RbKbQ!-4wC9`AP=o%1;{VW7=uwZHEg_q`#2gkoR6LkEECMSBVe%Pq4 zX*560rs$Z7jCT+@ZGXJ9A&frtHhfHYZthIuidV zP*f!xhtgZoUd_XQ42@5n>(l_O1f__vKrXgF5@*7J#6dPo3YqjfRo_`Fzk>U1V=e;> zEHK_+%`ghaOR?dy614X$COXbCe-RAx%NaetTf_K|Q3e|s*5LW;osmu38)gPdQfazX zX`H-=sgh)Kn}zy}zhz|?%RX=eF$+_V|7C+J2`XgT$)y>BMVWE`FlK25@QRwFYKxV{ z%%y+YGBuNFy0IxVj9tVkwwZnq7>0%&Xgeb%_jqA(SzEV!rLCEDbtng-KAodh_XP{1 zfuqSFOk!r`*b2lHQ9`qCE*ykE){i=Ob}nP5ZZI1hBCWi7g(@8yrUNM^QdpZ&=%1>& zEEFTRnvwUFnHF4*%SteyoXpu$juGq*Nytcg&~wrJf&=mAX@+y2YLLDny^#V2ZBmBJ zv`i5|b;6e@MkOt2L&Nh0M(pV@#3yrg7VV%N;IlBZKYL z^mTP^ZNFhDN4?TI)O5v5aaUNCQ;-J?RJaNDL12+&Jag-sUQuwc%ix%pbBI$H8&zAR z4uNW3QGlMIf+WzB5HNnz1*&Vnhl<3_cn*clmi8YZ`}@1d7!=MjIWk3ZkctNuXA~gh z+9RYZ=G8%qkXNBOz+ALQo*EoD+DhK2c|cd#8wE!8!cVAG`d@}BBc+z^AF0vHQICWz zMPBOxL<6f00L)5YEc@~M+J+n{f8;eFH>e=XgGAA80+4Dk#gWk0l5>mD01|MFc=NW#IOAVP7kIe*;SJVJ(dn_7W@9aC!hb6L(fOj2ZN7I!!-fpjZ!VMXUJRiRZw~@cR*1tyS-7us}KXz9i%-nhl%l-@##lG z$%*YX&i&npJcl0W6T<`41F+!NE-&`StXLXGPM4h^SC;?ae4{6Rgn6M5Wvh{AiB~Y} zxC^x(cbyvDh(u4I4n91@fn@V5!Ilt+W(eu3nm5Uz8L+nAu(p0~zS?+l*4%IgBT}xe zUBk%jO}f=oTX)_tE;gYs@PJ7!C5|gEOT+qpdwTD=1KIxrs_ywItlcahA#PyN{LD4C zUo#E3^Z07aAPl;&lyKE4*Vbig_+{V*HeKuEi%puZ#B^!JC4HNsaA&{e$bl%yXogVa z=_%pq%_UqVWBpdjh%+#gYa@)AHC&d5xrCa~XQF1hYOrd(+Z4P4+W=P1!e;o08^E8{ zNgP~GAU6U~D4J?-vwml4Zjw%EvYwgkN}}(oMJCtR6a0-Z0;= z2ZXtG;;gtzBXA9C5()=#)>vp`4u3ElFdEh=Cen$SwMV}%d(R+?P;-#gsmfpc$Ffso zH-=B}b!@H75rvXVLQ|oYZg|@Xb{BB>f?~zogj$nZ-DW_G$xD#Q)$Cd+PMtBYJXzeZJ3kAaailMoSD* z?rA`#FgRxm^^T*E+!qT)i@D|mf~PrGEfUX($;R3I#_`nMU&rVW|Bdj#J!vq=a}%Xj znN-RjuC_`_-+?EAS^SzO1WylHjFa3-JU#4^w3{k22nEm2V1I87$!M%FgRMpsCrj)} zfjCea7^ZkH5rF7aO9X*9Hntg9pQ$dCRU{$qm*;dIkN-lx*2n{25XhAd8jxvW>$rNQ z(uFfXCb-w!WbNm{*%7?EJ{fDa!7`F+2)8wuYHAbxqrC+=*NTH-3N2ZKP!+3VWAaTn zB85sPUxCzs8FlTFrWRe%(GF@7fpa>qOc?;#eDMlfTQDnR?Jv&h2>70CrQokn{>y(X zo$(HLDTfu;kZ>XggT?&_<+0t-u%c~BQU6Sy$plDfsu@U9ho~ZJ#vC<}c+Z%!1QfWZ z$+UE~kMsGIC(=%)L^a&ln{R3)2HnqT%akc^Qp7K3RlbrIY-0AIqJr#ttV^ktb- zy-n(Z)B3B?OVZ;oFMhhX2>T0u$5r;oL{@w(%ZVj3fDzZnaHszGfOjK_<#}_Z{$_P6 zZ&G&Ql38I8jgYW?q^*t);e|Mw2v@3*4(lCJ1QCv8RuKC*F!iS_uM6#q^0iwu2-P+c z(=`jCp{IY``6m7U)5w{CL*0e_pOk74F{mUXQPx?EnXwjQOvo--V=&giWDp9EEhL1Z zdeCC42w5UaGWLDnvt&UO7}=6B|tbKmEC?lafL=broCr588f zdD8c=X*Nft5uP>hEQD4+hYwgo&r^M#X&6oPs}Tyd(&PFEEavlG5DqySj(pB5&mYz$- zkMgegY_KDeow6Y;6LMO-(_s|Zvc<2;Yb3caZhSOG@FG`s=$l)i1;>wZKCffMpVj(l*qf zp0lcabSr)Mb&V}9vgAp|(=QcL{m>cpzlU0qim9Kb_m_U?kXP@ym1?m20Pr_SG`Crq zgpNaT$;K+fTI${J&E1?_1-h4c9(>4s_<>zV0wfzBv2X7l_LhNooX4RrJoRTgDo(hH zZOnL5t9jn4nx3;^4jY&B!XOXt(@8$xB4C`^%p=}h=_RJg03I9k!uZ@)4U}SZ$&@%L zBi7*DWkW2{;R&CqAyvzSo;^NUTo(t9(0bA!LM3j_tk2sn7=`&=*$f`L9v-*4VSIr+ zAMjSn=X_R00q%tD)X?42UB`T_5^fci`<-pWa}=86zG&;%gmbvOA>K*ax)I>sv>;AZ^88q zr3`&j67DoClBAPF%5^n6^kTFVnlsuTuAL1fzMr2e)G#V_DfHMQWZD2> z#$3OJ5f+kiogMhqFu5^#taB+h-J@(peyvVEywA1VwBFBYT6vA&)~pK_#ctb z5W>f32{qOuU%Dc*Bzo>9jfX{uuVgk3$7t*}yfYx0E>dqNm}Om{Z7sZn5qX})ev{A8AF@e&MQjf^ z&yMluvw8N~!nci8&7Nf?tt#4-d8+x0VJbSa*zOSu&%zoY!T>@+&Ux&)Hd*PX-j zef!E>^J~A=M75She~!4*VSGPdlw{Uf-Z3znkqxt&n@wctA=!>Nbk;B?5{WZP_-J7x z^NHDul;yAMARvjqBS{}(K%yjKL3QlOoo`|=?OK;?{ zH+`|0i_yLca`_Z6#%4ZJV|m&oQcwnB zzoWcKT4`n;`jo;8ih9d!#FA7?zNF@KF#%dt?3>D_`r$KQp_`5VttnS{&*U*Cw0vhw z-U-2>zCoE!!%ebkydI~0E`JScvEx-)DP_x)C)x?F7Uz+yt1CFIPi$Do@dxJ|tXeuO z_dKoQ;Eh(b`s3feNjs;5IWqgq;1?A|9aLB{ZY2lt3pU2ayfq{~x)axPuKQ-JRFR4i zg#i3Z5PU?G$I=q<-h{c&<`9}KP;sugP1OT>UDMdW)%yjWdL$LdfUAD~&BP|~dSKqJ zTRitov=0m>Gqg7A76d8XpFE#Sy!@=d_ll*;5{m4mom_9)k>jb;i5TO@o=C|k6*9|3(WmC1g$=CkmuTH}8BXdm&7W=qe}6ND6V>DXcC=xm%3;Qc`EPLZ zW8?Dfq17|7!KFpca}7=GBR(v>d}$FcKTD-Lyee|NTk)b;uEeu5*{s(oTK7}m!bJpMYQ=G&%i%?Rj%d8mxo@z!W!TRH(XCePxyFoT5pRrqJ4eHtJeeL@?Rur4)@1OPhruOkSLS&v|ei+#DqtX+% zdX^rifXxV|(aT!qr;Z-lWjXTKXzUTeiaFN3jMM)c0e^T!$4v7fnOrV_LFA7EijJ{HU%yNi0n4|8K|lQ> z4(rsGQPd#!B2^&JKkLlnY+E{NoOk8ms?S5Z@RM(t;KSfcm)R0n_mou1u4C!B{OpRX z93M!E1qDKQ*jD)?>9s$9VcxTA&@iR)dadl0?=n|{qepW_7v3{7U*i`zw+1zedsWxJ z;U!qDX9x?hV~cpe-xcDm4Lv7EFBC^-Vj#RGPH!g;rRGom`D z*Y>0BL%?EmPILpj*Ck?2S&X~u_VgG$68fw6VZoVsy@_>lh~fZiF1;b+8r{gAe8}tu zb>l*yZ%7C0__F^R9hrxohpyyY_Fk4izouce2X4EFXJ)MSO{jshU)52$DdhnyFJp7kqF;RQ*;iMjQG zCuBJX39kj>0_nb}P+oE_$)$L3x9b?w1yK;dMlS0Q$W5~0K@>R#np z2113#QF|=0vbRs~w{|XgbGSfMxD9o4&G9o8Cct=Gj`7yP5A^+YcIwxgowUy@q}EK= zgiIbsMBYDLGo;pt;L}A?N5jkyXS`fwRXiXIiKQ3xYqEqn#Mdw5Ypoyy8GKhQ2S{(G zYTUl29bM30n+Zy%d%oMh)=h?!Cs56%#5s54^k<{h49USwY5Ac#;rHZdj>tW{*!vWX zDolBJ_j||iB{_fTX#vk!83hV&@*KuvDBbWY*l$7{=`$*UTrVl9b8B{za(Y?(U8Mb@ z*=6^}?!^q-tffokKIq!z?1dtYfy+6ccnjN?{}y%boVzgm%JnnI{o-?|hxw)SyS@c) zokp@RXpaouSsi|qCp6!xar$IK<+t(tb6@8CLZF)BXrERSi`ACPOd5IF77G)j6YowC zLz?>QQxJtS0prwSrV6GKXhIQrD!}{W`}({kqo?xWQKdnX@i{Akne9oGgc9$_$OgRi z@kYHR;@yE3Ov}w!XdU$C6K;v}Go)78q?0F;D)m|~`o?9-%KP5y)7-07?(MyT{L(${ zCA4tqsN6Mk`D;-x^ECV@$nN~_@4mM8C+9EgOeb3}>&RggWHcjhj6Ydy9Jd}C6AuXt zneqLSIa3wrIWioaMy?}(6n9tnPo~jdeksh5{;gx)UZEgyRiBL_`|-u=vih<%H`|Qb zE|8O}QA|`w0-4ywonolYd&|`6juWKi+7hTRkH5Tay*RHveC|y^Jp<}Og-=byh=;j* ztPUC#m-=2F9!54GWnM{V*f-O0m8C{8j(Lx%TLk>K*pb>5h)Fk zhQodbjsHi?2#otPW!yqEzeAgUN{Reibq|5T{DIhPuM%Pw-RMwBa)>Bse?L;r*z;AXL-8bE@V7UplI5 zo;1(RY$2y*WJcNJgPB(CvxT2g%5qOuGWkyA74u_Q2;Y;Wmsov%;;}`pQUJ#kW2Rc? zy$ijL&95K(m1Ty;WyRm82DgjdNVAXb_NTl>;D(jg|1xEpPKnn!E#MMXD7X~qc>%JJ z{0gt2{OUNLKxdOx!U*L4qa=a*0-Xx+b=<{uK31jdHX9tA@p%+}A@4&Cdt=)feMed% zxy+V*7@9S1?EO>xApb>Uzar)TLks_30rN*p2nQl)2PWJ?g#ZquAwe4EqanU6JopnG zZbyOt;J^POzpeQGjrqa1Dl%@z)bMRpXH?)28Wjb29|8iWt@!sy`v=+skw!zJK=GNa zE>LY(7b`uYn+X&s2?^CFdb*kYW?+YM+5}r7RGZ*R!|Pi%pt?kgi@U28kphALD0rhm zw6-VEz&#B}N+E!yOCijlcvly9GGJQ|ptAt*C)1{|@`7UZ09x;1Z$;F_D?wEuZUDJe zP=I0q2LTHd2wt!E7tsgrB zf@+b8&WcvF9E%_BL!dPOo!v>KA5Sn~ZY_5=lD#u+_kJMeZAK8=h%y$a_X(tN{FDm` zNCc2$ARPmEMFSE6L1gW2Mf~;oKT-mHw)z2bA_19EsGk>2W}4*x$PBzk-~hR$fVs9z z0X{1O1xHUQ%OHS!511qZ35QFf5g2h8`Xmf?Qh1x2o~}e25U?q55U^oC9}tw3l%y2I z2J)i~0fzy{aO*RO^UpTm4i2bDd;Hsm05V#3v?1V7AAZdXfJT~`J&Gk^(Tt#5|R%L|k?v@(X6 z09c?U3P4d)3y7f|P}D*XVkm3~wl*;2=SQ}O*cs|sB0Hz1sY!)U_M^4UmiL`?#tJF$ z>X{_=hU;1HTOM~@vtBN|UxNQ__}F&g5nNO@(D$Z(m}wd_DOxbAm*(B%=Q`^GFYEp% z!{P0^q^-lN_Ke5-uFLWmi|ea90okC43^~BArhsLoY@6g6NBYy*`94O$j{vXRoRFF7 z*r}e&VY2&;HBTOiD*I)nW-^2%<1}K#?)-?eM|?00fU^@ zQ!LMtOU5%ZlI|WpsN8-?8>%HPOW1kR{k0{j?zmfF9YGcPlcSxBV(gy$Zi%v4&x^ZN zf39@bB@CGOyIO3Ph9i@>OLO~uPlLx&W;X_XlW;4JcE-zy{ght!!03BXp1@>;(9qS+ z47v0Odj<+Oad8eczzlAz4zL+DAyPYyJokEUzmS5b67uydH)Ip%HL)c60_U-4RJm$Q z88X7v)Roa0)(S!bYMfTVcFKjV=sB#Ry2h)cy{0D^v{&KLUtY{NO8s_!Z0dRtw8S+=)ZVBE3$hY{N61Gj&R%s!e%}o7;X8B6tyJ zQHo&uOZaRe?Pm<#t95WakAnGI!IsyqKHo&g?N!Nlt=?@{Ugbx#zxctnl$)$|KfO~P zaNzuSEK533ao@RFyo@c!uF8Yoe%t!NDT9yG{DQ1Qj_4?C>+y$r`#RDuo44q%EcIz7 zMm?+(ZwB@ONN5%BnN0}JV53r&P&TvlhWsRoo$8%|T~XVUUF+5ebD3p(JBZ7L-#>tY z!gAPU<)qcbelXAK)JskHXefwmP%}yGZG5;EC))VH8$`+PW9>%`c;x+#-tZlZ%A&zhc^poy{whwB~Z0g~) zFGmLCFKgh9J1Pl9iM}H47#k(jtq+OkXGJ*^8e?czQodhwglm5l{F@U6tF(Ts4kuw{ z99#Tj&|cim`shG9;hFa z!+sekntHPd8(#GIPQP&IzjZAlKQH;Jlf7hJlFt}5|Lp}#m&4_*KcEt89MFda-ax)L ze4&l$T@~jmj3B9jzU+5jGc?u96`vFoh`@6kRzOZ%Nb;IRpO4YYO-c5rd#-EzM8A)>0`NWyO8p(#aw8*yV7Rq zoeEUp4q9sPX`z6rdJ%M0KcKtgdlRMi3f+VdX?N~O6a5lld5;z+5IsX$41JUcIT+@c zPUVh(@p}U1jT{SluESTVBuUn_9VsG}SPaMH5wRMHcQ1J9j74!U7!!`mDKQ|1#i3}W zgbuD2m_%20k|zA!XPEUf{P*`v))H;$Sv z9huq2b9>ZUl6TcBbDYJayUf&sv$x&;A$VH7aGOfo-2=oA=c|rPOEOMh+@@_=7>D3h z#!VdW-OGo2OZ2}ne9-SV7G!>>@ybq@{Uc za7%6M(UYzN@?VX0L&ni}m@UX1CUEVhUvaaKD^QarGaRTi*;>XhwIR=`kR-}-mcH}h8V~yDv99NyFEE8o#*cxftD~G#{Tr*Hq}lgPuDuz{J=WX-Fh5VcT0C*DUG6aM z&3`T+8(JCswVgv#&nE!n=Z*h40pjB1e6IeZknMlY2kifk^TA)|2M_?n%Erm`_tV0r ztBa<_Y|_rnNUJK!8hMaMjKfzoDndQjL>Zf5a^XNry;txgs02T@;83eb4=8{Au(e2q zrMZaAl{I(TGgvdKv>^e?uwH@*|*t`)Tb7I-*FTOqKxsQup5m(iYgrzB1U@q`!&os9}mn#TvK`e zTlb*XL@OKQ_*o+$P;#*oF7N|oTeEB}XYPZcPSJ-g9g5*b4O|4r< zyYmx|9QX$2Ezw=yv6`;`93JAk`_So#&|9%!_WMkj6v^(#2NGLvGDi{eZ~BG z$3=I@yJ=fH2uQJs@iQV5V^akm+Z+6x{G9q8I^ST4^~Bv-;_FE2_sa_6dG<o_Y@7Vnn~;4E#K*~U`G9+x{N-o0TH&Rg&^c<}Z2On5G~xn}O{+o&+u%iH z1qy;y*td3;8s_$s3v6L+)5R*wOE#*l^&^TJidwaTWhFKV332f_Kp>rF{PvL6Uf;;T zka&Im=b@lVQD1(^DG?Jkv$*f}IDt7cd%MwJlC(bZPwrhX8XB5&kT+R>guqb=yI2(< zNopY{L3r{)V?CVY2i{8Fz*775Y;-feB`F?tI2UHYg?z;qwQH0HaPmVBy4HL5hLbk+E^KTM@xH!V3V zG?l1O1Pxn<-Y!k!`m!T7b9=llGt2yiWS8$ni78?aYne6L1Zo89SQx>*iaJC0J3R1D z^041PWo#wbqE`-Pl@&f@yfiUkYKXGzb^Zfb^NDuBeX?#Ek&czgjorx&Mk*|gYWBXZ zgTdAF6?G1Dea2H)>gJz%5t@Bth;8}MDhn%!zI@8aS1VB*7cKlTpFbu!SA4tt@g1!} zwtD2g3cTjKP{V;toNRtHKE?vwS4ll4g+GGz6I0dAEmg0Z!2nD+aVgS|<$SCcGNm6I z;a@iL@QT$|yU1?r9Cf}UD*2QT+^GqN1(zywY{fVfJK9(lcVZc#^r#?6sLCbM@0674 zF-X-aYO!T8GJT%unK}DWYhzmXLDFSf1X)}IjUv3f$06=B&-B7id{(Et^EKK17 z9~;qV8ip74tidQ~Y_ax8Db=(L@TLxm=3VOMLSQ#@+Xjj(Wa{wIZ>>V1wQN+B@Clmo zF2y;y@<4C1YK^Pq5OX54xC<6T7O*gA`8)i~{AQ1r}2k$aRmAVv8@733R zM##-PFgFB)_deB-sQ71}9c!{JsWgdv{zk3evDXcwXfy_vYgBIR;LdZ;*=fyb@~l)( zo=_v6kp->JRDAftSB`;I=eMa34z9YJ_pEbmvc+BxSGhc!DtTYs%KN?UFt)bMX`rdD zRx?W!#m;MhaYlvJ)Z0J5C=Z?0NV!^NZiSP+>#_E*bQ_I8;n3QQPsB&XNx617AFQ?S zg5>e_OCIWAWC@@WCZ+}+h3G5)W{Y%RuEHQaV&0-Xdf=DI_iNtgsX1>`^)SUSdjo8$ zzJT#Z6xLqs5ga;|P7Q8tx7GO+ma*6MNbs7$w!elohcoL{2can85{6dX7JuP3$L&&O zb~i*U*LP+sLk$eb3)fQgSKlYYPGB~ckU(2@{c05IJx%F^7g&8Cn>?#IlA(p1~~v-XZe`e4e) z!_x(9oVMr}VyHkO6WD~Ic~05D(2$|P4e{m@x#ZZG7wwgMj@cj+1GIuq4$0uO%3?4N zm_{GY<3J9Kug~RBQo`m622X?1)MZI!=;(oB37m(-+;v*;#=V>O;gwVG<4rw-ucx-Qz9zA`DJjxS>X^TTp1+Jn8iG&o zjg27zk4TViByYf5KS5sA6K+$+>+zvZv03$dIT>ej>vdR(|1eu^SFs%lJp#R%n9BT4 z^o`E&Q~uWYRe@>x_W0Esk6+h4C8_D_&1BA2V8@xB?YNWS^7XP~Gy}pyDzbrPt-<{G zand~xv%PZfEpabOOCTv-UXmuJ7)#FEUYG^HT)z{)S4b@bIMxe#3&v};vJt5n@%V7q zpYU@`l$LS_C@MPGsdHW7vRY&_P%--z(lo`q)Dd!Ji+GgqOV&N`_jSwARc1R3mMXc6 z%I#;yQ5;kWVUtNb7VI+SGj&!&LS}D~l_Lu~E$F{0Z8ka5o-Sx3~=bwC~~8bOSeBp7tZ3qH%dGdVH7ZrN9tYNG`=~#T2aia2V8}^>wO2 zDLJb02gSBoKnP86K}h4;UjJMZr(u70p6mJ=-Tn}XjmxzC^tl?FQZ+KtY<3=qr!DtW zv5ccb&leU)?)aXbJ&%5W&4h>whoIn|u-f53cJI2^xGQtnCRjFi4Y>Dnuc`nm(tx(AQxk;~4JxdbD2QngyYQ^RRu zNyYQe(~LPSrg0A!^EaA06r*7#tnUViLy(gPa>eL4;E{hiGi}w+);oSZ3>ye`Wyo3K ziI{)PQ)S~Whghvfw|IY0PYQSqnmx-plaqDrLE;)=-+oC`VApvz!ZM=6Dd2dDkXq4& zWGO4pwVw8drofR}#B~|(BUMj`$Xf4OL3So)dE;up5ysNf)|R$Y7mF3=j{nE2hLkcV zp;qF9BW8|=7-G+Te~hJLFh`4R3}Pf@uhv@rJFBs#Rk3yl9s9|TsrSZ<+e-ov6t&h< zY7ucn^WbHZ9ZwEj6tts@BN?mZ1Nd~d6Acc&UC&9GO3zLYjoJ}39W7n`4Y-CKcpUra zAg;B1>=KrgMMy32z+z-sq`o;vU^vs~Nvnl@e|Qch=E_W`lqFW-nx7tH57~DP90DcB z0m($JOT*k{~9z%TFTa_2Q9GpuZHV8OO zCXhYm{V8!5G6-4~4brIv+L;X?00Twtq)oki8Uv45bB!IM2f+gdHYXLQWfhN*;ij)# z8|$gWR=UtXCp5pXk66_c;LG4Ot@12poT^o+VUw?kmz*7KQeBl)v=N;K#pY=0+X~gU zxN*lxy}!B`Fn3%|^E8VJZmV)N5gC}+x+5+Z=qZ&k|2CqC5+2Q5!pLg5_~R(tEq$l; z2z7iu<&B!#0|*9XcE10$j-dGs5;B022 znjq)=a8@iL3S|3gQ<8XY9q7HW%(sTIDaocLI81IbR|UEA)XUaTB4iRa z^yE76yP*Q~>-2R#1inM>ZPJR_mpp11ZlpEAQGzWLlOJ6W?k7$V5FWn2wB~uydzvda zzdg5_8ImJmT=Tse)GvS$u@@^ibjz{+%Zx+@UA<=R=vRR>wR;68C*!ZV!6H6R62`Qs zA3QrW7Kmg#J9@pg2;Cr5x>w)yYDLgp!HJ_eu&y5n$sv{exnM=j6Wd;ma14?R&T9#g zQZ)2Fl;VrzPDkla!$*;#uB4j5ugd5K?m&vu+P!+crU*K_FC?o-Yn?k(eBwUbqK06*!$Apg(z zDvbD5%+*SJwDR^UHr?-i{I317H*qU?w=Q7>&Z-mGL}mO`h_iymQ=6Ecsuhi=Kbh5v z=1dbPS$kZe)xOjV6D?J3C(K=uJu&1?l_E_tADaEWCRMJ1Rg@Q6G6bn65qs*r$lah* zOvaU(?ms6F@j}n6c0~D2>oS@6-p=fNsKsY=oeOQ$v6_K#eDI9u@CzQJ>1sCKmjx~c zzM`*~hq>{|wI6D1lnck0?ZE2(PPKTifjc*xRd_Kdp)K?;5j+*wd*qwen^N1~1M|ml zdkM9AUKPk?;N>Q0-=0ymoiF?xc*_6+YUZ(b_ z6p5hS$z;jmMfUXm32PMmZi0tI08?(AqT6}o*SJ|e9N^2xNZ8N6raKMDca+=u1`q?s z_Q0J%9nB^5V;#KSgAQD8GxE58Ec;{;q!gjzDdG~9el6Q9<5W#$BQg7=A!~o))$V1z z+A47EQ_Sp=B$0#tB);OdgW=`8<9b#k8AiwI-;1>B8F5=1$*>&+&lX!Y^Dxapfnl;Yg593E} z;2TukqQSW%v(z8Scg&ng{t2<}xgWeI(_@nuea&B~Qm%oR#(}#k5cOiprZokJbk{nG+4yge0%iRmV=1nJ?+y zh&e9$rDEa+t8dlTRQ9ZHUzD9L+g_(6_b~4`@j0s;a9`{^=9cRLu2r%;Vkb1@ZPu^P zjY0@U-yC6W7UbaumVYD?TJf&N=Ym~eq~s@9Kte%`l1`gvNPC*$QY}~a4|a#?v-RaJ z22vrL^FvVu%Zn##_nm_b`*JW`kHAQcD|HK*m6wmBZC&`()XQE?{cUEG!OF!~SMe4% zJb}EoB*HC67;T#A?aN@4G*U!QJ&YhqiCopoRB^whpkoD?T*^7@0W3$FV;a;*{R-j% z)Mm7MD?Z+?4of-v_lD>2+ zXqFtfdq+g5oT|aA%6AArjux{qWfddBuj>Y2S{!n5ahB<#{wPVDsxvnb3RTT{XF_A- z`==vx|G1P-tA_c*){(muZqNa{YOpb^C)cEpc} zIXIf?h2fcv-6A&NCAu|~Eb=h9(tp(HSnMu!p&!i0lT-P{o>NXzExw!BVQ1k{0ZUJ> zinv)WMXNy?!e!ox1;j2;j^^QgBDBx+ zr}4@QLm*KN%awsHu{WFq=Jb_&zs+o74U$lsD2uC$*m8e5eEUhZ+SE_}bF;_xRVd8| zIrwuMfXk3k*fznDwk3KYOO8XuZS?SjA1i}ath0n9yLd9@aPHQZt!PnQu_7%=TXal< z6U4S}&i3e#_qQ)v2xD3JbM`&A>x6~<5=GDw-m(1NCiqnA*ebYj%SR= zUy&W9bF!sov}MR2Dw(Z-|_8@?elSw z?N(wkN_UaPPxC3;5<#3ZN{dt}8;g$nk#TiELUq9uE&(yN3w2A$Gz<2Qx0*zsV+c9T zCfhgN)W6h zR8s3XRsT?#TTZ;>F>2A~dU({@vHV~hkhU^I=4xOnr}z%zsoJHf-N4srcjDqgRt=_K zuD!j!hqSCkDsZ(}PWtzN?D#F3_lT8?q_6d({#m!ysy+m~Q zX-w_3|S+=H2SjDaoMs6N=)^5g^N8ZBCDxz5t5*ucO}5hDXZLw*Cx z4I8RzZgn;|2iWp)6xemeO}}R5ELcV48qNbmPbE;OEDw(-t>bDmouflIkyL0I@k=c396G8Wx#S>4Yc-TCfeJ=+aE1)aC6t>{L0$_4UvhWt=+G_Nrw-mXMC zXbMaF(Pwji!KYBeV$BUYr`|_J%4lG#bw3NP{{VdavSS+!WT zK!t$t}=GkU^-Av0x(W|`C%vP{a zM91ecj`}3i)+QO5D_a(mdcroWlU!MT|F#@=yU#_-La6XU>8nLPvjkr@~C=#||oaLG7aPoSQ-dIab9(fExh;aX#Hx2PDgdYw$IENA(_=?Ntz8H(tfy40WE zB)pg>9Sw!m?#F!r>>h7{A?ZDlI3@Dh>|-IFx2BA@Y$dRJ>B z@#)QcVam)nhXYe7Pm#u$ZBvQFv8Hr;w5&waTRw~>!g2`=|M%)l`(}7reP5z%NB~uw zFVZ~Sr8OzXf!rSP#_yI8xoXEZ1{tY@UxC%`zP`8p=xZq=R(Gx6ftaVWbp<-ps@}QT zoihfm?A~D9?2gWH-hmRh{6R+wcG{jc8KnLP@^O{azQ{qgLBm0sQZO|?ykC>zFOdu% z2B!w+T1NRsK>~f>B3}?%64s2tHh24y$AR)f#oK$|YrHq;;{y51zLlfd-+8-4MJiH0x^jFwH08u(J(C4{`x~OmHE+We zo3f1A(&ML)_%la|s{dULj(X^-a6!8zo)S>tdL~PIKWXFE=T&Kp_2PD!>v1!-IoZ;T zezJ~SN*cD#(@4JJS;k1+_;30`X{*7bI1#wv&3O5yGim$1iOs^Z-mRFk8D+z&P@0Vu z?6DvB@Uy|;kAjzP@+%@b!O7*OI}Pw}l=up>d6bR`ZiuqhVdKRPLNg07D?$PY-ZTg| z;9qu4de6^N>=jIOP@7EgBg4=09%^5Ii|6(BMFI}?bb(Wig3u-Yp91X<+y1( ziS`~&`$#4fp6%R1?jWdF> zJL@5l4TDE5M@GNAZ)xFp`{z+4(VOX?~7VV1Q3@`ujKdqLAUw-6-V z)|0^dQ~o@GfjhjsCy^sM>mWo^a@s832fy82m?o8@8pN2jw~!jm4}Of8$-+^Zl@>{f!n&{gL%aYx^0F1*#&thw|JV}jD80nNv$U97 zxBYrEdgyx9e0+Vhe#3gOr=3kAR{kVpCZcM&6n{H3)XeTu)MRi*|LX8HN>I%=53t{o z>0~EIdAEVf;Ne1GXiKL70U_5+M#9gh`_`e>%}Wo(O5AIfM@RC=`ISQ869p*XQSnyx z_P6!Ds>AB-J$D>#ZO@~PB>q!{L|~J?CvIWe4gLtvqeqgYmzbF!-YLuj-u!4pRQ$1Z z8uDO`-|N*ol-bq0jTfCpKLi-vGf;p1hTGWHbr1YGimmXa-60esLs8sZ&>46tvwEhd zjI=A}4igh*$=&z%bhIKke}e3|`C6;USh@YvN-2L%qtqFL`Xler_2>Elx&{hCBXT?u=-i();;_u=PGyXaqd zf*BsiLGZxAVGYmfJ@n2e8T^Ws2Vd~ZCt7lZddcBNb9*Wsr|<1-00-;CxMVA)vZHCbosXDwa#A1nK0#0M+ET_dE37W0d|TgK~1sJ{rT32j%H z96c=>fECqlQ=>fsbsp=H?KA*5|EL+DWsj|e$js5>r*)k6g* zxd<;xZz8=7FA2M&1P8}6H0rzp6F>icMCyi|#I4Jimy6C=R_}v0z@h14@f0=w*AhVf z)?8w9QpD+)(%gUz@|rIeJrNL;t3-v<^~s1)QeTCaG8ZeDY{-9E#6_Qsq=cOl9VJ?Vd@?Z|fvvyFt!{c{t)7$;$(YdS=y-GXa0@#lYlq z`dctoK$jii@Yb=r1zP<=n1}wN#WLPD){(EMjwqME9170X*m+Z=oWN_M^BwJ-&{rexvgnsOq1GIbv zZmWj9jtx?tmcT4J7jwgDs?=rj4{_6~+~v|bTrMJG54WmPLr=F-5ucx=BE5ElIGzTn zB5n#27`2=1f?|M;!Mq8)L0evSIu?({9JB724O?Ctctf`tDPFR1Dfc-)a7N|Y5v+&e zQrhBXUzb#B`nEms5QRBl_=E1F(m%0}3#JBwMHHkr|mW za^L&TH(2>t(d;Mj^LO{ec*saSV}EXcW+L+-xa6-HA|WVdjaWtWua8fucSRoVkDN>0 zkhD-~ZZN_PZ$#PWK5>dLPIB>Ro?Q$dO}yVRdg;))Z9m*avePITu5GGml4}Rns}!>u z>btyGvO4|PD#q;g$%yn(*7aBRc5r~KD}Z01Y##B}NT{tX3C0v2#;CeYVWlu*?98=Q zv0YuDBx6Qr3b->J7ucM=&7_nPituuzBWpgt*3qqt>!LH+KXaj;AMwtY(0pFY$^xV4 z5<$ZL?sn$0ckjv!a!WMFqy?fct%!Z7iNfD?lf!6~EqyA#JMuIGU?aVk z_}O~^x>Ro8WPQH#`%jCr;}LWT>hcg)N5JV?pz>+II009@T&)E8zj?LseI=2P@(oqy zFErX0);^Itm7rWQp~p&Lyw^`aA(APq|4UfebG+DdC>a+A6W71P$~gWLR;J`)V+a(r zwt@&7+Jo&(Z6MaruybfuR?pH9DERUDp_ew*H?-4(m|9yY>RH(%KZm6o+XGmk2`HnW zptZ9G12Yo~fPn@217c$30&sztw15&2JquItM=N6sLjV&p@S{E0&eN zOCKBsfEp{O_|7`-0~2SWm8ZVxRh7cbCKJQD;NX&%7m>fnc{=PStk>kZnCB*o<0lfi z`*uu%Z45dM=PZrH-a>U5eIKQ`#bPH)GRYO;j=qVJ$^{^6Ob28%JO*lF(eP}ruoyBP zh+YKmyNxohEu%2s87D>^WMGv)#_BxC^%Z*s4?PlcOI^xIZA@pl&I@!{M->Zj4^9hY zNoiYSmlLmajS_rq;@K7xkMK7NP~1nmZ=>f?KgeF;ken*|^nbB9uK%d!-^K-0bkK)9 zTbh!cgW(^gf_nCb&-(p;+L)=GJw(Vv&+gfFr1kzvGjkvVRZR^bCiWUE>}&vbc6I;@ z3k!gajs4%m3C%NeZ~!=%nE}kt1WiBJKj)w6Sq4hTf5zz%w%ctOxzA9tsB3d;VYn z%G+6k6%8R8KvID@1w(sl2RpE#JplB~ ztN@fTG%(eB_SEMNSee-XEX=H0KruUO2OH?!6Gf+yvMKD5MDWP)Ad+p@Nto zPyzsf>WrTsCV(X#6=hwa@C% z5kV&efUY`!!SKhJ{yxZOT%OlKXkY)v47!y4H&Dp`K?*AHZ>RuJ?Ms;&*lPg(=<+%H z*G&J8!+-Z7qz7FBt&O2$GKOm656vJ0rkO>caI-<%`lBo8n1!Jil4ymwnVCSWOf1Z7AXX?72Llra z4HFa1yT4)KY-ebM%me_jBSRJT*8^Z@V`E_h7yZ} zW+o1(XZ@oL!~)`kYT_SdP}|`8Z&?tClk30x0D-tbP+j~(7Q_r<`ky|a)BB(Hm^nD1 zJL-SQa)SOxmW2uQKYT1u*#BFWg_#p-X8&xDh2`&agV^aow?MmR!&NkOHH1P6RIs*& z`qN+bBw=M_4FLVQK>{U&0U7{aR?&~_Ov3D3ETWu(f?R?uBJ4s!EFdn?k6dg_EP@<@ z{K)@*mS+ N3 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N1 -> N2 [label="sc", color=purple]; +N2 -> N4 [label="sb", color=blue, weight=100]; +N3 -> N4 [label="rf", color=red]; +N1 -> N3 [style=invis]; +{rank=same; N3 N4} +} diff --git a/correctness-model/writeup/figures/wf_sc_rf2.dot b/correctness-model/writeup/figures/wf_sc_rf2.dot new file mode 100644 index 0000000..1cdc907 --- /dev/null +++ b/correctness-model/writeup/figures/wf_sc_rf2.dot @@ -0,0 +1,16 @@ +digraph wf_sc_rf2 { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1, seq-cst)", shape=none]; +//N2 [label="X: fence(seq-cst)", shape=none]; +N3 [label="B: v.store(2)", shape=none]; +//N4 [label="Y: v.load()", shape=none]; + +N1 -> N3 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +//N1 -> N2 [label="sc", color=purple]; +//N2 -> N4 [label="sb", color=blue]; +//N3 -> N4 [label="rf", color=red, constraint=false]; +//N1 -> N3 [style=invis]; +//{rank=same; N1 N2} +} diff --git a/correctness-model/writeup/figures/workflow.pdf b/correctness-model/writeup/figures/workflow.pdf new file mode 100644 index 0000000000000000000000000000000000000000..1c852cf1936dec07c38a467668ee15ca36e61e15 GIT binary patch literal 16034 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 literal 0 HcmV?d00001 diff --git a/correctness-model/writeup/figures/wr_mo.dot b/correctness-model/writeup/figures/wr_mo.dot new file mode 100644 index 0000000..d8267be --- /dev/null +++ b/correctness-model/writeup/figures/wr_mo.dot @@ -0,0 +1,13 @@ +digraph wr_mo { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(2)", shape=none]; +N2 [label="A: v.store(1)", shape=none]; +N3 [label="B: v.load()", shape=none]; + +N2 -> N3 [label="hb", color=blue]; +N1 -> N3 [label="rf", color=red]; +N2 -> N1 [color=invis, constraint=false]; +{rank=same; N1 N3} +} diff --git a/correctness-model/writeup/figures/wr_mo2.dot b/correctness-model/writeup/figures/wr_mo2.dot new file mode 100644 index 0000000..182dea6 --- /dev/null +++ b/correctness-model/writeup/figures/wr_mo2.dot @@ -0,0 +1,13 @@ +digraph wr_mo2 { +margin=0; +ranksep=.3; + +N1 [label="X: v.store(2)", shape=none]; +N2 [label="A: v.store(1)", shape=none]; +N3 [label="B: v.load()", shape=none, fontcolor=invis]; + +N2 -> N3 [color=invis]; +N1 -> N3 [color=invis]; +N2 -> N1 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +{rank=same; N1 N3} +} diff --git a/correctness-model/writeup/figures/ww_mo.dot b/correctness-model/writeup/figures/ww_mo.dot new file mode 100644 index 0000000..2e00cd9 --- /dev/null +++ b/correctness-model/writeup/figures/ww_mo.dot @@ -0,0 +1,9 @@ +digraph ww_mo { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.store(2)", shape=none]; + +N1 -> N2 [label="hb", color=blue]; +N1 -> N2 [color=invis, constraint=false]; +} diff --git a/correctness-model/writeup/figures/ww_mo2.dot b/correctness-model/writeup/figures/ww_mo2.dot new file mode 100644 index 0000000..149c113 --- /dev/null +++ b/correctness-model/writeup/figures/ww_mo2.dot @@ -0,0 +1,8 @@ +digraph ww_mo2 { +margin=0 + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="B: v.store(2)", shape=none]; + +N1 -> N2 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +} diff --git a/correctness-model/writeup/figures/ww_sc_fence_first_collapse.dot b/correctness-model/writeup/figures/ww_sc_fence_first_collapse.dot new file mode 100644 index 0000000..c85988c --- /dev/null +++ b/correctness-model/writeup/figures/ww_sc_fence_first_collapse.dot @@ -0,0 +1,17 @@ +digraph ww_sc_fence_first_collapse { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1, seq-cst)", shape=none]; +//N2 [label="X: fence(seq-cst)", shape=none]; +N3 [label="Y: fence(seq-cst)", shape=none]; +N4 [label="B: v.store(2)", shape=none]; +N5 [style=invis, shape=point]; + +//N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N1 -> N3 [label="sc", color=purple]; +N3 -> N4 [label="sb", color=blue, weight=100]; +N1 -> N5 [style=invis]; +N5 -> N4 [style=invis]; +{rank=same; N4 N5} +} diff --git a/correctness-model/writeup/figures/ww_sc_fence_first_collapse2.dot b/correctness-model/writeup/figures/ww_sc_fence_first_collapse2.dot new file mode 100644 index 0000000..17d14a0 --- /dev/null +++ b/correctness-model/writeup/figures/ww_sc_fence_first_collapse2.dot @@ -0,0 +1,14 @@ +digraph ww_sc_fence_first_collapse2 { +margin=0 +//ranksep=.3; + +N1 [label="A: v.store(1, seq-cst)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: v.store(2)", shape=none]; + +N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/correctness-model/writeup/figures/ww_sc_fence_mo.dot b/correctness-model/writeup/figures/ww_sc_fence_mo.dot new file mode 100644 index 0000000..3edead9 --- /dev/null +++ b/correctness-model/writeup/figures/ww_sc_fence_mo.dot @@ -0,0 +1,18 @@ +digraph ww_sc_fence_mo { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="X: fence(seq-cst)", shape=none]; +N3 [label="Y: fence(seq-cst)", shape=none]; +N4 [label="B: v.store(2)", shape=none]; +N5 [style=invis, shape=point]; + +//N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N2 -> N3 [label="sc", color=purple]; +N1 -> N2 [label="sb", color=blue, weight=100]; +N3 -> N4 [label="sb", color=blue, weight=100]; +N2 -> N5 [style=invis]; +N5 -> N4 [style=invis]; +{rank=same; N4 N5} +} diff --git a/correctness-model/writeup/figures/ww_sc_fence_mo2.dot b/correctness-model/writeup/figures/ww_sc_fence_mo2.dot new file mode 100644 index 0000000..f1964fd --- /dev/null +++ b/correctness-model/writeup/figures/ww_sc_fence_mo2.dot @@ -0,0 +1,14 @@ +digraph ww_sc_fence_mo2 { +margin=0 +//ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: v.store(2)", shape=none]; + +N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/correctness-model/writeup/figures/ww_sc_fence_second_collapse.dot b/correctness-model/writeup/figures/ww_sc_fence_second_collapse.dot new file mode 100644 index 0000000..6dde5c5 --- /dev/null +++ b/correctness-model/writeup/figures/ww_sc_fence_second_collapse.dot @@ -0,0 +1,17 @@ +digraph ww_sc_fence_second_collapse { +margin=0 +ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [label="X: fence(seq-cst)", shape=none]; +//N3 [label="Y: fence(seq-cst)", shape=none]; +N4 [label="B: v.store(2, seq-cst)", shape=none]; +N5 [style=invis, shape=point]; + +//N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3]; +N2 -> N4 [label="sc", color=purple]; +N1 -> N2 [label="sb", color=blue, weight=100]; +N2 -> N5 [style=invis]; +N5 -> N4 [style=invis]; +{rank=same; N4 N5} +} diff --git a/correctness-model/writeup/figures/ww_sc_fence_second_collapse2.dot b/correctness-model/writeup/figures/ww_sc_fence_second_collapse2.dot new file mode 100644 index 0000000..e7c0b35 --- /dev/null +++ b/correctness-model/writeup/figures/ww_sc_fence_second_collapse2.dot @@ -0,0 +1,14 @@ +digraph ww_sc_fence_second_collapse2 { +margin=0 +//ranksep=.3; + +N1 [label="A: v.store(1)", shape=none]; +N2 [style=invis, shape=point]; +N3 [style=invis, shape=point]; +N4 [label="B: v.store(2, seq-cst)", shape=none]; + +N1 -> N4 [label="mo", color="#00aa00", style=dashed, penwidth=3, constraint=false]; +N1 -> N2 [color=invis, weight=100]; +N3 -> N4 [color=invis, weight=100]; +{rank=same; N2 N3} +} diff --git a/correctness-model/writeup/formalization.tex b/correctness-model/writeup/formalization.tex new file mode 100644 index 0000000..aecb783 --- /dev/null +++ b/correctness-model/writeup/formalization.tex @@ -0,0 +1,92 @@ +\mysection{Formalization of Correctness Model}\label{sec:formalization} + +Unlike the SC memory model, applying linearizability can be complicated under +C/C++ by the fact that the C/C++ memory model allows atomic loads to read from +atomic stores that appear later in the trace and that it is in general +impossible to produce a sequential history that preserves program order for the +C/C++ memory model. Intuitively however, we can weaken some constraints, e.g. +the \textit{happens-before} edges in some cases, to generate a reordering of +ordering points such that they yield a sequential history that is consistent +with the specification. We formalize our approach as follow. + +We represent a trace as an \textit{execution graph}, where each node represents +each API method call with a set of ordering points, and edges between nodes are +derived from the \textit{happens-before} edges and the \textit{modification +order} edges between ordering points. We define \textit{opo} as the +\textit{ordering point order} relation between ordering point. Given two +operations $X$ and $Y$ that are both ordering points, the \textit{modification +order} edges are as follow: + +\squishcount + +\item {\bf Modification Order (write-write):} $X \xrightarrow{mo} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-write):} $A \xrightarrow{mo} Y \ \wedge \ A \xrightarrow{rf} X \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-read):} $X \xrightarrow{mo} B \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-read):} $A \xrightarrow{mo} B \ \wedge \ A \xrightarrow{rf} X \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. +\countend + +\vspace{0.3cm} + +Intuitively, if method $A$ + +In order to relax the contraints on the original execution graph, we define an +action \textit{tranform} that can be performed on the graph as follow: + +\mypara{{\bf Hoisting loads:}} $ \forall X, Y, X \in +\textit{OrderingPoints}\xspace \wedge Y \in \textit{OrderingPoints}\xspace \wedge +address(X)\not=address(Y) \wedge +X \relation{hb} Y \wedge Y \in \textit{LoadOps}\xspace +\Rightarrow \forall Z, Z +$. + + +\begin{figure}[!htbp] +\begin{algorithmic}[1] +\Function{InferParams}{testcases, initialParams} +\State inputParams := initialParams +\If{inputParams is empty} +\State inputParams := the weakest parameters \label{line:startWithRelaxed} +\EndIf +\ForAll{test case $t$ in testcases} +\State candidates := inputParams \label{line:setOfCandidates} +\State results := \{\} +\While{candidates is not empty} +\State Candidate $c$ := pop from candidates +\State run \cdschecker with $c$ and check SC \label{line:findSCViolation} +\If{$\exists$ SC violation $v$} +\State \Call {StrengthenParam}{$v$, $c$, candidates} \label{line:callStrengthenParam} +\Else +\State results += \Call {WeakenOrderParams}{$c$} \label{line:weakenOrderParams} +\EndIf +\EndWhile +\State inputParams := results \label{line:tmpOutputAsInput} +\EndFor +\State \Return{results} \label{line:finalResults} +\EndFunction + +\Procedure{StrengthenParam}{v, c, candidates} +\While{$\exists$ a fix $f$ for violation $v$} +\State possible\_repairs := strengthen $c$ with fix $f$ \label{line:strengthenParam} +\State candidates += possible\_repairs \label{line:possibleFixes} +\EndWhile +\EndProcedure + +\end{algorithmic} +\caption{\label{fig:algorithmfence}Algorithm for inferring order parameters} +\end{figure} + + + +\mypara{\bf Generating the Reordering:} +The \TOOL checker first builds an execution graph where the nodes are +method calls and the edges represent the +$\reltext{opo}$ ordering of the ordering points of the methods that +correspond to the source and destination nodes. Assuming the absence +of cycles in the execution graph, +the $\reltext{opo}$ ordering is used to generate the sequential history. +The \TOOL checker +topologically sorts the graph to generate the equivalent sequential +execution. diff --git a/correctness-model/writeup/implementation.tex b/correctness-model/writeup/implementation.tex new file mode 100644 index 0000000..bac8f73 --- /dev/null +++ b/correctness-model/writeup/implementation.tex @@ -0,0 +1,151 @@ +\mysection{Implementation}\label{sec:implementation} + +The goal of the \TOOL specification language is to +enable developers to write specifications against which concurrent data structures can be tested. +We can ensure a concurrent data structure is correct with +respect to an equivalent sequential data structure if for each +execution of the concurrent data structure, the equivalent sequential +history for the equivalent sequential data structure yields the same +results. + +The execution space for many concurrent data +structures is unbounded, meaning that in practice we cannot +verify correctness by checking individual executions. However, the +specifications can be used for unit testing. In practice, +many bugs can be exposed by model checking unit tests for +concurrent data structures. We have implemented the \TOOL checker as a +unit testing tool built upon the \cdschecker framework. \TOOL +can exhaustively explore all behaviors for unit tests and provide +developers with diagnostic reports for executions that violate their +specification. + + +\mysubsection{Model Checker Framework} + +The \TOOL checker takes as input a complete execution from the +\cdschecker model checker. The \cdschecker framework operates at the abstraction level of +individual atomic operations and thus has neither information about +method calls nor which atomic operations serve as ordering points. +Thus, we extend the framework by adding {\it annotation} operations to +\cdschecker's traces, which record the necessary information to check the specifications +but have no effect on other operations. The \TOOL compiler +inserts code to generate the annotation actions to communicate to the \TOOL checker +plugin the critical events for checking the \TOOL specification. +These annotation actions then appear in \cdschecker's list of atomic +operations and make it convenient for \TOOL to construct +a sequential history from the execution because for any given method +call, its invocation event, its ordering points, and its response event are +sequentially ordered in the list. + +\mysubsection{Specification Compiler} + +The specification compiler translates an annotated +C/C++ program into an instrumented C/C++ program that will generate +execution traces containing the dynamic information needed to construct the sequential history +and check the specification assertions. We next +describe the type of annotation actions that the \TOOL compiler +inserts into the instrumented program. + +\mypara{\bf Ordering Points:} Ordering points have a conditional guard expression +and a label. Potential ordering point annotation actions are +inserted immediately after the atomic operation that serves as +the potential ordering point. Ordering point check annotation actions are +inserted where they appear. + +\mypara{\bf Method Boundary:} To identify a method's boundaries, \TOOL +inserts {\it method\_begin} and {\it method\_end} annotations at the +beginning and end of methods. + +\mypara{\bf Sequential States and Methods:} Since checking occurs +after \cdschecker has completed an execution, the annotation +actions stores the values of any variables in the concurrent data +structure that the annotations reference. + +\mypara{\bf Side Effects and Assertions:} Side effects and assertions perform +their checks after an execution. The side effects and assertions are compiled +into methods and the equivalent sequential data structure's states are accessible to these methods. +With this encapsulation, +the \TOOL checker simply calls these functions to implement the side effects and assertions. + +\mypara{\bf Synchronization Checks:} The \TOOL checker performs +synchronization checks in two parts: compiling the rules and runtime data +collection. First, the \TOOL compiler numbers all methods and happens-before +checks uniquely. For example, the rule ``\code{Update->Read}'' can be represented as (1, 0, 2, 0), +which means instances of method 1 that satisfy condition 0 should {\it + synchronize with} instances method 2 that satisfy condition 0. In this case, + condition 0 means \code{true}. Then, +the \TOOL compiler generates code that communicates the +synchronization rules by passing an array of integer pairs. Runtime +collection is then implemented by performing the condition check at +each method invocation or response and then passing the method number +and happens before condition if the check is satisfied. + +\mysubsection{Dynamic Checking} + +At this point, we have an execution trace with the necessary +annotations to construct a sequential history and to check +the execution's correctness. However, before constructing the +sequential history, the \TOOL plugin first collects +the necessary information for each method call, which is the {\it + method\_begin} annotation, the ordering point annotations, the +happens-before checks, and the {\it method\_end} annotations. Since +all of the operations in the trace have thread +identifiers it is straightforward to extract the operations between the {\it + method\_begin} and {\it method\_end} annotations. + +\mypara{\bf Reorder Method Calls:} As discussed above, determining the +ordering of the ordering points is non-trivial under the C/C++ memory +model. This can be complicated by the fact that the C/C++ memory model +allows atomic loads to read from atomic stores that appear later in +the trace and that it is in general impossible to produce a sequential +history that preserves program order for the C/C++ memory model. + +However, we can still leverage the reads-from relation and the +modification-order relation to order the ordering points that appear +in typical data structures. \TOOL uses the following rules to +generate an ordering-point ordering $\reltext{opo}$ relation on +ordering points. Given two operations $X$ and $Y$ that are both +ordering points: + +\squishcount +\item {\bf Reads-From:} $X \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-write):} $X \xrightarrow{mo} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-write):} $A \xrightarrow{mo} Y \ \wedge \ A \xrightarrow{rf} X \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (write-read):} $X \xrightarrow{mo} B \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. + +\item {\bf Modification Order (read-read):} $A \xrightarrow{mo} B \ \wedge \ A \xrightarrow{rf} X \ \wedge \ B \xrightarrow{rf} Y \Rightarrow X \xrightarrow{opo} Y$. +\countend + +\mypara{\bf Generating the Reordering:} +The \TOOL checker first builds an execution graph where the nodes are +method calls and the edges represent the +$\reltext{opo}$ ordering of the ordering points of the methods that +correspond to the source and destination nodes. Assuming the absence +of cycles in the execution graph, +the $\reltext{opo}$ ordering is used to generate the sequential history. +The \TOOL checker +topologically sorts the graph to generate the equivalent sequential +execution. + +When \TOOL fails to order two ordering points, the operations often commute. Thus, +if multiple histories satisfy the constraints of \reltext{opo}, by default we generally randomly select one. However, when those operations +do not commute, we provide developers with different options: (1) they can +add additional ordering points to order the two nodes or +(2) they can run \TOOL in either of the following modes: (a) \textit{loosely +exhaustive} mode --- \TOOL explores +all possible histories and only requires that there exists some history that passes the checks or +(b) \textit{strictly exhaustive} mode --- \TOOL explores all possible histories and requires all histories pass the checks. + + +\mypara{\bf Synchronization Checks:} Synchronization properties are +specified using the IDs and conditions of method calls, and we have that information +available after \TOOL constructs the sequential history and checks the preconditions +and postconditions. For two specific method calls $c_1$ and $c_2$, we can ensure +$c_1$ synchronizes with $c_2$ by ensuring the annotation \code{c1\_begin} +happens-before the annotation \code{c2\_end} because any operations +sequenced-before \code{c1\_begin} should happen-before any operations +sequenced-after \code{c2\_end} according to the C/C++11 memory model. + diff --git a/correctness-model/writeup/introduction.tex b/correctness-model/writeup/introduction.tex new file mode 100644 index 0000000..e0c9c70 --- /dev/null +++ b/correctness-model/writeup/introduction.tex @@ -0,0 +1,226 @@ +\mysection{Introduction}\label{sec:introduction} + +Concurrent data structure design can improve scalability by supporting +multiple simultaneous operations, reducing memory coherence traffic, and reducing the time taken by an +individual data structure operation. Researchers have developed many concurrent +data structure designs with these goals~\cite{rcu, +lockfreequeue}. Concurrent data structures often use sophisticated techniques +including low-level atomic instructions (e.g., compare and +swap), careful reasoning about the order of loads and +stores, and fine-grained locking. For example, while the standard Java hash +table implementation can limit scalability to a handful of cores, +more sophisticated concurrent hash tables can scale to many hundreds of +cores~\cite{javaConcurrentHashMap}. + +The C/C++ standard committee extended the C and C++ languages with +support for low-level atomic operations in the C/C++11 +standard~\cite{cpp11spec, c11spec, boehmpldi} to enable developers to +write portable implementations of concurrent data structures. To support the relaxations typically performed by compilers and processors, +the +C/C++ memory model provides weaker semantics than sequential +consistency~\cite{scmemorymodel} and as a result, correctly using +these operations is challenging. Developers must not only +reason about potential interleavings, but also about how the processor +and compiler might reorder memory operations. Even experts make +subtle errors when reasoning about such memory models. + +Researchers have developed tools for exploring the behavior of code +under the C/C++ memory model including \cdschecker~\cite{cdschecker}, {\sc +Cppmem}~\cite{c11popl}, and Relacy~\cite{relacy}. These tools explore +behaviors that are allowed under the C/C++ memory model. While these +tools can certainly be useful for exploring executions, they can be +challenging to use for testing as they don't provide support (other +than assertions) for specifying the behavior of data structures. +Using assertions can be challenging as different interleavings or +reorderings legitimately produce different behaviors, and it can be +very difficult to code assertions to check the output of a test case for an +arbitrary (unknown) execution. + +This paper presents \TOOL, a specification language and specification +checking tool that is designed to be used in conjunction with model +checking tools. We have implemented it as a plugin for +the \cdschecker model checker. + +\mysubsection{Background on Specifying the Correctness of Concurrent Data Structures} + +Researchers have developed several techniques for specifying +correctness properties of concurrent data structures written for strong memory +models. While these techniques cannot handle the behaviors typically +exhibited by relaxed data structure implementations, they provide insight into +intuitive approaches to specifying concurrent data structure behavior. + +One approach for specifying the correctness of concurrent data +structures is in terms of equivalent sequential executions of either +the concurrent data structure or a simplified sequential version. The +problem then becomes how do we map a concurrent execution to an equivalent +sequential execution? A common criterion is {\it + linearizability} --- linearizability simply states that a concurrent +operation can be viewed as taking effect at some time between its +invocation and its return (or response)~\cite{linearizableref}. + +An {\it equivalent sequential data structure} is a sequential version +of a concurrent data structure that can be used to express correctness +properties by relating executions of the original concurrent data +structure with executions of the equivalent sequential data structure. +The equivalent sequential data structure is often simpler, and in +many cases one can simply use existing well-tested implementations from the +STL library. + +An execution {\it history} is a total order of method invocations and +responses. A {\it sequential history} is one where all invocations are +followed by the corresponding responses immediately. A concurrent +execution is correct if its behavior is consistent with its equivalent +sequential history replayed on the equivalent sequential data +structure. A concurrent object is linearizable if for all executions: +\squishcount +\item Each method call appears to take effect instantaneously at some + point between its invocation and response. + +\item The invocations and responses can be reordered to yield a + sequential history under the rule that an invocation cannot be + reordered before the preceding responses. + +\item The concurrent execution yields the same behavior as + the sequential history. +\countend + +A weaker variation of linearization is {\it sequential +consistency}\footnote{It is important to note that the term sequential +consistency in the literature is applied to both the consistency model +that data structures expose clients to as well as the guarantees that +the underlying memory system provides for load and store operations.}. +Sequential consistency only requires that there exists a sequential +history that is consistent with the {\it program order} (the intra-thread +order). This ordering does not need to be consistent with the order +that the operations were actually issued in. + +Line-Up~\cite{lineup}, Paraglider~\cite{VechevMCLinear}, and +VYRD~\cite{vyrd} leverage linearizability to test concurrent data +structures. {\bf Unfortunately, efficient implementations of many +common data structures, e.g., RCU~\cite{rcu}, MS +Queue~\cite{lockfreequeue}, etc., for the C/C++ memory model are +neither linearizable nor sequentially consistent! Thus previous tools +cannot check such data structures under the C/C++ memory model.} + +\mysubsection{New Challenges from the C/C++ Memory Model} +\label{sec:introNewChallenges} + +The C/C++ memory model brings the following two key challenges that prevent the application of previous approaches to specifying the concurrent data structures to this setting: + +\squishcount +\item {\bf Relaxed Executions Break Existing Data Structure Consistency Models:} +C/C++ data structures often expose clients to weaker (non-SC) +behaviors to gain performance. A common guarantee is to provide +happens-before synchronization between operations that implement +updates and the operations that read those updates. These data +structures often do not guarantee that different threads observe updates in the +same order --- in other words the data structures may expose clients +to weaker consistency models than sequential consistency. For +example, even when one uses the relatively strong \code{acquire} +and \code{release} memory orderings in C++, it is possible for two +different threads to observe two stores happening in +different orders, i.e., executions can fail the IRIW test. +Thus many data structures legitimately admit executions for which there +are no sequential histories that preserve program order. + +Like many other relaxed memory models, the C/C++ memory model does +not include a total order over all memory operations, thus even +further complicating the application of traditional approaches to correctness, +e.g., linearization cannot be applied. In +particular the approaches that relate the behaviors of concurrent data +structures to analogous sequential data structures break down due to +the absence of a total ordering of the memory operations. While many +of the dynamic tools~\cite{cdschecker,relacy} for exploring the +behavior of code under relaxed models do as a practical matter +print out an execution in some order, this order is to some degree arbitrary as relaxed memory models +generally make it possible for a data structure operation to see the +effects of operations that appear later in any such an order (e.g., a load +can read from a store that appears later in the order). Instead of a total order, the C/C++ +memory model is formulated as a graph of memory operations +with several partial orders defined in this graph. + +\item {\bf Constraining Reorderings (Specifying Synchronization Properties):} +Synchronization\footnote{Synchronization here is not mutual exclusion, + but rather a lower-level property that captures which stores must be + visible to a thread. In other words, it constrains which + reorderings can be performed by a processor or compiler.} in C/C++ + provides an ordering between memory operations to different + locations. Concurrent data structures must establish + synchronization or they potentially expose their users to highly + non-intuitive behavior that is likely to break client code. For + example, consider the case of a concurrent queue that does not + establish synchronization between enqueue and dequeue operations. Consider the + following sequence of operations: (1) thread A initializes the fields of a new + object X; (2) thread A enqueues the reference to X in such a queue + (3) thread B dequeues the reference to X; (4) thread B reads the + fields of X through the dequeued reference. In (4), thread B could fail to see the + initializing writes from (1). + This surprising behavior could occur if the compiler or CPU could + reorder the initializing writes to be executed after the enqueue + operation. If the fields are non-atomic, such loads are considered + data races and violate the data race free requirement of the C/C++ + language standard and thus the program has no semantics. + +The C/C++ memory model formalizes synchronization in terms of a {\it + happens-before} relation. The C/C++ happens-before relationship +is a partial order over memory accesses. If memory access {\it x} +happens before memory access {\it y}, it means that the effects of +{\it x} must be ordered before the effects of {\it y}. +\countend + +\begin{figure} + \centering +\vspace{-.3cm} + \includegraphics[scale=0.35]{figures/specworkflow} +\vspace{-.4cm} + \caption{\label{fig:specworkflow} \TOOL system overview} +\vspace{-.4cm} +\end{figure} + +\mysubsection{Specification Language and Tool Support} + +Figure~\ref{fig:specworkflow} presents an overview of the \TOOL system. After +implementing a concurrent data structure, developers annotate their code +with a \TOOL specification. To test their implementation, +developers compile the data structure with the \TOOL specification +compiler to extract the specification and generate a program that is instrumented with specification checks. + Then, developers compile the instrumented program with a +standard C/C++ compiler. Finally, developers run the binary under +the \TOOL checker. \TOOL +then exhaustively explores the behaviors of the specific unit test and +generates diagnostic reports for any executions that violate the specification. + +\mysubsection{Contributions} + +This paper makes the following contributions: + +\squishlist +\item {\bf Specification Language:} It introduces a specification + language that enables developers to write specifications of + concurrent data structures developed for a relaxed memory model in a + simple fashion that capture the key correctness properties. Our + specification language is the first to our knowledge that supports concurrent data + structures that use C/C++ atomic operations. + +\item {\bf A Technique to Relate Concurrent Executions to Sequential Executions:} It presents an approach to order the memory operations for the + C/C++ model, which lacks a definition of a trace and for which one + generally cannot even construct a total order of atomic operations + that is consistent with the program order. The generated + sequential execution by necessity does not always maintain program order. + +\item {\bf Synchronization Properties:} It presents (a) constructs + for specifying the happens before relations that a data structure + should establish, and (b) tool support for checking these properties and + exposing synchronization related bugs. + +\item {\bf Tool for Checking C/C++ Data Structures Against Specifications:} +\TOOL is the first tool to our knowledge that can check concurrent data +structures that exhibit relaxed behaviors against specifications that are +specified in terms of intuitive sequential executions. + +\item {\bf Evaluation:} It shows that the \TOOL specification language can express key correctness properties for a +set of real-world concurrent data structures, that our tool can detect + bugs, and that our tool can unit test real world data structures + with reasonable performance. +\squishend + diff --git a/correctness-model/writeup/issta15_submission.pdf b/correctness-model/writeup/issta15_submission.pdf new file mode 100644 index 0000000000000000000000000000000000000000..84e6eedb682310fa964d01f1ea2a53b408f59df4 GIT binary patch literal 259914 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
  • 0 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 Sdw}eKvWd^kET$li|Nj71-V4D1 literal 0 HcmV?d00001 diff --git a/correctness-model/writeup/makefile b/correctness-model/writeup/makefile new file mode 100644 index 0000000..6c222e4 --- /dev/null +++ b/correctness-model/writeup/makefile @@ -0,0 +1,94 @@ +LATEX := pdflatex -halt-on-error + +FIGURES = + +#FIGHEAD = #figures/figHeader.dotpiece +#FIGFOOT = #figures/figFooter.dotpiece + + +.SUFFIXES : .tex .bbl .aux .eps .ps .dot .pdf + +.tex.bbl: + bibtex $* + +.tex.aux: + latex $* + +%.eps: %.ps + ps2epsi $< $@ + +%.ps: %.dot + dot -Tps $< -o $@ + +%.pdf: %.dot + dot -Tpdf $< -o $@ + +%.png: %.dot + dot -Tpng $< -o $@ + +%.aux: %.tex + $(LATEX) $< + +#%.dot: %.dotpiece $(FIGHEAD) $(FIGFOOT) +# cat $(FIGHEAD) $< $(FIGFOOT) > $@ + + + +# latex the paper (default) +new: biblinks newpaper + +# latex + bibtex the paper +bib: bibpaper newpaper + +# save a backup of tex files in BACKUPS +bak: backuppaper + + +biblinks: figures + $(LATEX) paper.tex + bibtex paper.aux + $(LATEX) paper.tex + + +newpaper: figures biblinks + $(LATEX) paper.tex + + +bibpaper: paper.aux paper.bbl + latex paper.tex + + +backuppaper: + @if [ ! -d BACKUPS ]; then mkdir BACKUPS; fi; \ + crtdate=`date '+%m-%d-%y--%H:%M:%S'`; \ + bakdir=BACKUPS/$$crtdate; \ + mkdir $$bakdir; \ + cp *.tex $$bakdir + +spell: + @for i in *.tex; \ + do if [ $$i != "paper.tex" ]; then aspell -c $$i -p ./spell.lst; fi;\ + done + + +total: + latex paper.tex + bibtex paper.aux + latex paper.tex + latex paper.tex + pdflatex paper.tex + + +figures: $(FIGURES) + + +errinjfig: + gnuplot err-inj-fig/nve2latex.cmds + epstopdf injectErrorFig.eps + mv injectErrorFig.* figures + + +clean: + rm -f *.dvi *.log *.aux *.blg *.bbl *~ err-inj-fig/*~ + rm -f paper.ps paper.pdf + rm -f injectErrorFig* diff --git a/correctness-model/writeup/memorymodel.tex b/correctness-model/writeup/memorymodel.tex new file mode 100644 index 0000000..73e2e8e --- /dev/null +++ b/correctness-model/writeup/memorymodel.tex @@ -0,0 +1,102 @@ +\section{C/C++ Memory Model}\label{sec:memorymodel} + +We next briefly summarize the key aspects of the C/C++ memory model. The +memory model describes a set of atomic operations and the +corresponding allowed behaviors of programs that utilize them. A more +detailed formal treatment of the memory model~\cite{c11popl} and a +more detailed informal description~\cite{cpp11spec,c11spec} are +available in the literature. Any operation on an atomic object will +have one of six \textit{memory orders}, each of which falls into one +or more of the following categories. + +\begin{description} + + \item[relaxed:] + \code{\small{memory\_order\_relaxed}} -- + weakest ordering + + \item[release:] + \code{\small{memory\_order\_release}}, + \code{\small{memory\_order\_acq\_rel}}, and + \code{\small{memory\_order\_seq\_cst}} -- + a store-release may form release/consume or release/acquire synchronization + + \item[consume:\footnotemark{}] + \code{\small{memory\_order\_consume}} -- + a load-consume may form release/consume synchronization + + \footnotetext{Consume is not broadly supported by compilers due to + challenges associate with preserving data dependencies and is + unlikely to provide significant performance gains on x86 + hardware. We take the same approach as many compilers and treat + consumes as acquires.} + + \item[acquire:] + \code{\small{memory\_order\_acquire}}, + \code{\small{memory\_order\_acq\_rel}}, and + \code{\small{memory\_order\_seq\_cst}} -- + a load-acquire may form release/acquire synchronization + + \item[seq-cst:] + \code{\small{memory\_order\_seq\_cst}} -- + strongest ordering + +\end{description} + +\subsection{Relations}\label{sec:model-relations} + +The C/C++ memory model expresses program behavior in the form +of binary relations or orderings. The following subsections will briefly +summarize the relevant relations. Much of this discussion resembles the preferred model from the +formalization in \cite{c11popl}. + +\mypara{\bf Sequenced-Before:} +The order of program operations within a single thread of execution establishes an intra-thread +\textit{sequenced-before} (\reltext{sb}) relation. +Note that while some operations in C/C++ provide no +intra-thread ordering---the equality operator (\code{==}), for example---we +ignore this detail and assume that \reltext{sb} totally orders all operations in +a thread. + +\mypara{\bf Reads-From:} +The \textit{reads-from} (\reltext{rf}) relation consists of store-load pairs $(X, Y)$ +such that $Y$ reads its value from the effect of $X$---or $X \relation{rf} Y$. In the +C/C++ memory model, this relation is non-trivial, as a given load operation may +read from one of many potential stores in the program execution. + +\mypara{\bf Synchronizes-With:} +The \textit{synchronizes-with} (\reltext{sw}) relation captures +synchronization that occurs when certain atomic operations interact across two +threads. For instance, release/acquire synchronization occurs between a pair of +atomic operations on the same object: a store-release $X$ and a load-acquire +$Y$. If $Y$ reads from $X$, then $X$ synchronizes with $Y$---or $X +\relation{sw} Y$. + +\mypara{\bf Happens-Before:} +In \TOOL, we avoid consume operations, and so the \textit{happens-before} +(\reltext{hb}) relation is simply the transitive closure of \reltext{sb} and +\reltext{sw}. + +The \reltext{hb} relation restricts the stores that loads can read +from. For example, if we have two stores $X$ and $Y$ and +a load $Z$ to the same memory location and $X \relation{hb} Y +\relation{hb} Z$, then $Z$ cannot read from $X$. + +\mypara{\bf Sequential Consistency:} +All seq-cst operations in a program execution form a +total ordering (\reltext{sc}) so that, for instance, a seq-cst load may not read +from a seq-cst store prior to the most recent store (to the same location) in +the \reltext{sc} ordering, nor from any store that happens before that store. +The \reltext{sc} order must be consistent with \reltext{hb}. + +\mypara{\bf Modification Order:} +Each atomic object in a program execution has an associated \textit{modification order} +(\reltext{mo})---a total order of all stores to that object---which +informally represents a memory-coherent ordering in which those stores may be observed by +the rest of the program. +In general the modification orders for all objects cannot be combined +to form a consistent total ordering. + + + + diff --git a/correctness-model/writeup/paper.aux b/correctness-model/writeup/paper.aux new file mode 100644 index 0000000..605a7ee --- /dev/null +++ b/correctness-model/writeup/paper.aux @@ -0,0 +1,75 @@ +\relax +\providecommand\hyper@newdestlabel[2]{} +\providecommand\HyperFirstAtBeginDocument{\AtBeginDocument} +\HyperFirstAtBeginDocument{\ifx\hyper@anchor\@undefined +\global\let\oldcontentsline\contentsline +\gdef\contentsline#1#2#3#4{\oldcontentsline{#1}{#2}{#3}} +\global\let\oldnewlabel\newlabel +\gdef\newlabel#1#2{\newlabelxx{#1}#2} +\gdef\newlabelxx#1#2#3#4#5#6{\oldnewlabel{#1}{{#2}{#3}}} +\AtEndDocument{\ifx\hyper@anchor\@undefined +\let\contentsline\oldcontentsline +\let\newlabel\oldnewlabel +\fi} +\fi} +\global\let\hyper@last\relax +\gdef\HyperFirstAtBeginDocument#1{#1} +\providecommand\HyField@AuxAddToFields[1]{} +\providecommand\HyField@AuxAddToCoFields[2]{} +\citation{rcu} +\citation{lockfreequeue} +\citation{javaConcurrentHashMap} +\citation{cpp11spec} +\citation{c11spec} +\citation{boehmpldi} +\citation{scmemorymodel} +\citation{cdschecker} +\citation{c11popl} +\citation{relacy} +\citation{linearizableref} +\@writefile{toc}{\contentsline {section}{\numberline {1}Introduction}{\thepage }{section.1}} +\newlabel{sec:introduction}{{1}{\thepage }{Introduction}{section.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.1}Background on Specifying the Correctness of Concurrent Data Structures}{\thepage }{subsection.1.1}} +\citation{lineup} +\citation{VechevMCLinear} +\citation{vyrd} +\citation{rcu} +\citation{lockfreequeue} +\citation{cdschecker} +\citation{relacy} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.2}New Challenges from the C/C++ Memory Model}{\thepage }{subsection.1.2}} +\newlabel{sec:introNewChallenges}{{1.2}{\thepage }{New Challenges from the C/C++ Memory Model}{subsection.1.2}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {1}{\ignorespaces \textsc {CDSSpec}\xspace system overview}}{\thepage }{figure.1}} +\newlabel{fig:specworkflow}{{1}{\thepage }{\TOOL system overview}{figure.1}{}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.3}Specification Language and Tool Support}{\thepage }{subsection.1.3}} +\@writefile{toc}{\contentsline {subsection}{\numberline {1.4}Contributions}{\thepage }{subsection.1.4}} +\bibstyle{abbrv} +\bibdata{confstrs-long,paper} +\bibcite{cpp11spec}{1} +\bibcite{c11spec}{2} +\bibcite{c11popl}{3} +\bibcite{boehmpldi}{4} +\bibcite{lineup}{5} +\bibcite{rcu}{6} +\bibcite{vyrd}{7} +\bibcite{linearizableref}{8} +\bibcite{scmemorymodel}{9} +\bibcite{javaConcurrentHashMap}{10} +\@writefile{toc}{\contentsline {section}{\numberline {2}Formalization of Correctness Model}{\thepage }{section.2}} +\newlabel{sec:formalization}{{2}{\thepage }{Formalization of Correctness Model}{section.2}{}} +\newlabel{line:startWithRelaxed}{{4}{\thepage }{Formalization of Correctness Model}{Item.9}{}} +\newlabel{line:setOfCandidates}{{7}{\thepage }{Formalization of Correctness Model}{Item.9}{}} +\newlabel{line:findSCViolation}{{11}{\thepage }{Formalization of Correctness Model}{Item.9}{}} +\newlabel{line:callStrengthenParam}{{13}{\thepage }{Formalization of Correctness Model}{Item.9}{}} +\newlabel{line:weakenOrderParams}{{15}{\thepage }{Formalization of Correctness Model}{Item.9}{}} +\newlabel{line:tmpOutputAsInput}{{18}{\thepage }{Formalization of Correctness Model}{Item.9}{}} +\newlabel{line:finalResults}{{20}{\thepage }{Formalization of Correctness Model}{Item.9}{}} +\newlabel{line:strengthenParam}{{24}{\thepage }{Formalization of Correctness Model}{Item.9}{}} +\newlabel{line:possibleFixes}{{25}{\thepage }{Formalization of Correctness Model}{Item.9}{}} +\@writefile{lof}{\contentsline {figure}{\numberline {2}{\ignorespaces Algorithm for inferring order parameters}}{\thepage }{figure.2}} +\newlabel{fig:algorithmfence}{{2}{\thepage }{Algorithm for inferring order parameters}{figure.2}{}} +\@writefile{toc}{\contentsline {section}{\numberline {3}References}{\thepage }{section.3}} +\bibcite{lockfreequeue}{11} +\bibcite{cdschecker}{12} +\bibcite{VechevMCLinear}{13} +\bibcite{relacy}{14} diff --git a/correctness-model/writeup/paper.bbl b/correctness-model/writeup/paper.bbl new file mode 100644 index 0000000..e7f99db --- /dev/null +++ b/correctness-model/writeup/paper.bbl @@ -0,0 +1,84 @@ +\begin{thebibliography}{10} + +\bibitem{cpp11spec} +{ISO/IEC 14882:2011}, {Information} technology -- programming languages -- + {C++}. + +\bibitem{c11spec} +{ISO/IEC 9899:2011}, {Information} technology -- programming languages -- {C}. + +\bibitem{c11popl} +M.~Batty, S.~Owens, S.~Sarkar, P.~Sewell, and T.~Weber. +\newblock Mathematizing {C++} concurrency. +\newblock In {\em Proceedings of the Symposium on Principles of Programming + Languages}, 2011. + +\bibitem{boehmpldi} +H.~J. Boehm and S.~V. Adve. +\newblock Foundations of the {C++} concurrency memory model. +\newblock In {\em Proceedings of the 2008 ACM SIGPLAN Conference on Programming + Language Design and Implementation}, 2008. + +\bibitem{lineup} +S.~Burckhardt, C.~Dern, M.~Musuvathi, and R.~Tan. +\newblock Line-up: A complete and automatic linearizability checker. +\newblock In {\em Proceedings of the 2010 ACM SIGPLAN Conference on Programming + Language Design and Implementation}, 2010. + +\bibitem{rcu} +M.~Desnoyers, P.~E. McKenney, A.~S. Stern, M.~R. Dagenais, and J.~Walpole. +\newblock User-level implementations of read-copy update. +\newblock {\em IEEE Transactions on Parallel and Distributed Systems}, 2011. + +\bibitem{vyrd} +T.~Elmas, S.~Tasiran, and S.~Qadeer. +\newblock {VYRD}: Verifying concurrent programs by runtime refinement-violation + detection. +\newblock In {\em Proceedings of the 2005 ACM SIGPLAN Conference on Programming + Language Design and Implementation}, 2005. + +\bibitem{linearizableref} +M.~Herlihy and J.~Wing. +\newblock Linearizability: a correctness condition for concurrent objects. +\newblock {\em ACM Transactions on Programming Languages and Systems}, + 12(3):463--492, July 1990. + +\bibitem{scmemorymodel} +L.~Lamport. +\newblock How to make a multiprocessor computer that correctly executes + multiprocess programs. +\newblock {\em IEEE Transactions on Computers}, 28(9):690--691, Sept. 1979. + +\bibitem{javaConcurrentHashMap} +D.~Lea. +\newblock util.concurrent.{ConcurrentHashMap} in java.util.concurrent the {Java + Concurrency Package}. +\newblock + \url{http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html}. + +\bibitem{lockfreequeue} +M.~M. Michael and M.~L. Scott. +\newblock Simple, fast, and practical non-blocking and blocking concurrent + queue algorithms. +\newblock In {\em Proceedings of the Fifteenth Annual ACM Symposium on + Principles of Distributed Computing}, 1996. + +\bibitem{cdschecker} +B.~Norris and B.~Demsky. +\newblock {CDSChecker}: Checking concurrent data structures written with + {C/C++} atomics. +\newblock In {\em Proceeding of the 28th ACM SIGPLAN Conference on + Object-Oriented Programming, Systems, Languages, and Applications}, 2013. + +\bibitem{VechevMCLinear} +M.~Vechev, E.~Yahav, and G.~Yorsh. +\newblock Experience with model checking linearizability. +\newblock In {\em International SPIN Workshop on Model Checking Software}, + 2009. + +\bibitem{relacy} +D.~Vyukov. +\newblock Relacy race detector. +\newblock \url{http://relacy.sourceforge.net/}, 2011 Oct. + +\end{thebibliography} diff --git a/correctness-model/writeup/paper.bib b/correctness-model/writeup/paper.bib new file mode 100644 index 0000000..318493c --- /dev/null +++ b/correctness-model/writeup/paper.bib @@ -0,0 +1,774 @@ +@inproceedings{clockvector, + author = "Friedemann Mattern", + title = "Virtual Time and Global States of Distributed Systems", + booktitle = "Workshop on Parallel and Distributed Algorithms", + year = "1989" +} + +@article{scmemorymodel, + author = {Lamport, Leslie}, + title = { How to Make a Multiprocessor Computer That Correctly Executes Multiprocess Programs}, + journal = {IEEE Transactions on Computers}, + issue_date = {September 1979}, + volume = {28}, + number = {9}, + month = sep, + year = {1979}, + pages = {690--691} +} + +@article{cantin, + author = {Cantin, Jason F. and Lipasti, Mikko H. and Smith, James E.}, + title = {The Complexity of Verifying Memory Coherence and Consistency}, + journal = {IEEE Transactions on Parallel and Distributed Systems}, + issue_date = {July 2005}, + volume = {16}, + number = {7}, + month = jul, + year = {2005}, + issn = {1045-9219}, + pages = {663--671} +} + +@inproceedings{roycav, + author = {Roy, Amitabha and Zeisset, Stephan and Fleckenstein, Charles J. and Huang, John C.}, + title = {Fast and Generalized Polynomial Time Memory Consistency Verification}, + booktitle = {Proceedings of the 18th International Conference on Computer Aided Verification}, + year = {2006} +} + + +@INPROCEEDINGS{qbornotqb, + author = {Ganesh Gopalakrishnan and Yue Yang and Hemanthkumar Sivaraj}, + title = {{QB} or not {QB}: An efficient execution verification tool for memory orderings}, + booktitle = cav04, + year = {2004}, + pages = {401--413} +} + +@Article{testsm, + author = {Phillip B. Gibbons and Ephraim Korach}, + title = {Testing Shared Memories}, + journal = {SIAM Journal on Computing}, + year = {1997}, + volume = {26}, + number = {4}, + pages = {1208-1244}, + month = {August} +} + + + +@inproceedings{koushiksc, + author = {Burnim, Jabob and Sen, Koushik and Stergiou, Christos}, + title = {Sound and complete monitoring of sequential consistency for relaxed memory models}, + booktitle = tacas11, + year = {2011} +} + +@inproceedings{burckhardtverif, + author = {Burckhardt, Sebastian and Musuvathi, Madanlal}, + title = {Effective Program Verification for Relaxed Memory Models}, + booktitle = cav08, + year = {2008} +} + +@inproceedings{checkfence, + author = {Burckhardt, Sebastian and Alur, Rajeev and Martin, Milo M. K.}, + title = {CheckFence: Checking consistency of concurrent data types on relaxed memory models}, + booktitle = pldi07, + year = {2007} +} + +@inproceedings{cdschecker, + author = {Norris, Brian and Demsky, Brian}, + title = {{CDSChecker}: Checking Concurrent Data Structures Written with {C/C++} Atomics}, + booktitle = oopsla13, + year = {2013} +} + +@inproceedings{poplabstraction, + author = {Batty, Mark and Dodds, Mike and Gotsman, Alexey}, + title = {Library abstraction for {C/C++} concurrency}, + booktitle = popl13, + year = {2013} +} + + +@inproceedings{mspcboehm, + author = {Boehm, Hans}, + title = {Can seqlocks get along with programming language memory models?}, + booktitle = mspc12, + year = {2012}, +} + + +@inproceedings{pldisc, + author={Daniel Marino and Abhayendra Singh and Todd Millstein and Madanlal Musuvathi and Satish Narayanasamy}, + title={A Case for an SC-Preserving Compiler}, + booktitle=pldi11, + year={2011} +} + +@inproceedings{ppoppworkstealing, + author = {L\^{e}, Nhat Minh and Pop, Antoniu and Cohen, Albert and Zappa Nardelli, Francesco}, + title = {Correct and efficient work-stealing for weak memory models}, + booktitle = ppopp13, + year = {2013} +} + + +@inproceedings{adversarialmemory, + author = {Flanagan, Cormac and Freund, Stephen N.}, + title = {Adversarial memory for detecting destructive races}, + booktitle = pldi10, + year = {2010} +} + + +@inproceedings{verisoft, + author = {Godefroid, Patrice}, + title = {Model checking for programming languages using {VeriSoft}}, + booktitle = popl97, + year = {1997} +} + + +@ARTICLE{dillmodel, + author = {Seungjoon Park and David L. Dill}, + title = {An Executable Specification and Verifier for Relaxed Memory Order}, + journal = ieeetc, + year = {1999}, + volume = {48} +} + +@inproceedings{vechevpartialcoherence11, + author = {Kuperstein, Michael and Vechev, Martin and Yahav, Eran}, + title = {Partial-coherence abstractions for relaxed memory models}, + booktitle = pldi11, + year = {2011} +} + +@inproceedings{vechevfmcad, + author = {Kuperstein, Michael and Vechev, Martin and Yahav, Eran}, + title = {Automatic inference of memory fences}, + booktitle = fcad10, + year = {2010} +} + + +@article{sparcmodel, + author = {Jonsson, Bengt}, + title = {State-space exploration for concurrent algorithms under weak memory orderings}, + journal = {SIGARCH Computer Architecture News}, + issue_date = {December 2008}, + volume = {36}, + number = {5}, + month = jun, + year = {2009}, + pages = {65--71}, + numpages = {7}, +} + + +@inproceedings{inspect1, + author = {Yang, Yu and Chen, Xiaofang and Gopalakrishnan, Ganesh and Wang, Chao}, + title = {Automatic Discovery of Transition Symmetry in Multithreaded Programs Using Dynamic Analysis}, + booktitle = spin09, + year = {2009}, + location = {Grenoble, France}, + pages = {279--295} +} + + +@article{sleepset, + author = {Godefroid, Patrice}, + title = {Partial-Order Methods for the Verification of Concurrent Systems: An Approach to the State-Explosion Problem}, + year = {1996}, + journal = lncs, + vol = {1032} +} + +@Article{inspect2, + author = {Chao Wang and Yu Yang and Aarti Gupta and Ganesh Gopalakrishnan}, + title = {Dynamic Model Checking with Property Driven Pruning to Detect Race Conditions}, + journal = {ATVA LNCS}, + year={2008}, + number = {126--140} +} + + + +@InProceedings{inspect3, + author = {Yu Yang and Xiaofang Chen and Ganesh Gopalakrishnan and Robert M. Kirby}, + title = {Efficient Stateful Dynamic Partial Order Reduction}, + booktitle = spin08, + year = {2008} +} + + +@inproceedings{inspect4, + author = {Yang, Yu and Chen, Xiaofang and Gopalakrishnan, Ganesh and Kirby, Robert M.}, + title = {Distributed Dynamic Partial Order Reduction Based Verification of Threaded Software}, + booktitle = spin07, + year = {2007}, + pages = {58--75} +} + +@Article{savage1997, + author = {Savage, Stefan and Burrows, Michael and Nelson, Greg and Sobalvarro, Patrick and Anderson, Thomas}, + title = {Eraser: A Dynamic Data Race Detector for Multithreaded Programs}, + journal = tocs, + volume = {15}, + issue = {4}, + month = {Nov.}, + year = {1997}, + pages = {391--411}, +} + +@inproceedings{Zhou2007, + author = {Zhou, Pin and Teodorescu, Radu and Zhou, Yuanyuan}, + title = {{HARD}: Hardware-Assisted Lockset-based Race Detection}, + booktitle = hpca07, + year = {2007}, + pages = {121--132} +} + +@article{Gait1986, + author = {Gait, Jason}, + title = {A probe effect in concurrent programs}, + journal = {Software Practice and Experience}, + volume = {16}, + issue = {3}, + month = {March}, + year = {1986}, + pages = {225--233} +} + + +@inproceedings{Gupta2009, + author = {Gupta, Shantanu and Sultan, Florin and Cadambi, Srihari and Ivancic, Franjo and Rotteler, Martin}, + title = {Using Hardware Transactional Memory for Data Race Detection}, + booktitle = ipdps09, + year = {2009}, + pages = {1--11}, +} + +@inproceedings{Kudrjavets2006, + author = {Kudrjavets, Gunnar and Nagappan, Nachiappan and Ball, Thomas}, + title = {Assessing the Relationship between Software Assertions and Faults: An Empirical Investigation}, + booktitle = {Proceedings of the 17th International Symposium on Software Reliability Engineering}, + year = {2006}, + pages = {204--212} +} + +@inproceedings{lockfreequeue, + author = {Michael, Maged M. and Scott, Michael L.}, + title = {Simple, Fast, and Practical Non-Blocking and Blocking Concurrent Queue Algorithms}, + booktitle = podc96, + year = {1996} +} + +@inproceedings{testera, + author = {Marinov, Darko and Khurshid, Sarfraz}, + title = {TestEra: A Novel Framework for Automated Testing of {Java} Programs}, + booktitle = {Proceedings of the 16th IEEE International Conference on Automated Software Engineering}, + year = {2001} +} + +@article{alloy, + author = {Jackson, Daniel}, + title = {Alloy: A Lightweight Object Modelling Notation}, + journal = {ACM Transactions on Software Engineering and Methodology (TOSEM)}, + volume = {11}, + issue = {2}, + month = {April}, + year = {2002}, + pages = {256--290} +} + + +@InProceedings{ltl, + author = {Amir Pnueli}, + title = {The Temporal Logic of Programs}, + booktitle = {Proceedings of the 18th Annual Symposium on Foundations of Computer Science (FOCS)}, + pages = {46--57}, + Tyear = {1977} +} + +@inproceedings{boehmpldi, + author = {Boehm, Hans J. and Adve, Sarita V.}, + title = {Foundations of the {C++} concurrency memory model}, + booktitle = pldi08, + year = {2008} +} + +@Misc{cpp11spec, + title = {{ISO/IEC 14882:2011}, {Information} Technology -- Programming Languages -- {C++}}, +} + +@Misc{c11spec, + title = {{ISO/IEC 9899:2011}, {Information} Technology -- Programming Languages -- {C}}, +} + +@Misc{ieee1850, + title = {1850-2005 {IEEE} Standard for Property Specification Language ({PSL})}, +} + +@Misc{c1xspec, + title = {N1548: Programming languages -- {C}}, + howpublished = {\url{http://www.open-std.org/jtc1/sc22/wg14/www/docs/n1548.pdf}}, + month = {December}, + year = {2010}, +} + +@InProceedings{fadinew1, + author = {Lu, Shan and Park, Soyeon and Seo, Eunsoo and Zhou, Yuanyuan}, + title = {Learning from Mistakes -- A Comprehensive Study on Real World Concurrency Bug Characteristics}, + booktitle = pldi08, + year = {2008} +} + + +@Article{fadinew2, + author = {Netzer, Robert H. B. and Miller, Barton P.}, + title = {What are Race Conditions?: Some Issues and Formalizations}, + journal = {ACM Letters on Programming Languages and Systems}, + year = {1992}, + volume = {1}, + number = {1}, + pages = {74--88}, + month = {March} +} + +@InProceedings{fadinew3, + author = {Jinpeng Wei and Carlton Pu}, + title = {Multiprocessors May Reduce System Dependability under File-based Race Condition Attacks}, + booktitle = {Proceedings of the 37th Annual IEEE/IFIP International Conference on Dependable Systems and Networks}, + year = {2007} +} + +@Article{rcu, + author = {Mathie Desnoyers and Paul E McKenney and Alan S Stern and Michel R Dagenais and Jonathan Walpole}, + title = {User-Level Implementations of Read-Copy Update}, + journal = tpds, + year = {2011} +} + +@InProceedings{crugiso, + author = {Guoliang Jin and Aditya Thakur and Ben Liblit and + Shan Lu}, + title = {Instrumentation and Sampling Strategies for + {Cooperative} {Concurrency} {Bug} {Isolation}}, + booktitle = oopsla10, + year = 2010 +} + +@inproceedings{incrementalhashing, + author = {Nguyen, Viet Yen and Ruys, Theo C.}, + title = {Incremental Hashing for {SPIN}}, + booktitle = spin08, + year = {2008} +} + +@inproceedings{racetrack, + author = {Yu, Yuan and Rodeheffer, Tom and Chen, Wei}, + title = {RaceTrack: Efficient Detection of Data Race Conditions via Adaptive Tracking}, + booktitle = sosp05, + year = {2005} +} + + +@inproceedings{nitpicking, + author = {Blanchette, Jasmin Christian and Weber, Tjark and Batty, Mark and Owens, Scott and Sarkar, Susmit}, + title = {Nitpicking {C++} concurrency}, + booktitle = ppdp11, + year = {2011} +} + + +@inproceedings{c11popl, + author = {Batty, Mark and Owens, Scott and Sarkar, Susmit and Sewell, Peter and Weber, Tjark}, + title = {Mathematizing {C++} Concurrency}, + booktitle = popl11, + year = {2011} +} + +@inproceedings{fairstateless, + author = {Musuvathi, Madanlal and Qadeer, Shaz}, + title = {Fair stateless model checking}, + booktitle = pldi08, + year = {2008} +} + +@Misc{javaConcurrentHashMap, + author = {Doug Lea}, + title = {util.concurrent.{ConcurrentHashMap} in java.util.concurrent the {Java Concurrency Package}}, + howpublished = {\url{http://docs.oracle.com/javase/8/docs/api/java/util/concurrent/ConcurrentHashMap.html}} +} + +@Misc{clickhashtable, + author = {Cliff Click}, + title = {A Lock-Free Hash Table}, + howpublished = {\url{http://www.azulsystems.com/events/javaone_2007/2007_LockFreeHash.pdf}}, + month = {May}, + year = {2007} +} + +@inproceedings{racerx, + author = {Engler, Dawson and Ashcraft, Ken}, + title = {{RacerX}: Effective, Static Detection of Race Conditions and Deadlocks}, + booktitle = sosp03, + year = {2003} +} + +@inproceedings{conflictexceptions, + author = {Lucia, Brandon and Ceze, Luis and Strauss, Karin and Qadeer, Shaz and Boehm, Hans}, + title = {Conflict Exceptions: Simplifying Concurrent Language Semantics with Precise Hardware Exceptions for Data-Races}, + booktitle = isca10, + year = {2010} +} + + +@inproceedings{fasttrack, + author = {Flanagan, Cormac and Freund, Stephen N.}, + title = {{FastTrack}: Efficient and Precise Dynamic Race Detection}, + booktitle = pldi09, + year = {2009} +} + + +@inproceedings{goldilocks, + author = {Elmas, Tayfun and Qadeer, Shaz and Tasiran, Serdar}, + title = {Goldilocks: A Race and Transaction-Aware {Java} Runtime}, + booktitle = pldi07, + year = {2007} +} + +@inproceedings{boyapati, + author = {Chandrasekhar Boyapati and Robert Lee and Martin Rinard}, + title = {{Ownership Types for Safe Programming: Preventing Data Races and Deadlocks}}, + booktitle = oopsla02, + year = {2002} + } + + +@Misc{relacy, + author = {Dmitriy Vyukov}, + title = {Relacy Race Detector}, + howpublished = {\url{http://relacy.sourceforge.net/}}, + month = {2011}, + year = {Oct.} +} + +@Book{spinmodel, + author = {Gerard J. Holzmann}, + title = {The {SPIN} Model Checker: Primer and Reference Manual}, + publisher = {Addison-Wesley Professional}, + year = {2003}, + edition = {1st} +} + +@Book{multiprocessorprogramming, + author = {Maurice Herlihy and Nir Shavit}, + title = {The Art of Multiprocessor Programming}, + publisher = {Morgan Kaufmamn}, + year = {2012}, + edition = {Revised 1st} +} + +@InProceedings{dpor, + author = {Cormac Flanagan and Patrice Godefroid}, + title = {Dynamic Partial-Order Reduction for Model Checking Software}, + booktitle = popl05, + month = {Jan.}, + year = {2005} +} + +@Article{shavitcacm, + author = {Nir Shavit}, + title = {Data Structures in the Multicore Age}, + journal = cacm, + year = {2011}, + volume = {54}, + number = {3}, + month = {March} +} +% pages = {76--84}, + +@inproceedings{chess, + author = {Madanlal Musuvathi and Shaz Qadeer and Piramanayagam Arumuga Nainar and Thomas Ball and Gerard Basler and Iulian Neamtiu}, + title = {Finding and Reproducing {Heisenbugs} in Concurrent Programs}, + year = {2008}, + booktitle=osdi08 +} + + +@inproceedings{lineup, + author = {Burckhardt, Sebastian and Dern, Chris and Musuvathi, Madanlal and Tan, Roy}, + title = {Line-up: A Complete and Automatic Linearizability Checker}, + booktitle = pldi10, + year = {2010} +} + +@inproceedings{berger-grace-09, + author = {Berger, Emery D. and Yang, Ting and Liu, Tongping and Novark, Gene}, + title = {Grace: Safe multithreaded programming for {C}/{C}++}, + booktitle = oopsla09, + year = {2009}, +} + +@INPROCEEDINGS{charisma, +author = {Chao Huang and Laxmikant V. Kale}, +title = {Charisma: Orchestrating Migratable Parallel Objects}, +booktitle = hpdc07, +year = {2007} +} + + +@inproceedings{ding-bop-07, + author = {Ding, Chen and Shen, Xipeng and Kelsey, Kirk and Tice, Chris and Huang, Ruke and Zhang, Chengliang}, + title = {Software behavior oriented parallelization}, + booktitle = pldi07, + year = {2007}, +} + +@Misc{tilepro64, + key = {tilera}, + title = {TILEPro64 Processor}, + howpublished = {\url{http://tilera.com/products/processors/TILEPRO64}}, + month = {December}, + year = {2010} +} + +@Misc{magnycour, + key = {amd}, + title = {{AMD} {Opteron} 6000 Series Platform}, + howpublished = {\url{http://www.amd.com/us/products/server/processors/6000-series-platform/pages/6000-series-platform.aspx}}, + month = {December}, + year = {2010} +} + +@inproceedings{delaunay, + author = {Guibas, Leonidas J. and Knuth, Donald E. and Sharir, Micha}, + title = {Randomized Incremental Construction of {Delaunay} and {Voronoi} Diagrams}, + booktitle = {Proceedings of the Seventeenth International Colloquium on Automata, Languages and Programming}, + year = {1990}, + location = {Warwick University, England}, + pages = {414--431}, + numpages = {18}, + publisher = {Springer-Verlag New York, Inc.}, + address = {New York, NY, USA}, +} + +@inproceedings{1000core, + author = {Borkar, Shekhar}, + title = {Thousand Core Chips: A Technology Perspective}, + booktitle = dac07, + year = {2007} + } + +@PhDThesis{r-cilk-98, + author = {Keith H. Randall}, + title = {Cilk: Efficient Multithreaded Computing}, + school = {Massachusetts Institute of Technology}, + year = 1998, +} + +@InProceedings{dll-jcilk-05, + author = {John S. Danaher and I-Ting Angelina Lee and Charles E. Leiserson}, + title = {The {JCilk} Language for Multithreaded Computing}, + booktitle = scool05, + year = 2005, +} + +@inproceedings{java-grande, + author = {Smith, L. A. and Bull, J. M. and Obdrz\'{a}lek, J.}, + title = {A Parallel {J}ava {G}rande Benchmark Suite}, + booktitle = sc01, + year = {2001} +} + +@inproceedings{spin-commit-atomicity, + author = {Flanagan, Cormac}, + title = {Verifying Commit-Atomicity using Model-Checking}, + booktitle = spin04, + year = {2004} +} + +@Article{linearizableref, + author = {Maurice Herlihy and Jeannette Wing}, + title = {Linearizability: a correctness condition for concurrent objects}, + journal = {ACM Transactions on Programming Languages and Systems}, + year = {1990}, + volume = {12}, + number = {3}, + pages = {463-492}, + month = {July} +} + +@Article{refinement-mapping, + author = {Abadi, Martine and Lamport, Leslie}, + title = {The existence of Refinement Mapping}, + journal = {Theoretical Computer Science}, + year = {1991}, + volume = {82}, + number = {2}, + pages = {253-284}, + month = {May} +} + +@inproceedings{abstraction-linearizability, + author = {Amit, D. and Rinetzky, N. and Reps, T. and Sagiv, M. and Yahav, E. }, + title = {Comparison under Abstraction for Verifying Linearizability}, + booktitle = cav07, + year = {2007} +} + +@inproceedings{formal-verification-set, + author = {Colvin, R. and Groves, L. and Luchangco, V. and Moir, M.}, + title = {Formal Verification of a Lazy Concurrent List-Based Set Algorithm}, + booktitle = cav06, + year = {2006} +} + +@inproceedings{concurrit, + author = {Elmas, T. and Burnim, J. and Necula, G. and Sen, K.}, + title = {{CONCURRIT}: A Domain Specific Language for Reproducing Concurrency Bugs}, + booktitle = pldi13, + year = {2013} +} + +@inproceedings{gambit, + author = {Coons, K. E. and Burckhardt, S. and Musuvathi, M.}, + title = {{GAMBIT}: Effective Unit Testing for Concurrency Libraries}, + booktitle = ppopp10, + year = {2010} +} + +@inproceedings{memtest, + author = {Burnim, J. and Sen, K. and Stergiou, C.}, + title = {Testing Concurrent Programs on Relaxed Memory Models}, + booktitle = issta11, + year = {2011} +} + +@inproceedings{ndetermin, + author = {Burnim, J. and Elmas, T. and Necula, G. and Sen, K.}, + title = {{NDetermin}: Inferring Nondeterministic Sequential Specifications for Parallelism Correctness}, + booktitle = ppopp12, + year = {2012} +} + +@inproceedings{vyrd, + author = {Elmas, T. and Tasiran, S. and Qadeer, S.}, + title = {{VYRD}: VerifYing Concurrent Programs by Runtime Refinement-Violation Detection}, + booktitle = pldi05, + year = {2005} +} + +@inproceedings{thread-quantification, + author = {Berdine, J. and Lev-Ami, T. and Manivich, R. and Ramalingam, G. and Sagiv, M.}, + title = {Thread Quantification for Concurrent Shape Analysis}, + booktitle = cav08, + year = {2008} +} + +@inproceedings{VechevMCLinear, + author = {Vechev, Martin and Yahav, Eran and Yorsh, Greta}, + title = {Experience with Model Checking Linearizability}, + booktitle = "International SPIN Workshop on Model Checking Software", + year = {2009} +} + +@inproceedings{shape-value-abstraction, + author = {Vafeiadis, Viktor}, + title = {Shape-Value Abstraction for Verifying Linearizability}, + booktitle = vmcai09, + year = {2009} +} + +@Article{test-verify-concurrent-objects, + author = {Wing, Jeannette M. and Gong, Chun}, + title = {Testing and Verifying Concurrent Objects}, + journal = {Journal of Parallel and Distributed Computing - Special issue on parallel I/O systems}, + year = {1993}, + volume = {17}, + number = {1-2}, + pages = {164-182}, + month = {Jan./Feb.} +} + +@inproceedings{stamp, + title = {{STAMP}: Stanford Transactional Applications for Multi-Processing}, + author = {Cao Minh, Chi and Chung, JaeWoong and Kozyrakis, Christos and Olukotun, Kunle}, + booktitle = iiswc08, + year = {2008} +} + +@article{l-clocks, + author = {Lamport, Leslie}, + title = {Time, clocks, and the ordering of events in a distributed system}, + journal = cacm, + issue_date = {July 1978}, + volume = {21}, + number = {7}, + month = jul, + year = {1978}, + pages = {558--565}, + numpages = {8}, + acmid = {359563}, + publisher = {ACM}, + address = {New York, NY, USA}, + keywords = {clock synchronization, computer networks, distributed systems, multiprocess systems}, +} + +@inproceedings{reverse-execution, + author = {Pan, Douglas Z. and Linton, Mark A.}, + title = {Supporting reverse execution for parallel programs}, + booktitle = padd88, + year = {1988} +} + +@misc{linux, + title = {Linux Kernel v3.6}, + howpublished = {\url{http://kernel.org/}}, + month = {September}, + year = {2012}, +} + +@inproceedings{mcs-lock, + author = {Mellor-Crummey, John M. and Scott, Michael L.}, + title = {Synchronization without contention}, + booktitle = asplos91, + year = {1991}, + location = {Santa Clara, California, United States}, + pages = {269--278}, + numpages = {10}, + acmid = {106999}, +} + +@misc{barrier-url, + howpublished = {\url{http://stackoverflow.com/questions/8115267/writing-a-spinning-thread-barrier-using-c11-atomics}}, + note = {Oct. 2012}, +} + +@misc{mcs-lock-url, + howpublished = {\url{http://cbloomrants.blogspot.com/2011/07/07-18-11-mcs-list-based-lock\_18.html}}, + note = {Oct. 2012}, +} + +@misc{spsc-queue-url, + howpublished = {\url{https://groups.google.com/forum/#!msg/comp.programming.threads/nSSFT9vKEe0/7eD3ioDg6nEJ}}, + note = {Oct. 2012}, +} + +@misc{mpmc-queue-url, + howpublished = {\url{http://cbloomrants.blogspot.com/2011/07/07-30-11-look-at-some-bounded-queues.html}}, + note = {Oct. 2012}, +} + +@misc{dekker-url, + howpublished = {\url{http://www.justsoftwaresolutions.co.uk/threading/}}, + note = {Dec. 2012}, +} diff --git a/correctness-model/writeup/paper.blg b/correctness-model/writeup/paper.blg new file mode 100644 index 0000000..6a4c408 --- /dev/null +++ b/correctness-model/writeup/paper.blg @@ -0,0 +1,50 @@ +This is BibTeX, Version 0.99d (TeX Live 2013/Debian) +Capacity: max_strings=35307, hash_size=35307, hash_prime=30011 +The top-level auxiliary file: paper.aux +The style file: abbrv.bst +Database file #1: confstrs-long.bib +Database file #2: paper.bib +Warning--to sort, need author or key in cpp11spec +Warning--to sort, need author or key in c11spec +You've used 14 entries, + 2118 wiz_defined-function locations, + 816 strings with 16605 characters, +and the built_in function-call counts, 3810 in all, are: += -- 331 +> -- 190 +< -- 0 ++ -- 76 +- -- 62 +* -- 224 +:= -- 631 +add.period$ -- 38 +call.type$ -- 14 +change.case$ -- 73 +chr.to.int$ -- 0 +cite$ -- 16 +duplicate$ -- 158 +empty$ -- 358 +format.name$ -- 62 +if$ -- 806 +int.to.chr$ -- 0 +int.to.str$ -- 14 +missing$ -- 10 +newline$ -- 69 +num.names$ -- 24 +pop$ -- 115 +preamble$ -- 1 +purify$ -- 59 +quote$ -- 0 +skip$ -- 108 +stack$ -- 0 +substring$ -- 116 +swap$ -- 21 +text.length$ -- 0 +text.prefix$ -- 0 +top$ -- 0 +type$ -- 56 +warning$ -- 2 +while$ -- 27 +width$ -- 16 +write$ -- 133 +(There were 2 warnings) diff --git a/correctness-model/writeup/paper.log b/correctness-model/writeup/paper.log new file mode 100644 index 0000000..7b65903 --- /dev/null +++ b/correctness-model/writeup/paper.log @@ -0,0 +1,661 @@ +This is pdfTeX, Version 3.1415926-2.5-1.40.14 (TeX Live 2013/Debian) (format=pdflatex 2014.3.31) 10 APR 2015 10:40 +entering extended mode + restricted \write18 enabled. + %&-line parsing enabled. +**paper.tex +(./paper.tex +LaTeX2e <2011/06/27> +Babel <3.9h> and hyphenation patterns for 78 languages loaded. +(./sig-alternate.cls +(/usr/share/texlive/texmf-dist/tex/latex/graphics/epsfig.sty +Package: epsfig 1999/02/16 v1.7a (e)psfig emulation (SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphicx.sty +Package: graphicx 1999/02/16 v1.0f Enhanced LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/keyval.sty +Package: keyval 1999/03/16 v1.13 key=value parser (DPC) +\KV@toks@=\toks14 +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/graphics.sty +Package: graphics 2009/02/05 v1.0o Standard LaTeX Graphics (DPC,SPQR) + +(/usr/share/texlive/texmf-dist/tex/latex/graphics/trig.sty +Package: trig 1999/03/16 v1.09 sin cos tan (DPC) +) +(/etc/texmf/tex/latex/config/graphics.cfg +File: graphics.cfg 2009/08/28 v1.8 graphics configuration of TeX Live +) +Package graphics Info: Driver file: pdftex.def on input line 91. + +(/usr/share/texlive/texmf-dist/tex/latex/pdftex-def/pdftex.def +File: pdftex.def 2011/05/27 v0.06d Graphics/color for pdfTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/infwarerr.sty +Package: infwarerr 2010/04/08 v1.3 Providing info/warning/error messages (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/ltxcmds.sty +Package: ltxcmds 2011/11/09 v1.22 LaTeX kernel commands for general use (HO) +) +\Gread@gobject=\count79 +)) +\Gin@req@height=\dimen102 +\Gin@req@width=\dimen103 +) +\epsfxsize=\dimen104 +\epsfysize=\dimen105 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amssymb.sty +Package: amssymb 2013/01/14 v3.01 AMS font symbols + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/amsfonts.sty +Package: amsfonts 2013/01/14 v3.01 Basic AMSFonts support +\@emptytoks=\toks15 +\symAMSa=\mathgroup4 +\symAMSb=\mathgroup5 +LaTeX Font Info: Overwriting math alphabet `\mathfrak' in version `bold' +(Font) U/euf/m/n --> U/euf/b/n on input line 106. +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsmath.sty +Package: amsmath 2013/01/14 v2.14 AMS math features +\@mathmargin=\skip41 + +For additional information on amsmath, use the `?' option. +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amstext.sty +Package: amstext 2000/06/29 v2.01 + +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsgen.sty +File: amsgen.sty 1999/11/30 v2.0 +\@emptytoks=\toks16 +\ex@=\dimen106 +)) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsbsy.sty +Package: amsbsy 1999/11/29 v1.2d +\pmbraise@=\dimen107 +) +(/usr/share/texlive/texmf-dist/tex/latex/amsmath/amsopn.sty +Package: amsopn 1999/12/14 v2.01 operator names +) +\inf@bad=\count80 +LaTeX Info: Redefining \frac on input line 210. +\uproot@=\count81 +\leftroot@=\count82 +LaTeX Info: Redefining \overline on input line 306. +\classnum@=\count83 +\DOTSCASE@=\count84 +LaTeX Info: Redefining \ldots on input line 378. +LaTeX Info: Redefining \dots on input line 381. +LaTeX Info: Redefining \cdots on input line 466. +\Mathstrutbox@=\box26 +\strutbox@=\box27 +\big@size=\dimen108 +LaTeX Font Info: Redeclaring font encoding OML on input line 566. +LaTeX Font Info: Redeclaring font encoding OMS on input line 567. +\macc@depth=\count85 +\c@MaxMatrixCols=\count86 +\dotsspace@=\muskip10 +\c@parentequation=\count87 +\dspbrk@lvl=\count88 +\tag@help=\toks17 +\row@=\count89 +\column@=\count90 +\maxfields@=\count91 +\andhelp@=\toks18 +\eqnshift@=\dimen109 +\alignsep@=\dimen110 +\tagshift@=\dimen111 +\tagwidth@=\dimen112 +\totwidth@=\dimen113 +\lineht@=\dimen114 +\@envbody=\toks19 +\multlinegap=\skip42 +\multlinetaggap=\skip43 +\mathdisplay@stack=\toks20 +LaTeX Info: Redefining \[ on input line 2665. +LaTeX Info: Redefining \] on input line 2666. +) +Document Class 'sig-alternate' <23rd. May '12>. Modified by G.K.M. Tobin/Gerry +Murray +Based in part upon document Style `acmconf' <22 May 89>. Hacked 4/91 by +shivers@cs.cmu.edu, 4/93 by theobald@cs.mcgill.ca +Excerpts were taken from (Journal Style) 'esub2acm.cls'. +****** Bugs/comments/suggestions/technicalities to Gerry Murray -- murray@hq.ac +m.org ****** +Questions on the style, SIGS policies, etc. to Adrienne Griscti griscti@acm.org + +\footheight=\dimen115 +\@maxsep=\dimen116 +\@dblmaxsep=\dimen117 +\aucount=\count92 +\originalaucount=\count93 +\auwidth=\dimen118 +\auskip=\dimen119 +\auskipcount=\count94 +\auskip=\dimen120 +\allauboxes=\dimen121 +\addauthors=\toks21 +\addauflag=\count95 +\subtitletext=\toks22 +\savesection=\count96 +\sectioncntr=\count97 +\c@figure=\count98 +\c@table=\count99 +\titleboxnotes=\toks23 +\titleboxnoteflag=\count100 +Document Class: sig-alternate 2012/05/23 - V2.5 - based on acmproc.cls V1.3 +(/usr/share/texlive/texmf-dist/tex/latex/base/latexsym.sty +Package: latexsym 1998/08/17 v2.2e Standard LaTeX package (lasy symbols) +\symlasy=\mathgroup6 +LaTeX Font Info: Overwriting symbol font `lasy' in version `bold' +(Font) U/lasy/m/n --> U/lasy/b/n on input line 47. +) +\@acmtitlebox=\box28 +\titlenotecount=\count101 +\tntoks=\toks24 +\tntokstwo=\toks25 +\tntoksthree=\toks26 +\tntoksfour=\toks27 +\tntoksfive=\toks28 +\catcount=\count102 +\copyrightnotice=\toks29 +\conf=\toks30 +\confinfo=\toks31 +\c@part=\count103 +\c@section=\count104 +\c@subsection=\count105 +\c@subsubsection=\count106 +\c@paragraph=\count107 + +Using 'Abbrev' bibliography style +LaTeX Info: Redefining \cite on input line 1211. +\bibindent=\dimen122 +\colcntr=\count108 +\saveb@x=\box29 +\copyrtyr=\toks32 +\acmcopyr=\toks33 +\boilerplate=\toks34 +\copyrightetc=\toks35 +(/usr/share/texlive/texmf-dist/tex/latex/base/fontenc.sty +Package: fontenc 2005/09/27 v1.99g Standard LaTeX package + +(/usr/share/texlive/texmf-dist/tex/latex/base/t1enc.def +File: t1enc.def 2005/09/27 v1.99g Standard LaTeX file +LaTeX Font Info: Redeclaring font encoding T1 on input line 43. +) +LaTeX Font Info: Try loading font information for T1+aer on input line 100. + +(/usr/share/texlive/texmf-dist/tex/latex/ae/t1aer.fd +File: t1aer.fd 1997/11/16 Font definitions for T1/aer. +))) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/times.sty +Package: times 2005/04/12 PSNFSS-v9.2a (SPQR) +) +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/helvet.sty +Package: helvet 2005/04/12 PSNFSS-v9.2a (WaS) +) +(/usr/share/texlive/texmf-dist/tex/latex/url/url.sty +\Urlmuskip=\muskip11 +Package: url 2013/09/16 ver 3.4 Verb mode for urls, etc. +) +(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.sty +\lst@mode=\count109 +\lst@gtempboxa=\box30 +\lst@token=\toks36 +\lst@length=\count110 +\lst@currlwidth=\dimen123 +\lst@column=\count111 +\lst@pos=\count112 +\lst@lostspace=\dimen124 +\lst@width=\dimen125 +\lst@newlines=\count113 +\lst@lineno=\count114 +\abovecaptionskip=\skip44 +\belowcaptionskip=\skip45 +\lst@maxwidth=\dimen126 + +(/usr/share/texlive/texmf-dist/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2013/08/26 1.5b (Carsten Heinz) +\c@lstnumber=\count115 +\lst@skipnumbers=\count116 +\lst@framebox=\box31 +) +(/usr/share/texlive/texmf-dist/tex/latex/listings/listings.cfg +File: listings.cfg 2013/08/26 1.5b listings configuration +)) +Package: listings 2013/08/26 1.5b (Carsten Heinz) + +(/usr/share/texlive/texmf-dist/tex/latex/enumitem/enumitem.sty +Package: enumitem 2011/09/28 v3.5.2 Customized lists +\labelindent=\skip46 +\enit@outerparindent=\dimen127 +\enit@toks=\toks37 +\enit@inbox=\box32 +\enitdp@description=\count117 +) +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hyperref.sty +Package: hyperref 2012/11/06 v6.83m Hypertext links for LaTeX + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-hyperref.sty +Package: hobsub-hyperref 2012/05/28 v1.13 Bundle oberdiek, subset hyperref (HO) + + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/hobsub-generic.sty +Package: hobsub-generic 2012/05/28 v1.13 Bundle oberdiek, subset generic (HO) +Package: hobsub 2012/05/28 v1.13 Construct package bundles (HO) +Package hobsub Info: Skipping package `infwarerr' (already loaded). +Package hobsub Info: Skipping package `ltxcmds' (already loaded). +Package: ifluatex 2010/03/01 v1.3 Provides the ifluatex switch (HO) +Package ifluatex Info: LuaTeX not detected. +Package: ifvtex 2010/03/01 v1.5 Detect VTeX and its facilities (HO) +Package ifvtex Info: VTeX not detected. +Package: intcalc 2007/09/27 v1.1 Expandable calculations with integers (HO) +Package: ifpdf 2011/01/30 v2.3 Provides the ifpdf switch (HO) +Package ifpdf Info: pdfTeX in PDF mode is detected. +Package: etexcmds 2011/02/16 v1.5 Avoid name clashes with e-TeX commands (HO) +Package etexcmds Info: Could not find \expanded. +(etexcmds) That can mean that you are not using pdfTeX 1.50 or +(etexcmds) that some package has redefined \expanded. +(etexcmds) In the latter case, load this package earlier. +Package: kvsetkeys 2012/04/25 v1.16 Key value parser (HO) +Package: kvdefinekeys 2011/04/07 v1.3 Define keys (HO) +Package: pdftexcmds 2011/11/29 v0.20 Utility functions of pdfTeX for LuaTeX (HO +) +Package pdftexcmds Info: LuaTeX not detected. +Package pdftexcmds Info: \pdf@primitive is available. +Package pdftexcmds Info: \pdf@ifprimitive is available. +Package pdftexcmds Info: \pdfdraftmode found. +Package: pdfescape 2011/11/25 v1.13 Implements pdfTeX's escape features (HO) +Package: bigintcalc 2012/04/08 v1.3 Expandable calculations on big integers (HO +) +Package: bitset 2011/01/30 v1.1 Handle bit-vector datatype (HO) +Package: uniquecounter 2011/01/30 v1.2 Provide unlimited unique counter (HO) +) +Package hobsub Info: Skipping package `hobsub' (already loaded). +Package: letltxmacro 2010/09/02 v1.4 Let assignment for LaTeX macros (HO) +Package: hopatch 2012/05/28 v1.2 Wrapper for package hooks (HO) +Package: xcolor-patch 2011/01/30 xcolor patch +Package: atveryend 2011/06/30 v1.8 Hooks at the very end of document (HO) +Package atveryend Info: \enddocument detected (standard20110627). +Package: atbegshi 2011/10/05 v1.16 At begin shipout hook (HO) +Package: refcount 2011/10/16 v3.4 Data extraction from label references (HO) +Package: hycolor 2011/01/30 v1.7 Color options for hyperref/bookmark (HO) +) +(/usr/share/texlive/texmf-dist/tex/generic/ifxetex/ifxetex.sty +Package: ifxetex 2010/09/12 v0.6 Provides ifxetex conditional +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/auxhook.sty +Package: auxhook 2011/03/04 v1.3 Hooks for auxiliary files (HO) +) +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/kvoptions.sty +Package: kvoptions 2011/06/30 v3.11 Key value format for package options (HO) +) +\@linkdim=\dimen128 +\Hy@linkcounter=\count118 +\Hy@pagecounter=\count119 + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/pd1enc.def +File: pd1enc.def 2012/11/06 v6.83m Hyperref: PDFDocEncoding definition (HO) +) +\Hy@SavedSpaceFactor=\count120 + +(/usr/share/texlive/texmf-dist/tex/latex/latexconfig/hyperref.cfg +File: hyperref.cfg 2002/06/06 v1.2 hyperref configuration of TeXLive +) +Package hyperref Info: Option `colorlinks' set `true' on input line 4319. +Package hyperref Info: Option `breaklinks' set `true' on input line 4319. +Package hyperref Info: Option `draft' set `true' on input line 4319. +Package hyperref Info: Hyper figures OFF on input line 4443. +Package hyperref Info: Link nesting OFF on input line 4448. +Package hyperref Info: Hyper index ON on input line 4451. +Package hyperref Info: Plain pages OFF on input line 4458. +Package hyperref Info: Backreferencing OFF on input line 4463. +Package hyperref Info: Implicit mode ON; LaTeX internals redefined. +Package hyperref Info: Bookmarks ON on input line 4688. +\c@Hy@tempcnt=\count121 +LaTeX Info: Redefining \url on input line 5041. +\XeTeXLinkMargin=\dimen129 +\Fld@menulength=\count122 +\Field@Width=\dimen130 +\Fld@charsize=\dimen131 +Package hyperref Info: Hyper figures OFF on input line 6295. +Package hyperref Info: Link nesting OFF on input line 6300. +Package hyperref Info: Hyper index ON on input line 6303. +Package hyperref Info: backreferencing OFF on input line 6310. +Package hyperref Info: Link coloring ON on input line 6313. +Package hyperref Info: Link coloring with OCG OFF on input line 6320. +Package hyperref Info: PDF/A mode OFF on input line 6325. +LaTeX Info: Redefining \ref on input line 6365. +LaTeX Info: Redefining \pageref on input line 6369. + + +Package hyperref Warning: Option `pdfpagelabels' is turned off +(hyperref) because \thepage is undefined. + +\c@Item=\count123 +\c@Hfootnote=\count124 +) + +Package hyperref Message: Driver (autodetected): hpdftex. + +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/hpdftex.def +File: hpdftex.def 2012/11/06 v6.83m Hyperref driver for pdfTeX +\Fld@listcount=\count125 +\c@bookmark@seq@number=\count126 + +(/usr/share/texlive/texmf-dist/tex/latex/oberdiek/rerunfilecheck.sty +Package: rerunfilecheck 2011/04/15 v1.7 Rerun checks for auxiliary files (HO) +Package uniquecounter Info: New unique counter `rerunfilecheck' on input line 2 +82. +) +\Hy@SectionHShift=\skip47 +) +(/usr/share/texlive/texmf-dist/tex/latex/rotating/rotating.sty +Package: rotating 2009/03/28 v2.16a rotated objects in LaTeX + +(/usr/share/texlive/texmf-dist/tex/latex/base/ifthen.sty +Package: ifthen 2001/05/26 v1.1c Standard LaTeX ifthen package (DPC) +) +\c@r@tfl@t=\count127 +\rotFPtop=\skip48 +\rotFPbot=\skip49 +\rot@float@box=\box33 +\rot@mess@toks=\toks38 +) +(/usr/share/texlive/texmf-dist/tex/latex/algorithms/algorithm.sty +Package: algorithm 2009/08/24 v0.1 Document Style `algorithm' - floating enviro +nment + +(/usr/share/texlive/texmf-dist/tex/latex/float/float.sty +Package: float 2001/11/08 v1.3d Float enhancements (AL) +\c@float@type=\count128 +\float@exts=\toks39 +\float@box=\box34 +\@float@everytoks=\toks40 +\@floatcapt=\box35 +) +\@float@every@algorithm=\toks41 +\c@algorithm=\count129 +) +(/usr/share/texlive/texmf-dist/tex/latex/algorithmicx/algpseudocode.sty +Package: algpseudocode + +(/usr/share/texlive/texmf-dist/tex/latex/algorithmicx/algorithmicx.sty +Package: algorithmicx 2005/04/27 v1.2 Algorithmicx + +Document Style algorithmicx 1.2 - a greatly improved `algorithmic' style +\c@ALG@line=\count130 +\c@ALG@rem=\count131 +\c@ALG@nested=\count132 +\ALG@tlm=\skip50 +\ALG@thistlm=\skip51 +\c@ALG@Lnr=\count133 +\c@ALG@blocknr=\count134 +\c@ALG@storecount=\count135 +\c@ALG@tmpcounter=\count136 +\ALG@tmplength=\skip52 +) +Document Style - pseudocode environments for use with the `algorithmicx' style +) (/usr/share/texlive/texmf-dist/tex/latex/tools/xspace.sty +Package: xspace 2009/10/20 v1.13 Space after command names (DPC,MH) +) +(/usr/share/texlive/texmf-dist/tex/latex/graphics/color.sty +Package: color 2005/11/14 v1.0j Standard LaTeX Color (DPC) + +(/etc/texmf/tex/latex/config/color.cfg +File: color.cfg 2007/01/18 v1.5 color configuration of teTeX/TeXLive +) +Package color Info: Driver file: pdftex.def on input line 130. +) +(/usr/share/texlive/texmf-dist/tex/latex/base/textcomp.sty +Package: textcomp 2005/09/27 v1.99g Standard LaTeX package +Package textcomp Info: Sub-encoding information: +(textcomp) 5 = only ISO-Adobe without \textcurrency +(textcomp) 4 = 5 + \texteuro +(textcomp) 3 = 4 + \textohm +(textcomp) 2 = 3 + \textestimated + \textcurrency +(textcomp) 1 = TS1 - \textcircled - \t +(textcomp) 0 = TS1 (full) +(textcomp) Font families with sub-encoding setting implement +(textcomp) only a restricted character set as indicated. +(textcomp) Family '?' is the default used for unknown fonts. +(textcomp) See the documentation for details. +Package textcomp Info: Setting ? sub-encoding to TS1/1 on input line 71. + +(/usr/share/texlive/texmf-dist/tex/latex/base/ts1enc.def +File: ts1enc.def 2001/06/05 v3.0e (jk/car/fm) Standard LaTeX file +) +LaTeX Info: Redefining \oldstylenums on input line 266. +Package textcomp Info: Setting cmr sub-encoding to TS1/0 on input line 281. +Package textcomp Info: Setting cmss sub-encoding to TS1/0 on input line 282. +Package textcomp Info: Setting cmtt sub-encoding to TS1/0 on input line 283. +Package textcomp Info: Setting cmvtt sub-encoding to TS1/0 on input line 284. +Package textcomp Info: Setting cmbr sub-encoding to TS1/0 on input line 285. +Package textcomp Info: Setting cmtl sub-encoding to TS1/0 on input line 286. +Package textcomp Info: Setting ccr sub-encoding to TS1/0 on input line 287. +Package textcomp Info: Setting ptm sub-encoding to TS1/4 on input line 288. +Package textcomp Info: Setting pcr sub-encoding to TS1/4 on input line 289. +Package textcomp Info: Setting phv sub-encoding to TS1/4 on input line 290. +Package textcomp Info: Setting ppl sub-encoding to TS1/3 on input line 291. +Package textcomp Info: Setting pag sub-encoding to TS1/4 on input line 292. +Package textcomp Info: Setting pbk sub-encoding to TS1/4 on input line 293. +Package textcomp Info: Setting pnc sub-encoding to TS1/4 on input line 294. +Package textcomp Info: Setting pzc sub-encoding to TS1/4 on input line 295. +Package textcomp Info: Setting bch sub-encoding to TS1/4 on input line 296. +Package textcomp Info: Setting put sub-encoding to TS1/5 on input line 297. +Package textcomp Info: Setting uag sub-encoding to TS1/5 on input line 298. +Package textcomp Info: Setting ugq sub-encoding to TS1/5 on input line 299. +Package textcomp Info: Setting ul8 sub-encoding to TS1/4 on input line 300. +Package textcomp Info: Setting ul9 sub-encoding to TS1/4 on input line 301. +Package textcomp Info: Setting augie sub-encoding to TS1/5 on input line 302. +Package textcomp Info: Setting dayrom sub-encoding to TS1/3 on input line 303. +Package textcomp Info: Setting dayroms sub-encoding to TS1/3 on input line 304. + +Package textcomp Info: Setting pxr sub-encoding to TS1/0 on input line 305. +Package textcomp Info: Setting pxss sub-encoding to TS1/0 on input line 306. +Package textcomp Info: Setting pxtt sub-encoding to TS1/0 on input line 307. +Package textcomp Info: Setting txr sub-encoding to TS1/0 on input line 308. +Package textcomp Info: Setting txss sub-encoding to TS1/0 on input line 309. +Package textcomp Info: Setting txtt sub-encoding to TS1/0 on input line 310. +Package textcomp Info: Setting lmr sub-encoding to TS1/0 on input line 311. +Package textcomp Info: Setting lmdh sub-encoding to TS1/0 on input line 312. +Package textcomp Info: Setting lmss sub-encoding to TS1/0 on input line 313. +Package textcomp Info: Setting lmssq sub-encoding to TS1/0 on input line 314. +Package textcomp Info: Setting lmvtt sub-encoding to TS1/0 on input line 315. +Package textcomp Info: Setting qhv sub-encoding to TS1/0 on input line 316. +Package textcomp Info: Setting qag sub-encoding to TS1/0 on input line 317. +Package textcomp Info: Setting qbk sub-encoding to TS1/0 on input line 318. +Package textcomp Info: Setting qcr sub-encoding to TS1/0 on input line 319. +Package textcomp Info: Setting qcs sub-encoding to TS1/0 on input line 320. +Package textcomp Info: Setting qpl sub-encoding to TS1/0 on input line 321. +Package textcomp Info: Setting qtm sub-encoding to TS1/0 on input line 322. +Package textcomp Info: Setting qzc sub-encoding to TS1/0 on input line 323. +Package textcomp Info: Setting qhvc sub-encoding to TS1/0 on input line 324. +Package textcomp Info: Setting futs sub-encoding to TS1/4 on input line 325. +Package textcomp Info: Setting futx sub-encoding to TS1/4 on input line 326. +Package textcomp Info: Setting futj sub-encoding to TS1/4 on input line 327. +Package textcomp Info: Setting hlh sub-encoding to TS1/3 on input line 328. +Package textcomp Info: Setting hls sub-encoding to TS1/3 on input line 329. +Package textcomp Info: Setting hlst sub-encoding to TS1/3 on input line 330. +Package textcomp Info: Setting hlct sub-encoding to TS1/5 on input line 331. +Package textcomp Info: Setting hlx sub-encoding to TS1/5 on input line 332. +Package textcomp Info: Setting hlce sub-encoding to TS1/5 on input line 333. +Package textcomp Info: Setting hlcn sub-encoding to TS1/5 on input line 334. +Package textcomp Info: Setting hlcw sub-encoding to TS1/5 on input line 335. +Package textcomp Info: Setting hlcf sub-encoding to TS1/5 on input line 336. +Package textcomp Info: Setting pplx sub-encoding to TS1/3 on input line 337. +Package textcomp Info: Setting pplj sub-encoding to TS1/3 on input line 338. +Package textcomp Info: Setting ptmx sub-encoding to TS1/4 on input line 339. +Package textcomp Info: Setting ptmj sub-encoding to TS1/4 on input line 340. +) +(/usr/share/texlive/texmf-dist/tex/latex/listings/lstlang1.sty +File: lstlang1.sty 2013/08/26 1.5b listings language file +) +(/usr/share/texlive/texmf-dist/tex/latex/listings/lstlang1.sty +File: lstlang1.sty 2013/08/26 1.5b listings language file +) +(/usr/share/texlive/texmf-dist/tex/latex/listings/lstmisc.sty +File: lstmisc.sty 2013/08/26 1.5b (Carsten Heinz) +) + +LaTeX Warning: Unused global option(s): + [nocopyrightspace]. + +(./paper.aux) +\openout1 = `paper.aux'. + +LaTeX Font Info: Checking defaults for OML/cmm/m/it on input line 150. +LaTeX Font Info: ... okay on input line 150. +LaTeX Font Info: Checking defaults for T1/cmr/m/n on input line 150. +LaTeX Font Info: ... okay on input line 150. +LaTeX Font Info: Checking defaults for OT1/cmr/m/n on input line 150. +LaTeX Font Info: ... okay on input line 150. +LaTeX Font Info: Checking defaults for OMS/cmsy/m/n on input line 150. +LaTeX Font Info: ... okay on input line 150. +LaTeX Font Info: Checking defaults for OMX/cmex/m/n on input line 150. +LaTeX Font Info: ... okay on input line 150. +LaTeX Font Info: Checking defaults for U/cmr/m/n on input line 150. +LaTeX Font Info: ... okay on input line 150. +LaTeX Font Info: Checking defaults for PD1/pdf/m/n on input line 150. +LaTeX Font Info: ... okay on input line 150. +LaTeX Font Info: Checking defaults for TS1/cmr/m/n on input line 150. +LaTeX Font Info: Try loading font information for TS1+cmr on input line 150. + + (/usr/share/texlive/texmf-dist/tex/latex/base/ts1cmr.fd +File: ts1cmr.fd 1999/05/25 v2.5h Standard LaTeX font definitions +) +LaTeX Font Info: ... okay on input line 150. +LaTeX Font Info: Try loading font information for T1+ptm on input line 150. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1ptm.fd +File: t1ptm.fd 2001/06/04 font definitions for T1/ptm. +) +(/usr/share/texlive/texmf-dist/tex/context/base/supp-pdf.mkii +[Loading MPS to PDF converter (version 2006.09.02).] +\scratchcounter=\count137 +\scratchdimen=\dimen132 +\scratchbox=\box36 +\nofMPsegments=\count138 +\nofMParguments=\count139 +\everyMPshowfont=\toks42 +\MPscratchCnt=\count140 +\MPscratchDim=\dimen133 +\MPnumerator=\count141 +\makeMPintoPDFobject=\count142 +\everyMPtoPDFconversion=\toks43 +) +\c@lstlisting=\count143 +\AtBeginShipoutBox=\box37 + + +Package hyperref Warning: Height of page (\paperheight) is invalid (0.0pt), +(hyperref) using 11in. + + +Package hyperref Warning: Draft mode on. + +Package hyperref Info: Link coloring ON on input line 150. +(/usr/share/texlive/texmf-dist/tex/latex/hyperref/nameref.sty +Package: nameref 2012/10/27 v2.43 Cross-referencing by name of section + +(/usr/share/texlive/texmf-dist/tex/generic/oberdiek/gettitlestring.sty +Package: gettitlestring 2010/12/03 v1.4 Cleanup title references (HO) +) +\c@section@level=\count144 +) +LaTeX Info: Redefining \ref on input line 150. +LaTeX Info: Redefining \pageref on input line 150. +LaTeX Info: Redefining \nameref on input line 150. +LaTeX Font Info: Try loading font information for U+msa on input line 162. + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsa.fd +File: umsa.fd 2013/01/14 v3.01 AMS symbols A +) +LaTeX Font Info: Try loading font information for U+msb on input line 162. + +(/usr/share/texlive/texmf-dist/tex/latex/amsfonts/umsb.fd +File: umsb.fd 2013/01/14 v3.01 AMS symbols B +) +LaTeX Font Info: Try loading font information for U+lasy on input line 162. + +(/usr/share/texlive/texmf-dist/tex/latex/base/ulasy.fd +File: ulasy.fd 1998/08/17 v2.2e LaTeX symbol font definitions +) (./abstract.tex) +(./introduction.tex +Underfull \hbox (badness 1622) in paragraph at lines 15--26 +[]\T1/ptm/m/n/9 The C/C++ stan-dard com-mit-tee ex-tended the C and C++ + [] + + +Underfull \hbox (badness 1062) in paragraph at lines 27--38 +[]\T1/ptm/m/n/9 Researchers have de-vel-oped tools for ex-plor-ing the be-hav- + [] + + +Underfull \vbox (badness 7116) has occurred while \output is active [] + + [1{/var/lib/texmf/fonts/map/pdftex/updmap/pdftex.map} + + +] +LaTeX Font Info: Font shape `T1/ptm/bx/n' in size <9> not available +(Font) Font shape `T1/ptm/b/n' tried instead on input line 76. +LaTeX Font Info: Try loading font information for T1+pcr on input line 119. + +(/usr/share/texlive/texmf-dist/tex/latex/psnfss/t1pcr.fd +File: t1pcr.fd 2001/06/04 font definitions for T1/pcr. +) +Underfull \hbox (badness 10000) in paragraph at lines 142--163 +[]\T1/ptm/b/n/9 Constraining Re-order-ings (Spec-i-fy-ing Syn-chro-niza-tion + [] + + +File: figures/specworkflow.pdf Graphic file (type pdf) + + +Package pdftex.def Info: figures/specworkflow.pdf used on input line 174. +(pdftex.def) Requested size: 149.31004pt x 113.82695pt. +LaTeX Font Info: Font shape `T1/ptm/bx/sc' in size <9> not available +(Font) Font shape `T1/ptm/b/sc' tried instead on input line 176. + [2 <./figures/specworkflow.pdf>]) +(./formalization.tex +Underfull \hbox (badness 4981) in paragraph at lines 34--40 +\T1/ptm/b/n/9 Hoisting loads: $\OMS/cmsy/m/n/9 8\OML/cmm/m/it/9 X; Y; X \OMS/cm +sy/m/n/9 2 [] ^ \OML/cmm/m/it/9 Y \OMS/cmsy/m/n/9 2 + [] + +) (./paper.bbl [3]) +Package atveryend Info: Empty hook `BeforeClearDocument' on input line 182. + [4 + +] +Package atveryend Info: Empty hook `AfterLastShipout' on input line 182. + (./paper.aux) +Package atveryend Info: Empty hook `AtVeryEndDocument' on input line 182. +Package atveryend Info: Empty hook `AtEndAfterFileList' on input line 182. +Package atveryend Info: Empty hook `AtVeryVeryEnd' on input line 182. + ) +Here is how much of TeX's memory you used: + 9020 strings out of 493308 + 129583 string characters out of 6140092 + 252583 words of memory out of 5000000 + 12319 multiletter control sequences out of 15000+600000 + 67735 words of font info for 70 fonts, out of 8000000 for 9000 + 957 hyphenation exceptions out of 8191 + 41i,12n,58p,446b,418s stack positions out of 5000i,500n,10000p,200000b,80000s +{/usr/share/texlive/texmf-dist/fonts/enc/dvips/base/8r.enc} +Output written on paper.pdf (4 pages, 147616 bytes). +PDF statistics: + 64 PDF objects out of 1000 (max. 8388607) + 0 named destinations out of 1000 (max. 500000) + 6 words of extra memory for PDF output out of 10000 (max. 10000000) + diff --git a/correctness-model/writeup/paper.pdf b/correctness-model/writeup/paper.pdf new file mode 100644 index 0000000000000000000000000000000000000000..e32ddb8f76d087075c2e0ec8b4c4b81d77881d8b GIT binary patch literal 147616 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 literal 0 HcmV?d00001 diff --git a/correctness-model/writeup/paper.tex b/correctness-model/writeup/paper.tex new file mode 100644 index 0000000..d65f512 --- /dev/null +++ b/correctness-model/writeup/paper.tex @@ -0,0 +1,182 @@ +%----------------------------------------------------------------------------- +% +% Template for sigplanconf LaTeX Class +% +% Name: sigplanconf-template.tex +% +% Purpose: A template for sigplanconf.cls, which is a LaTeX 2e class +% file for SIGPLAN conference proceedings. +% +% Guide: Refer to "Author's Guide to the ACM SIGPLAN Class," +% sigplanconf-guide.pdf +% +% Author: Paul C. Anagnostopoulos +% Windfall Software +% 978 371-2316 +% paul@windfall.com +% +% Created: 15 February 2005 +% +%----------------------------------------------------------------------------- + + +\documentclass[nocopyrightspace]{sig-alternate} + +% The following \documentclass options may be useful: +% +% 10pt To set in 10-point type instead of 9-point. +% 11pt To set in 11-point type instead of 9-point. +% authoryear To obtain author/year citation style instead of numeric. +\usepackage{times} +\usepackage[scaled]{helvet} % see www.ctan.org/get/macros/latex/required/psnfss/psnfss2e.pdf +\usepackage{url} % format URLs +\usepackage{listings} % format code +\usepackage{enumitem} % adjust spacing in enums +\sloppy +\usepackage[colorlinks=true,allcolors=blue,breaklinks,draft]{hyperref} +\newcommand{\doi}[1]{doi:~\href{http://dx.doi.org/#1}{\Hurl{#1}}} % print a hyperlinked DOI + +\usepackage{rotating} +\usepackage{algorithm}% http://ctan.org/pkg/algorithms +\usepackage{algpseudocode}% http://ctan.org/pkg/algorithmicx +%\usepackage{syntax} +%\usepackage{times} + +\usepackage{amsmath} +\usepackage{graphicx} +\usepackage{xspace} +\usepackage{amssymb} + +\usepackage{listings} +\usepackage{color} +\usepackage{textcomp} +\definecolor{listinggray}{gray}{0.9} +\definecolor{lbcolor}{rgb}{0.9,0.9,0.9} +\lstset{ + % backgroundcolor=\color{lbcolor}, + % rulecolor=, + % aboveskip={1.5\baselineskip}, + % extendedchars=true, + tabsize=3, + language=C++, + basicstyle=\ttfamily\scriptsize, + upquote=true, + columns=fixed, + showstringspaces=false, + breaklines=true, + prebreak = \raisebox{0ex}[0ex][0ex]{\ensuremath{\hookleftarrow}}, + % frame=single, + showtabs=false, + showspaces=false, + showstringspaces=false, + identifierstyle=\ttfamily, + keywordstyle=\color[rgb]{0,0,1}, + commentstyle=\color[rgb]{0.133,0.545,0.133}, + stringstyle=\color[rgb]{0.627,0.126,0.941}, + numbers=left, + numberstyle=\tiny, + numbersep=8pt, + escapeinside={/*@}{@*/} +} + +\usepackage{algpseudocode} + +%% Not used yet +% \usepackage{times} +% \usepackage{latexsym} +% \usepackage{amsfonts} +% \usepackage{amsthm} +% \usepackage{txfonts} +% \usepackage{url} +% \usepackage{subfigure} + +% \usepackage{bbm} +% \usepackage{stfloats} + +\newcommand{\squishlist}{ + \begin{list}{$\bullet$} + { + \setlength{\itemsep}{1pt} + \setlength{\parsep}{1pt} + \setlength{\topsep}{1pt} + \setlength{\partopsep}{1pt} + \setlength{\leftmargin}{1em} + \setlength{\labelwidth}{0.5em} + \setlength{\labelsep}{0.5em} + } +} + +\newcommand{\squishend}{ + \end{list} +} + +\newcommand{\squishcount}{ +% \begin{enumerate} +%} + \begin{list}{\bf \arabic{enumi}.} + { \usecounter{enumi} + \setlength{\itemsep}{1pt} \setlength{\parsep}{0pt} + \setlength{\topsep}{0pt} \setlength{\partopsep}{0pt} + \setlength{\leftmargin}{1em} \setlength{\labelwidth}{0.5em} + \setlength{\labelsep}{0.5em} } } + +\newcommand{\countend}{ +% \end{enumerate} +%} +\end{list}} + + +\newcommand{\code}[1]{\text{\tt #1}} +\newcommand{\mypara}[1]{\noindent {#1}} +\newcommand{\etal}{\textit{et al}.\xspace} +\newcommand{\cdschecker}[0]{\textsc{CDSChecker}\xspace} +\newcommand{\TOOL}[0]{\textsc{CDSSpec}\xspace} + +\newcommand{\TODO}[0]{\textbf{TODO}\xspace} +\newcommand{\todo}[1]{{\bf [[#1]]}} +%\newcommand{\todo}[1]{} +\newcommand{\comment}[1]{} +\newcommand{\tuple}[1]{\ensuremath \langle #1 \rangle} +\newcommand{\rf}{\reltext{rf}} +\newcommand{\relation}[1]{\xrightarrow{\textit{#1}}} +\newcommand{\reltext}[1]{\textit{#1}} + +%\newcommand{\mysection}[1]{\vspace{-.15cm}\section{#1}\vspace{-.15cm}} +\newcommand{\mysection}[1]{\section{#1}} +%\newcommand{\mysubsection}[1]{\vspace{-.15cm}\subsection{#1}\vspace{-.1cm}} +\newcommand{\mysubsection}[1]{\subsection{#1}} +%\newcommand{\mysubsubsection}[1]{\vspace{-.15cm}\subsubsection{#1}\vspace{-.1cm}} +\newcommand{\mysubsubsection}[1]{\subsubsection{#1}} +\begin{document} + + +\sloppy + +\title{CDSSpec: Testing Concurrent Data Structures Under the C/C++11 Memory Model} + +\author{Peizhao Ou and Brian Demsky} + + + +\maketitle + +\begin{abstract} +\input{abstract} +\end{abstract} + +\input{introduction} +%\input{memorymodel} +%\input{example} +\input{formalization} +%\input{specification} +%\input{implementation} +%\input{evaluation} +%\input{related} +%\input{conclusion} + + +% We recommend abbrvnat bibliography style. +\bibliographystyle{abbrv} +\bibliography{confstrs-long,paper} + +\end{document} diff --git a/correctness-model/writeup/related.tex b/correctness-model/writeup/related.tex new file mode 100644 index 0000000..b8f025d --- /dev/null +++ b/correctness-model/writeup/related.tex @@ -0,0 +1,133 @@ +\mysection{\label{sec:related}Related Work} + +% Related work should be related to bug finding on concurrent data structures: +% 1. Specification: +% CONCURRIT: A Domain Specific Language for Reproducing Concurrency Bugs (DSL +% for reproducing bugs, allowing specifying a set of thread schedules to explore +% in order to exhibit the bug) (PLDI'13) + +% (specify the correctness of concurrent programs using +% nondeterministic sequential specifications, which allows the functional +% correctness to be understood and verified on a sequential version of the +% program) (PLDI'11) + +% (this is the extended work of NDSeq, which is +% inferring the specification) (ppopp'12) + +% (specification, not exhaustive approach, dynamic checking) +% (PLDI'05) + + +% 2. Linearizability: +% (a more complete technique +% for verifying atomicity using SPIN model checker)(SPIN Workshop'04) + +% (theoretical paper about proving a lower +% level spscification correctly implements a higher level one) (Theoretical +% Computer Science'91) + +% (static analysis +% for verifying linearizability of concurrent unbounded linked data +% structures) (CAV'07) + +% (a formal +% verification of LazyList, concurrent list-based set algorithm, shows it's +% linearizable) (CAV'06) + +% (no specification, +% run a sequential version in parallel and checks if the concurrent execution +% violates linearizability, rely on CHESS, which assumes SC) (PLDI'10) + +% (using abstract +% interpretation, shape analysis for concurrent data structures, can prove +% linearizability in a limited way) (CAV'08) + +% (SC-based checking +% linearizability) (SPIN Workshop'09) + +% (heap-allocated data +% structures, shape analysis, assuming SC) (VMCAI'09) + +% 3. General concurrency testing +% (a prioritized +% search technique that combines the speed benefit of heuristic-guided fuzzing +% with the soundness, progress, and reproducibility of stateless model checking) +% (ppopp'10) + +% (one of the early paper) (Journal of Parallel and +% Distributed Computing) + +% 4. For relaxed M.M. +% () (PLDI'07) (TODO: Should read this in more detail) + +% (a tool that test +% concurrent programs under relaxed M.M., but no specification, and not +% an exhaustive approach) (issta'11) + +Researchers have proposed and designed specifications and approaches +to find bugs in concurrent data structures based on linearization. +Early work by Wing and +Gong~\cite{test-verify-concurrent-objects} proposed using +linearizability to test and verify concurrent objects. +Line-up~\cite{lineup} builds on the Chess~\cite{chess} model checker +to automatically check deterministic linearizability. It +automatically generates the sequential specification by systematically +enumerating all sequential behaviors. +Paraglider~\cite{VechevMCLinear} supports checking with and without +linearization points based on SPIN~\cite{spinmodel}. All of these +approaches assume that there exist a sequential history that is consistent with program order. Furthermore, they also assume +the SC memory model and a trace that provides an +ordering for method invocation and response events. Our work extends the notion of equivalence to sequential executions to the relaxed memory models used +by real systems. + +Amit \etal~\cite{abstraction-linearizability} present a static +analysis based on TVLA for verifying linearizability of concurrent +linked data structures. Valeiadis~\cite{shape-value-abstraction} +demonstrates a shape-value abstraction which can automatically prove +linearizability. Thread quantification can also verify +data structure linearizability~\cite{thread-quantification}. +Colvin \etal formally verified a list-based set~\cite{formal-verification-set}. While these approaches +provide stronger guarantees than \TOOL, they were typically used to +check simpler data structures and require experts to use. +Moreover, they target the SC memory model. + +Researchers have proposed specification languages for concurrent +data structures. Refinement mapping~\cite{refinement-mapping} +provides the theoretical basis for designing and using specifications. +Commit atomicity~\cite{spin-commit-atomicity} can verify atomicity +properties. Concurrit~\cite{concurrit} is a domain-specific language +that allows programmers to write scripts to specify thread schedules +to reproduce bugs, and is useful when programmers already have some +knowledge about a bug. NDetermin~\cite{ndetermin} infers +nondeterministic sequential specifications to model the behaviors of +parallel code. + +VYRD~\cite{vyrd} is conceptually similar to \TOOL --- developers +specify commit points for concurrent code. The parallel code is then +executed and the commit points are used to identify a sequential +execution that should have the same behaviors. VYRD was designed for +the SC memory model --- it +is unable to construct a sequential refinement for a relaxed memory +model or check synchronization properties. + +{\sc Gambit}~\cite{gambit} uses a prioritized search technique that +combines stateless model checking and heuristic-guided fuzzing to unit +test code under the SC memory model. {\sc Relaxed}~\cite{memtest} +explores SC executions to identify executions with races and then +re-executes the program under the PSO or TSO memory model to test +whether the relaxations expose bugs. CheckFence~\cite{checkfence} is +a tool for verifying data structures against relaxed memory models and +takes a SAT-based approach instead of the stateless model checking +approach used by \cdschecker. + +Researchers have developed verification techniques for code that +admits only SC executions under the TSO and PSO memory +models~\cite{koushiksc,burckhardtverif}. The basic idea is to develop +an execution monitor that can detect whether non-SC executions exist +by examining only SC executions. + + diff --git a/correctness-model/writeup/sig-alternate.cls b/correctness-model/writeup/sig-alternate.cls new file mode 100644 index 0000000..694a897 --- /dev/null +++ b/correctness-model/writeup/sig-alternate.cls @@ -0,0 +1,1649 @@ +% SIG-ALTERNATE.CLS - VERSION 2.5 +% "COMPATIBLE" WITH THE "ACM_PROC_ARTICLE-SP.CLS" V3.2SP +% Gerald Murray - May 23rd 2012 +% +% ---- Start of 'updates' ---- +% Changed $10 fee to $15 -- May 2012 -- Gerry +% Changed $5 fee to $10 -- April 2009 -- Gerry +% April 22nd. 2009 - Fixed 'Natbib' incompatibility problem - Gerry +% April 22nd. 2009 - Fixed 'Babel' incompatibility problem - Gerry +% April 22nd. 2009 - Inserted various bug-fixes and improvements - Gerry +% +% To produce Type 1 fonts in the document plus allow for 'normal LaTeX accenting' in the critical areas; +% title, author block, section-heads, confname, etc. etc. +% i.e. the whole purpose of this version update is to NOT resort to 'inelegant accent patches'. +% After much research, three extra .sty packages were added to the the tail (ae, aecompl, aeguill) to solve, +% in particular, the accenting problem(s). We _could_ ask authors (via instructions/sample file) to 'include' these in +% the source .tex file - in the preamble - but if everything is already provided ('behind the scenes' - embedded IN the .cls) +% then this is less work for authors and also makes everything appear 'vanilla'. +% NOTE: all 'patchwork accenting" has been commented out (here) and is no longer 'used' in the sample .tex file (either). +% Gerry June 2007 +% +% Patch for accenting in conference name/location. Gerry May 3rd. 2007 +% Rule widths changed to .5, author count (>6) fixed, roll-back for Type 3 problem. Gerry March 20th. 2007 +% Changes made to 'modernize' the fontnames but esp. for MikTeX users V2.4/2.5 - Nov. 30th. 2006 +% Updated the \email definition to allow for its use inside of 'shared affiliations' - Nov. 30th. 2006 +% Fixed the 'section number depth value' - Nov. 30th. 2006 +% +% Footnotes inside table cells using \minipage (Oct. 2002) +% Georgia fixed bug in sub-sub-section numbering in paragraphs (July 29th. 2002) +% JS/GM fix to vertical spacing before Proofs (July 30th. 2002) +% +% Made the Permission Statement / Conference Info / Copyright Info +% 'user definable' in the source .tex file OR automatic if +% not specified. +% +% Allowance made to switch default fonts between those systems using +% normal/modern font names and those using 'Type 1' or 'Truetype' fonts. +% See LINE NUMBER 255 for details. +% Also provided for enumerated/annotated Corollaries 'surrounded' by +% enumerated Theorems (line 848). +% Gerry November 11th. 1999 +% +% ---- End of 'updates' ---- +% +\def\fileversion{v2.5} % for ACM's tracking purposes +\def\filedate{May 23, 2012} % Gerry Murray's tracking data +\def\docdate {Wednesday 23rd. May 2012} % Gerry Murray (with deltas to doc} +\usepackage{epsfig} +\usepackage{amssymb} +\usepackage{amsmath} +\usepackage{amsfonts} +% Need this for accents in Arial/Helvetica +%\usepackage[T1]{fontenc} % Gerry March 12, 2007 - causes Type 3 problems (body text) +%\usepackage{textcomp} +% +% SIG-ALTERNATE DOCUMENT STYLE +% G.K.M. Tobin August-October 1999 +% adapted from ARTICLE document style by Ken Traub, Olin Shivers +% also using elements of esub2acm.cls +% HEAVILY MODIFIED, SUBSEQUENTLY, BY GERRY MURRAY 2000 +% ARTICLE DOCUMENT STYLE -- Released 16 March 1988 +% for LaTeX version 2.09 +% Copyright (C) 1988 by Leslie Lamport +% +% +%%% sig-alternate.cls is an 'ALTERNATE' document style for producing +%%% two-column camera-ready pages for ACM conferences. +%%% THIS FILE DOES NOT STRICTLY ADHERE TO THE SIGS (BOARD-ENDORSED) +%%% PROCEEDINGS STYLE. It has been designed to produce a 'tighter' +%%% paper in response to concerns over page budgets. +%%% The main features of this style are: +%%% +%%% 1) Two columns. +%%% 2) Side and top margins of 4.5pc, bottom margin of 6pc, column gutter of +%%% 2pc, hence columns are 20pc wide and 55.5pc tall. (6pc =3D 1in, approx) +%%% 3) First page has title information, and an extra 6pc of space at the +%%% bottom of the first column for the ACM copyright notice. +%%% 4) Text is 9pt on 10pt baselines; titles (except main) are 9pt bold. +%%% +%%% +%%% There are a few restrictions you must observe: +%%% +%%% 1) You cannot change the font size; ACM wants you to use 9pt. +%%% 3) You must start your paper with the \maketitle command. Prior to the +%%% \maketitle you must have \title and \author commands. If you have a +%%% \date command it will be ignored; no date appears on the paper, since +%%% the proceedings will have a date on the front cover. +%%% 4) Marginal paragraphs, tables of contents, lists of figures and tables, +%%% and page headings are all forbidden. +%%% 5) The `figure' environment will produce a figure one column wide; if you +%%% want one that is two columns wide, use `figure*'. +%%% +% +%%% Copyright Space: +%%% This style automatically reserves 1" blank space at the bottom of page 1/ +%%% column 1. This space can optionally be filled with some text using the +%%% \toappear{...} command. If used, this command must be BEFORE the \maketitle +%%% command. If this command is defined AND [preprint] is on, then the +%%% space is filled with the {...} text (at the bottom); otherwise, it is +%%% blank. If you use \toappearbox{...} instead of \toappear{...} then a +%%% box will be drawn around the text (if [preprint] is on). +%%% +%%% A typical usage looks like this: +%%% \toappear{To appear in the Ninth AES Conference on Medievil Lithuanian +%%% Embalming Technique, June 1991, Alfaretta, Georgia.} +%%% This will be included in the preprint, and left out of the conference +%%% version. +%%% +%%% WARNING: +%%% Some dvi-ps converters heuristically allow chars to drift from their +%%% true positions a few pixels. This may be noticeable with the 9pt sans-serif +%%% bold font used for section headers. +%%% You may turn this hackery off via the -e option: +%%% dvips -e 0 foo.dvi >foo.ps +%%% +\typeout{Document Class 'sig-alternate' <23rd. May '12>. Modified by G.K.M. Tobin/Gerry Murray} +\typeout{Based in part upon document Style `acmconf' <22 May 89>. Hacked 4/91 by} +\typeout{shivers@cs.cmu.edu, 4/93 by theobald@cs.mcgill.ca} +\typeout{Excerpts were taken from (Journal Style) 'esub2acm.cls'.} +\typeout{****** Bugs/comments/suggestions/technicalities to Gerry Murray -- murray@hq.acm.org ******} +\typeout{Questions on the style, SIGS policies, etc. to Adrienne Griscti griscti@acm.org} +\oddsidemargin 4.5pc +\evensidemargin 4.5pc +\advance\oddsidemargin by -1in % Correct for LaTeX gratuitousness +\advance\evensidemargin by -1in % Correct for LaTeX gratuitousness +\marginparwidth 0pt % Margin pars are not allowed. +\marginparsep 11pt % Horizontal space between outer margin and + % marginal note + + % Top of page: +\topmargin 4.5pc % Nominal distance from top of page to top of + % box containing running head. +\advance\topmargin by -1in % Correct for LaTeX gratuitousness +\headheight 0pt % Height of box containing running head. +\headsep 0pt % Space between running head and text. + % Bottom of page: +\footskip 30pt % Distance from baseline of box containing foot + % to baseline of last line of text. +\@ifundefined{footheight}{\newdimen\footheight}{}% this is for LaTeX2e +\footheight 12pt % Height of box containing running foot. + +%% Must redefine the top margin so there's room for headers and +%% page numbers if you are using the preprint option. Footers +%% are OK as is. Olin. +\advance\topmargin by -37pt % Leave 37pt above text for headers +\headheight 12pt % Height of box containing running head. +\headsep 25pt % Space between running head and text. + +\textheight 666pt % 9 1/4 column height +\textwidth 42pc % Width of text line. + % For two-column mode: +\columnsep 2pc % Space between columns +\columnseprule 0pt % Width of rule between columns. +\hfuzz 1pt % Allow some variation in column width, otherwise it's + % too hard to typeset in narrow columns. + +\footnotesep 5.6pt % Height of strut placed at the beginning of every + % footnote =3D height of normal \footnotesize strut, + % so no extra space between footnotes. + +\skip\footins 8.1pt plus 4pt minus 2pt % Space between last line of text and + % top of first footnote. +\floatsep 11pt plus 2pt minus 2pt % Space between adjacent floats moved + % to top or bottom of text page. +\textfloatsep 18pt plus 2pt minus 4pt % Space between main text and floats + % at top or bottom of page. +\intextsep 11pt plus 2pt minus 2pt % Space between in-text figures and + % text. +\@ifundefined{@maxsep}{\newdimen\@maxsep}{}% this is for LaTeX2e +\@maxsep 18pt % The maximum of \floatsep, + % \textfloatsep and \intextsep (minus + % the stretch and shrink). +\dblfloatsep 11pt plus 2pt minus 2pt % Same as \floatsep for double-column + % figures in two-column mode. +\dbltextfloatsep 18pt plus 2pt minus 4pt% \textfloatsep for double-column + % floats. +\@ifundefined{@dblmaxsep}{\newdimen\@dblmaxsep}{}% this is for LaTeX2e +\@dblmaxsep 18pt % The maximum of \dblfloatsep and + % \dbltexfloatsep. +\@fptop 0pt plus 1fil % Stretch at top of float page/column. (Must be + % 0pt plus ...) +\@fpsep 8pt plus 2fil % Space between floats on float page/column. +\@fpbot 0pt plus 1fil % Stretch at bottom of float page/column. (Must be + % 0pt plus ... ) +\@dblfptop 0pt plus 1fil % Stretch at top of float page. (Must be 0pt plus ...) +\@dblfpsep 8pt plus 2fil % Space between floats on float page. +\@dblfpbot 0pt plus 1fil % Stretch at bottom of float page. (Must be + % 0pt plus ... ) +\marginparpush 5pt % Minimum vertical separation between two marginal + % notes. + +\parskip 0pt plus 1pt % Extra vertical space between paragraphs. +\parindent 9pt % GM July 2000 / was 0pt - width of paragraph indentation. +\partopsep 2pt plus 1pt minus 1pt% Extra vertical space, in addition to + % \parskip and \topsep, added when user + % leaves blank line before environment. + +\@lowpenalty 51 % Produced by \nopagebreak[1] or \nolinebreak[1] +\@medpenalty 151 % Produced by \nopagebreak[2] or \nolinebreak[2] +\@highpenalty 301 % Produced by \nopagebreak[3] or \nolinebreak[3] + +\@beginparpenalty -\@lowpenalty % Before a list or paragraph environment. +\@endparpenalty -\@lowpenalty % After a list or paragraph environment. +\@itempenalty -\@lowpenalty % Between list items. + +%\@namedef{ds@10pt}{\@latexerr{The `10pt' option is not allowed in the `acmconf' +\@namedef{ds@10pt}{\ClassError{The `10pt' option is not allowed in the `acmconf' % January 2008 + document style.}\@eha} +%\@namedef{ds@11pt}{\@latexerr{The `11pt' option is not allowed in the `acmconf' +\@namedef{ds@11pt}{\ClassError{The `11pt' option is not allowed in the `acmconf' % January 2008 + document style.}\@eha} +%\@namedef{ds@12pt}{\@latexerr{The `12pt' option is not allowed in the `acmconf' +\@namedef{ds@12pt}{\ClassError{The `12pt' option is not allowed in the `acmconf' % January 2008 + document style.}\@eha} + +\@options + +\lineskip 2pt % \lineskip is 1pt for all font sizes. +\normallineskip 2pt +\def\baselinestretch{1} + +\abovedisplayskip 9pt plus2pt minus4.5pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus3pt% +\belowdisplayshortskip 5.4pt plus3pt minus3pt% +\let\@listi\@listI % Setting of \@listi added 9 Jun 87 + +\def\small{\@setsize\small{9pt}\viiipt\@viiipt +\abovedisplayskip 7.6pt plus 3pt minus 4pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus2pt% +\belowdisplayshortskip 3.6pt plus2pt minus 2pt +\def\@listi{\leftmargin\leftmargini %% Added 22 Dec 87 +\topsep 4pt plus 2pt minus 2pt\parsep 2pt plus 1pt minus 1pt +\itemsep \parsep}} + +\def\footnotesize{\@setsize\footnotesize{9pt}\ixpt\@ixpt +\abovedisplayskip 6.4pt plus 2pt minus 4pt% +\belowdisplayskip \abovedisplayskip +\abovedisplayshortskip \z@ plus 1pt% +\belowdisplayshortskip 2.7pt plus 1pt minus 2pt +\def\@listi{\leftmargin\leftmargini %% Added 22 Dec 87 +\topsep 3pt plus 1pt minus 1pt\parsep 2pt plus 1pt minus 1pt +\itemsep \parsep}} + +\newcount\aucount +\newcount\originalaucount +\newdimen\auwidth +\auwidth=\textwidth +\newdimen\auskip +\newcount\auskipcount +\newdimen\auskip +\global\auskip=1pc +\newdimen\allauboxes +\allauboxes=\auwidth +\newtoks\addauthors +\newcount\addauflag +\global\addauflag=0 %Haven't shown additional authors yet + +\newtoks\subtitletext +\gdef\subtitle#1{\subtitletext={#1}} + +\gdef\additionalauthors#1{\addauthors={#1}} + +\gdef\numberofauthors#1{\global\aucount=#1 +\ifnum\aucount>3\global\originalaucount=\aucount \global\aucount=3\fi %g} % 3 OK - Gerry March 2007 +\global\auskipcount=\aucount\global\advance\auskipcount by 1 +\global\multiply\auskipcount by 2 +\global\multiply\auskip by \auskipcount +\global\advance\auwidth by -\auskip +\global\divide\auwidth by \aucount} + +% \and was modified to count the number of authors. GKMT 12 Aug 1999 +\def\alignauthor{% % \begin{tabular} +\end{tabular}% + \begin{tabular}[t]{p{\auwidth}}\centering}% + +% *** NOTE *** NOTE *** NOTE *** NOTE *** +% If you have 'font problems' then you may need +% to change these, e.g. 'arialb' instead of "arialbd". +% Gerry Murray 11/11/1999 +% *** OR ** comment out block A and activate block B or vice versa. +% ********************************************** +% +% -- Start of block A -- (Type 1 or Truetype fonts) +%\newfont{\secfnt}{timesbd at 12pt} % was timenrb originally - now is timesbd +%\newfont{\secit}{timesbi at 12pt} %13 Jan 00 gkmt +%\newfont{\subsecfnt}{timesi at 11pt} % was timenrri originally - now is timesi +%\newfont{\subsecit}{timesbi at 11pt} % 13 Jan 00 gkmt -- was times changed to timesbi gm 2/4/2000 +% % because "normal" is italic, "italic" is Roman +%\newfont{\ttlfnt}{arialbd at 18pt} % was arialb originally - now is arialbd +%\newfont{\ttlit}{arialbi at 18pt} % 13 Jan 00 gkmt +%\newfont{\subttlfnt}{arial at 14pt} % was arialr originally - now is arial +%\newfont{\subttlit}{ariali at 14pt} % 13 Jan 00 gkmt +%\newfont{\subttlbf}{arialbd at 14pt} % 13 Jan 00 gkmt +%\newfont{\aufnt}{arial at 12pt} % was arialr originally - now is arial +%\newfont{\auit}{ariali at 12pt} % 13 Jan 00 gkmt +%\newfont{\affaddr}{arial at 10pt} % was arialr originally - now is arial +%\newfont{\affaddrit}{ariali at 10pt} %13 Jan 00 gkmt +%\newfont{\eaddfnt}{arial at 12pt} % was arialr originally - now is arial +%\newfont{\ixpt}{times at 9pt} % was timenrr originally - now is times +%\newfont{\confname}{timesi at 8pt} % was timenrri - now is timesi +%\newfont{\crnotice}{times at 8pt} % was timenrr originally - now is times +%\newfont{\ninept}{times at 9pt} % was timenrr originally - now is times + +% ********************************************* +% -- End of block A -- +% +% +% -- Start of block B -- UPDATED FONT NAMES +% ********************************************* +% Gerry Murray 11/30/2006 +% ********************************************* +\newfont{\secfnt}{ptmb8t at 12pt} +\newfont{\secit}{ptmbi8t at 12pt} %13 Jan 00 gkmt +\newfont{\subsecfnt}{ptmri8t at 11pt} +\newfont{\subsecit}{ptmbi8t at 11pt} % +\newfont{\ttlfnt}{phvb8t at 18pt} +\newfont{\ttlit}{phvbo8t at 18pt} % GM 2/4/2000 +\newfont{\subttlfnt}{phvr8t at 14pt} +\newfont{\subttlit}{phvro8t at 14pt} % GM 2/4/2000 +\newfont{\subttlbf}{phvb8t at 14pt} % 13 Jan 00 gkmt +\newfont{\aufnt}{phvr8t at 12pt} +\newfont{\auit}{phvro8t at 12pt} % GM 2/4/2000 +\newfont{\affaddr}{phvr8t at 10pt} +\newfont{\affaddrit}{phvro8t at 10pt} % GM 2/4/2000 +\newfont{\eaddfnt}{phvr8t at 12pt} +\newfont{\ixpt}{ptmr8t at 9pt} +\newfont{\confname}{ptmri8t at 8pt} +\newfont{\crnotice}{ptmr8t at 8pt} +\newfont{\ninept}{ptmr8t at 9pt} +% +++++++++++++++++++++++++++++++++++++++++++++ +% -- End of block B -- + +%\def\email#1{{{\eaddfnt{\vskip 4pt#1}}}} +% If we have an email, inside a "shared affiliation" then we need the following instead +\def\email#1{{{\eaddfnt{\par #1}}}} % revised - GM - 11/30/2006 + +\def\addauthorsection{\ifnum\originalaucount>6 % was 3 - Gerry March 2007 + \section{Additional Authors}\the\addauthors + \fi} + +\newcount\savesection +\newcount\sectioncntr +\global\sectioncntr=1 + +\setcounter{secnumdepth}{3} + +\def\appendix{\par +\section*{APPENDIX} +\setcounter{section}{0} + \setcounter{subsection}{0} + \def\thesection{\Alph{section}} } + +\leftmargini 22.5pt +\leftmarginii 19.8pt % > \labelsep + width of '(m)' +\leftmarginiii 16.8pt % > \labelsep + width of 'vii.' +\leftmarginiv 15.3pt % > \labelsep + width of 'M.' +\leftmarginv 9pt +\leftmarginvi 9pt + +\leftmargin\leftmargini +\labelsep 4.5pt +\labelwidth\leftmargini\advance\labelwidth-\labelsep + +\def\@listI{\leftmargin\leftmargini \parsep 3.6pt plus 2pt minus 1pt% +\topsep 7.2pt plus 2pt minus 4pt% +\itemsep 3.6pt plus 2pt minus 1pt} + +\let\@listi\@listI +\@listi + +\def\@listii{\leftmargin\leftmarginii + \labelwidth\leftmarginii\advance\labelwidth-\labelsep + \topsep 3.6pt plus 2pt minus 1pt + \parsep 1.8pt plus 0.9pt minus 0.9pt + \itemsep \parsep} + +\def\@listiii{\leftmargin\leftmarginiii + \labelwidth\leftmarginiii\advance\labelwidth-\labelsep + \topsep 1.8pt plus 0.9pt minus 0.9pt + \parsep \z@ \partopsep 1pt plus 0pt minus 1pt + \itemsep \topsep} + +\def\@listiv{\leftmargin\leftmarginiv + \labelwidth\leftmarginiv\advance\labelwidth-\labelsep} + +\def\@listv{\leftmargin\leftmarginv + \labelwidth\leftmarginv\advance\labelwidth-\labelsep} + +\def\@listvi{\leftmargin\leftmarginvi + \labelwidth\leftmarginvi\advance\labelwidth-\labelsep} + +\def\labelenumi{\theenumi.} +\def\theenumi{\arabic{enumi}} + +\def\labelenumii{(\theenumii)} +\def\theenumii{\alph{enumii}} +\def\p@enumii{\theenumi} + +\def\labelenumiii{\theenumiii.} +\def\theenumiii{\roman{enumiii}} +\def\p@enumiii{\theenumi(\theenumii)} + +\def\labelenumiv{\theenumiv.} +\def\theenumiv{\Alph{enumiv}} +\def\p@enumiv{\p@enumiii\theenumiii} + +\def\labelitemi{$\bullet$} +\def\labelitemii{\bf --} +\def\labelitemiii{$\ast$} +\def\labelitemiv{$\cdot$} + +\def\verse{\let\\=\@centercr + \list{}{\itemsep\z@ \itemindent -1.5em\listparindent \itemindent + \rightmargin\leftmargin\advance\leftmargin 1.5em}\item[]} +\let\endverse\endlist + +\def\quotation{\list{}{\listparindent 1.5em + \itemindent\listparindent + \rightmargin\leftmargin \parsep 0pt plus 1pt}\item[]} +\let\endquotation=\endlist + +\def\quote{\list{}{\rightmargin\leftmargin}\item[]} +\let\endquote=\endlist + +\def\descriptionlabel#1{\hspace\labelsep \bf #1} +\def\description{\list{}{\labelwidth\z@ \itemindent-\leftmargin + \let\makelabel\descriptionlabel}} + +\let\enddescription\endlist + +\def\theequation{\arabic{equation}} + +\arraycolsep 4.5pt % Half the space between columns in an array environment. +\tabcolsep 5.4pt % Half the space between columns in a tabular environment. +\arrayrulewidth .5pt % Width of rules in array and tabular environment. % (was .4) updated Gerry March 20 2007 +\doublerulesep 1.8pt % Space between adjacent rules in array or tabular env. + +\tabbingsep \labelsep % Space used by the \' command. (See LaTeX manual.) + +\skip\@mpfootins =\skip\footins + +\fboxsep =2.7pt % Space left between box and text by \fbox and \framebox. +\fboxrule =.5pt % Width of rules in box made by \fbox and \framebox. % (was .4) updated Gerry March 20 2007 + +\def\thepart{\Roman{part}} % Roman numeral part numbers. +\def\thesection {\arabic{section}} +\def\thesubsection {\thesection.\arabic{subsection}} +%\def\thesubsubsection {\thesubsection.\arabic{subsubsection}} % GM 7/30/2002 +%\def\theparagraph {\thesubsubsection.\arabic{paragraph}} % GM 7/30/2002 +\def\thesubparagraph {\theparagraph.\arabic{subparagraph}} + +\def\@pnumwidth{1.55em} +\def\@tocrmarg {2.55em} +\def\@dotsep{4.5} +\setcounter{tocdepth}{3} + +%\def\tableofcontents{\@latexerr{\tableofcontents: Tables of contents are not +% allowed in the `acmconf' document style.}\@eha} + +\def\tableofcontents{\ClassError{% + \string\tableofcontents\space is not allowed in the `acmconf' document % January 2008 + style}\@eha} + +\def\l@part#1#2{\addpenalty{\@secpenalty} + \addvspace{2.25em plus 1pt} % space above part line + \begingroup + \@tempdima 3em % width of box holding part number, used by + \parindent \z@ \rightskip \@pnumwidth %% \numberline + \parfillskip -\@pnumwidth + {\large \bf % set line in \large boldface + \leavevmode % TeX command to enter horizontal mode. + #1\hfil \hbox to\@pnumwidth{\hss #2}}\par + \nobreak % Never break after part entry + \endgroup} + +\def\l@section#1#2{\addpenalty{\@secpenalty} % good place for page break + \addvspace{1.0em plus 1pt} % space above toc entry + \@tempdima 1.5em % width of box holding section number + \begingroup + \parindent \z@ \rightskip \@pnumwidth + \parfillskip -\@pnumwidth + \bf % Boldface. + \leavevmode % TeX command to enter horizontal mode. + \advance\leftskip\@tempdima %% added 5 Feb 88 to conform to + \hskip -\leftskip %% 25 Jan 88 change to \numberline + #1\nobreak\hfil \nobreak\hbox to\@pnumwidth{\hss #2}\par + \endgroup} + + +\def\l@subsection{\@dottedtocline{2}{1.5em}{2.3em}} +\def\l@subsubsection{\@dottedtocline{3}{3.8em}{3.2em}} +\def\l@paragraph{\@dottedtocline{4}{7.0em}{4.1em}} +\def\l@subparagraph{\@dottedtocline{5}{10em}{5em}} + +%\def\listoffigures{\@latexerr{\listoffigures: Lists of figures are not +% allowed in the `acmconf' document style.}\@eha} + +\def\listoffigures{\ClassError{% + \string\listoffigures\space is not allowed in the `acmconf' document % January 2008 + style}\@eha} + +\def\l@figure{\@dottedtocline{1}{1.5em}{2.3em}} + +%\def\listoftables{\@latexerr{\listoftables: Lists of tables are not +% allowed in the `acmconf' document style.}\@eha} +%\let\l@table\l@figure + +\def\listoftables{\ClassError{% + \string\listoftables\space is not allowed in the `acmconf' document % January 2008 + style}\@eha} + \let\l@table\l@figure + +\def\footnoterule{\kern-3\p@ + \hrule width .5\columnwidth % (was .4) updated Gerry March 20 2007 + \kern 2.6\p@} % The \hrule has default height of .4pt % (was .4) updated Gerry March 20 2007 +% ------ +\long\def\@makefntext#1{\noindent +%\hbox to .5em{\hss$^{\@thefnmark}$}#1} % original +\hbox to .5em{\hss\textsuperscript{\@thefnmark}}#1} % C. Clifton / GM Oct. 2nd. 2002 +% ------- + +\long\def\@maketntext#1{\noindent +#1} + +\long\def\@maketitlenotetext#1#2{\noindent + \hbox to 1.8em{\hss$^{#1}$}#2} + +\setcounter{topnumber}{2} +\def\topfraction{.7} +\setcounter{bottomnumber}{1} +\def\bottomfraction{.3} +\setcounter{totalnumber}{3} +\def\textfraction{.2} +\def\floatpagefraction{.5} +\setcounter{dbltopnumber}{2} +\def\dbltopfraction{.7} +\def\dblfloatpagefraction{.5} + +% +\long\def\@makecaption#1#2{ + \vskip \baselineskip + \setbox\@tempboxa\hbox{\textbf{#1: #2}} + \ifdim \wd\@tempboxa >\hsize % IF longer than one line: + \textbf{#1: #2}\par % THEN set as ordinary paragraph. + \else % ELSE center. + \hbox to\hsize{\hfil\box\@tempboxa\hfil}\par + \fi} + +% + +\long\def\@makecaption#1#2{ + \vskip 10pt + \setbox\@tempboxa\hbox{\textbf{#1: #2}} + \ifdim \wd\@tempboxa >\hsize % IF longer than one line: + \textbf{#1: #2}\par % THEN set as ordinary paragraph. + \else % ELSE center. + \hbox to\hsize{\hfil\box\@tempboxa\hfil} + \fi} + +\@ifundefined{figure}{\newcounter {figure}} % this is for LaTeX2e + +\def\fps@figure{tbp} +\def\ftype@figure{1} +\def\ext@figure{lof} +\def\fnum@figure{Figure \thefigure} +\def\figure{\@float{figure}} +%\let\endfigure\end@float +\def\endfigure{\end@float} % Gerry January 2008 +\@namedef{figure*}{\@dblfloat{figure}} +\@namedef{endfigure*}{\end@dblfloat} + +\@ifundefined{table}{\newcounter {table}} % this is for LaTeX2e + +\def\fps@table{tbp} +\def\ftype@table{2} +\def\ext@table{lot} +\def\fnum@table{Table \thetable} +\def\table{\@float{table}} +%\let\endtable\end@float +\def\endtable{\end@float} % Gerry January 2008 +\@namedef{table*}{\@dblfloat{table}} +\@namedef{endtable*}{\end@dblfloat} + +\newtoks\titleboxnotes +\newcount\titleboxnoteflag + +\def\maketitle{\par + \begingroup + \def\thefootnote{\fnsymbol{footnote}} + \def\@makefnmark{\hbox + to 0pt{$^{\@thefnmark}$\hss}} + \twocolumn[\@maketitle] +\@thanks + \endgroup + \setcounter{footnote}{0} + \let\maketitle\relax + \let\@maketitle\relax + \gdef\@thanks{}\gdef\@author{}\gdef\@title{}\gdef\@subtitle{}\let\thanks\relax + \@copyrightspace} + +%% CHANGES ON NEXT LINES +\newif\if@ll % to record which version of LaTeX is in use + +\expandafter\ifx\csname LaTeXe\endcsname\relax % LaTeX2.09 is used +\else% LaTeX2e is used, so set ll to true +\global\@lltrue +\fi + +\if@ll + \NeedsTeXFormat{LaTeX2e} + \ProvidesClass{sig-alternate} [2012/05/23 - V2.5 - based on acmproc.cls V1.3 ] + \RequirePackage{latexsym}% QUERY: are these two really needed? + \let\dooptions\ProcessOptions +\else + \let\dooptions\@options +\fi +%% END CHANGES + +\def\@height{height} +\def\@width{width} +\def\@minus{minus} +\def\@plus{plus} +\def\hb@xt@{\hbox to} +\newif\if@faircopy +\@faircopyfalse +\def\ds@faircopy{\@faircopytrue} + +\def\ds@preprint{\@faircopyfalse} + +\@twosidetrue +\@mparswitchtrue +\def\ds@draft{\overfullrule 5\p@} +%% CHANGE ON NEXT LINE +\dooptions + +\lineskip \p@ +\normallineskip \p@ +\def\baselinestretch{1} +\def\@ptsize{0} %needed for amssymbols.sty + +%% CHANGES ON NEXT LINES +\if@ll% allow use of old-style font change commands in LaTeX2e +\@maxdepth\maxdepth +% +\DeclareOldFontCommand{\rm}{\ninept\rmfamily}{\mathrm} +\DeclareOldFontCommand{\sf}{\normalfont\sffamily}{\mathsf} +\DeclareOldFontCommand{\tt}{\normalfont\ttfamily}{\mathtt} +\DeclareOldFontCommand{\bf}{\normalfont\bfseries}{\mathbf} +\DeclareOldFontCommand{\it}{\normalfont\itshape}{\mathit} +\DeclareOldFontCommand{\sl}{\normalfont\slshape}{\@nomath\sl} +\DeclareOldFontCommand{\sc}{\normalfont\scshape}{\@nomath\sc} +\DeclareRobustCommand*{\cal}{\@fontswitch{\relax}{\mathcal}} +\DeclareRobustCommand*{\mit}{\@fontswitch{\relax}{\mathnormal}} +\fi +% +\if@ll + \renewcommand{\rmdefault}{cmr} % was 'ttm' +% Note! I have also found 'mvr' to work ESPECIALLY well. +% Gerry - October 1999 +% You may need to change your LV1times.fd file so that sc is +% mapped to cmcsc - -for smallcaps -- that is if you decide +% to change {cmr} to {times} above. (Not recommended) + \renewcommand{\@ptsize}{} + \renewcommand{\normalsize}{% + \@setfontsize\normalsize\@ixpt{10.5\p@}%\ninept% + \abovedisplayskip 6\p@ \@plus2\p@ \@minus\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip 6\p@ \@minus 3\p@ + \belowdisplayshortskip 6\p@ \@minus 3\p@ + \let\@listi\@listI + } +\else + \def\@normalsize{%changed next to 9 from 10 + \@setsize\normalsize{9\p@}\ixpt\@ixpt + \abovedisplayskip 6\p@ \@plus2\p@ \@minus\p@ + \belowdisplayskip \abovedisplayskip + \abovedisplayshortskip 6\p@ \@minus 3\p@ + \belowdisplayshortskip 6\p@ \@minus 3\p@ + \let\@listi\@listI + }% +\fi +\if@ll + \newcommand\scriptsize{\@setfontsize\scriptsize\@viipt{8\p@}} + \newcommand\tiny{\@setfontsize\tiny\@vpt{6\p@}} + \newcommand\large{\@setfontsize\large\@xiipt{14\p@}} + \newcommand\Large{\@setfontsize\Large\@xivpt{18\p@}} + \newcommand\LARGE{\@setfontsize\LARGE\@xviipt{20\p@}} + \newcommand\huge{\@setfontsize\huge\@xxpt{25\p@}} + \newcommand\Huge{\@setfontsize\Huge\@xxvpt{30\p@}} +\else + \def\scriptsize{\@setsize\scriptsize{8\p@}\viipt\@viipt} + \def\tiny{\@setsize\tiny{6\p@}\vpt\@vpt} + \def\large{\@setsize\large{14\p@}\xiipt\@xiipt} + \def\Large{\@setsize\Large{18\p@}\xivpt\@xivpt} + \def\LARGE{\@setsize\LARGE{20\p@}\xviipt\@xviipt} + \def\huge{\@setsize\huge{25\p@}\xxpt\@xxpt} + \def\Huge{\@setsize\Huge{30\p@}\xxvpt\@xxvpt} +\fi +\normalsize + +% make aubox hsize/number of authors up to 3, less gutter +% then showbox gutter showbox gutter showbox -- GKMT Aug 99 +\newbox\@acmtitlebox +\def\@maketitle{\newpage + \null + \setbox\@acmtitlebox\vbox{% +\baselineskip 20pt +\vskip 2em % Vertical space above title. + \begin{center} + {\ttlfnt \@title\par} % Title set in 18pt Helvetica (Arial) bold size. + \vskip 1.5em % Vertical space after title. +%This should be the subtitle. +{\subttlfnt \the\subtitletext\par}\vskip 1.25em%\fi + {\baselineskip 16pt\aufnt % each author set in \12 pt Arial, in a + \lineskip .5em % tabular environment + \begin{tabular}[t]{c}\@author + \end{tabular}\par} + \vskip 1.5em % Vertical space after author. + \end{center}} + \dimen0=\ht\@acmtitlebox + \advance\dimen0 by -12.75pc\relax % Increased space for title box -- KBT + \unvbox\@acmtitlebox + \ifdim\dimen0<0.0pt\relax\vskip-\dimen0\fi} + + +\newcount\titlenotecount +\global\titlenotecount=0 +\newtoks\tntoks +\newtoks\tntokstwo +\newtoks\tntoksthree +\newtoks\tntoksfour +\newtoks\tntoksfive + +\def\abstract{ +\ifnum\titlenotecount>0 % was =1 + \insert\footins{% + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + }% + \color@begingroup +\ifnum\titlenotecount=1 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=2 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=3 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=4 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\S$}\rule\z@\footnotesep\ignorespaces\the\tntoksfour\@finalstrut\strutbox}% +\fi +\ifnum\titlenotecount=5 + \@maketntext{% + \raisebox{4pt}{$\ast$}\rule\z@\footnotesep\ignorespaces\the\tntoks\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\dagger$}\rule\z@\footnotesep\ignorespaces\the\tntokstwo\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\ddagger$}\rule\z@\footnotesep\ignorespaces\the\tntoksthree\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\S$}\rule\z@\footnotesep\ignorespaces\the\tntoksfour\par\@finalstrut\strutbox}% +\@maketntext{% + \raisebox{4pt}{$\P$}\rule\z@\footnotesep\ignorespaces\the\tntoksfive\@finalstrut\strutbox}% +\fi + \color@endgroup} %g} +\fi +\setcounter{footnote}{0} +\section*{ABSTRACT}\normalsize%\ninept +} + +\def\endabstract{\if@twocolumn\else\endquotation\fi} + +\def\keywords{\if@twocolumn +\section*{Keywords} +\else \small +\quotation +\fi} + +\def\terms{\if@twocolumn +\section*{General Terms} +\else \small +\quotation +\fi} + +% -- Classification needs to be a bit smart due to optionals - Gerry/Georgia November 2nd. 1999 +\newcount\catcount +\global\catcount=1 + +\def\category#1#2#3{% +\ifnum\catcount=1 +\section*{Categories and Subject Descriptors} +\advance\catcount by 1\else{\unskip; }\fi + \@ifnextchar [{\@category{#1}{#2}{#3}}{\@category{#1}{#2}{#3}[]}% +} + +\def\@category#1#2#3[#4]{% + \begingroup + \let\and\relax + #1 [\textbf{#2}]% + \if!#4!% + \if!#3!\else : #3\fi + \else + :\space + \if!#3!\else #3\kern\z@---\hskip\z@\fi + \textit{#4}% + \fi + \endgroup +} +% + +%%% This section (written by KBT) handles the 1" box in the lower left +%%% corner of the left column of the first page by creating a picture, +%%% and inserting the predefined string at the bottom (with a negative +%%% displacement to offset the space allocated for a non-existent +%%% caption). +%%% +\newtoks\copyrightnotice +\def\ftype@copyrightbox{8} +\def\@copyrightspace{ +\@float{copyrightbox}[b] +\begin{center} +\setlength{\unitlength}{1pc} +\begin{picture}(20,6) %Space for copyright notice +\put(0,-0.95){\crnotice{\@toappear}} +\end{picture} +\end{center} +\end@float} + +\def\@toappear{} % Default setting blank - commands below change this. +\long\def\toappear#1{\def\@toappear{\parbox[b]{20pc}{\baselineskip 9pt#1}}} +\def\toappearbox#1{\def\@toappear{\raisebox{5pt}{\framebox[20pc]{\parbox[b]{19pc}{#1}}}}} + +\newtoks\conf +\newtoks\confinfo +\def\conferenceinfo#1#2{\global\conf={#1}\global\confinfo{#2}} + + +%\def\marginpar{\@latexerr{The \marginpar command is not allowed in the +% `acmconf' document style.}\@eha} + +\def\marginpar{\ClassError{% + \string\marginpar\space is not allowed in the `acmconf' document % January 2008 + style}\@eha} + +\mark{{}{}} % Initializes TeX's marks + +\def\today{\ifcase\month\or + January\or February\or March\or April\or May\or June\or + July\or August\or September\or October\or November\or December\fi + \space\number\day, \number\year} + +\def\@begintheorem#1#2{% + \parskip 0pt % GM July 2000 (for tighter spacing) + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {{\sc #1}\hskip 5\p@\relax#2.}% + ] + \it +} +\def\@opargbegintheorem#1#2#3{% + \parskip 0pt % GM July 2000 (for tighter spacing) + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\sc #1\ #2\ % This mod by Gerry to enumerate corollaries + \setbox\@tempboxa\hbox{(#3)} % and bracket the 'corollary title' + \ifdim \wd\@tempboxa>\z@ % and retain the correct numbering of e.g. theorems + \hskip 5\p@\relax % if they occur 'around' said corollaries. + \box\@tempboxa % Gerry - Nov. 1999. + \fi.}% + ] + \it +} +\newif\if@qeded +\global\@qededfalse + +% -- original +%\def\proof{% +% \vspace{-\parskip} % GM July 2000 (for tighter spacing) +% \global\@qededfalse +% \@ifnextchar[{\@xproof}{\@proof}% +%} +% -- end of original + +% (JSS) Fix for vertical spacing bug - Gerry Murray July 30th. 2002 +\def\proof{% +\vspace{-\lastskip}\vspace{-\parsep}\penalty-51% +\global\@qededfalse +\@ifnextchar[{\@xproof}{\@proof}% +} + +\def\endproof{% + \if@qeded\else\qed\fi + \endtrivlist +} +\def\@proof{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\sc Proof.}% + ] + \ignorespaces +} +\def\@xproof[#1]{% + \trivlist + \item[\hskip 10\p@\hskip \labelsep{\sc Proof #1.}]% + \ignorespaces +} +\def\qed{% + \unskip + \kern 10\p@ + \begingroup + \unitlength\p@ + \linethickness{.4\p@}% + \framebox(6,6){}% + \endgroup + \global\@qededtrue +} + +\def\newdef#1#2{% + \expandafter\@ifdefinable\csname #1\endcsname + {\@definecounter{#1}% + \expandafter\xdef\csname the#1\endcsname{\@thmcounter{#1}}% + \global\@namedef{#1}{\@defthm{#1}{#2}}% + \global\@namedef{end#1}{\@endtheorem}% + }% +} +\def\@defthm#1#2{% + \refstepcounter{#1}% + \@ifnextchar[{\@ydefthm{#1}{#2}}{\@xdefthm{#1}{#2}}% +} +\def\@xdefthm#1#2{% + \@begindef{#2}{\csname the#1\endcsname}% + \ignorespaces +} +\def\@ydefthm#1#2[#3]{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\it #2% +% \savebox\@tempboxa{#3}% + \saveb@x\@tempboxa{#3}% % January 2008 + \ifdim \wd\@tempboxa>\z@ + \ \box\@tempboxa + \fi.% + }]% + \ignorespaces +} +\def\@begindef#1#2{% + \trivlist + \item[% + \hskip 10\p@ + \hskip \labelsep + {\it #1\ \rm #2.}% + ]% +} +\def\theequation{\arabic{equation}} + +\newcounter{part} +\newcounter{section} +\newcounter{subsection}[section] +\newcounter{subsubsection}[subsection] +\newcounter{paragraph}[subsubsection] +\def\thepart{\Roman{part}} +\def\thesection{\arabic{section}} +\def\thesubsection{\thesection.\arabic{subsection}} +\def\thesubsubsection{\thesubsection.\arabic{subsubsection}} %removed \subsecfnt 29 July 2002 gkmt +\def\theparagraph{\thesubsubsection.\arabic{paragraph}} %removed \subsecfnt 29 July 2002 gkmt +\newif\if@uchead +\@ucheadfalse + +%% CHANGES: NEW NOTE +%% NOTE: OK to use old-style font commands below, since they were +%% suitably redefined for LaTeX2e +%% END CHANGES +\setcounter{secnumdepth}{3} +\def\part{% + \@startsection{part}{9}{\z@}{-10\p@ \@plus -4\p@ \@minus -2\p@} + {4\p@}{\normalsize\@ucheadtrue}% +} +\def\section{% + \@startsection{section}{1}{\z@}{-10\p@ \@plus -4\p@ \@minus -2\p@}% GM + {4\p@}{\baselineskip 14pt\secfnt\@ucheadtrue}% +} + +\def\subsection{% + \@startsection{subsection}{2}{\z@}{-8\p@ \@plus -2\p@ \@minus -\p@} + {4\p@}{\secfnt}% +} +\def\subsubsection{% + \@startsection{subsubsection}{3}{\z@}{-8\p@ \@plus -2\p@ \@minus -\p@}% + {4\p@}{\subsecfnt}% +} +%\def\paragraph{% +% \vskip 12pt\@startsection{paragraph}{3}{\z@}{6\p@ \@plus \p@}% original +% {-5\p@}{\subsecfnt}% +%} +% If one wants sections, subsections and subsubsections numbered, +% but not paragraphs, one usually sets secnumepth to 3. +% For that, the "depth" of paragraphs must be given correctly +% in the definition (``4'' instead of ``3'' as second argument +% of @startsection): +\def\paragraph{% + \vskip 12pt\@startsection{paragraph}{4}{\z@}{6\p@ \@plus \p@}% % GM and Wolfgang May - 11/30/06 + {-5\p@}{\subsecfnt}% +} +\let\@period=. +\def\@startsection#1#2#3#4#5#6{% + \if@noskipsec %gkmt, 11 aug 99 + \global\let\@period\@empty + \leavevmode + \global\let\@period.% + \fi + \par % + \@tempskipa #4\relax + \@afterindenttrue + \ifdim \@tempskipa <\z@ + \@tempskipa -\@tempskipa + \@afterindentfalse + \fi + \if@nobreak + \everypar{}% + \else + \addpenalty\@secpenalty + \addvspace\@tempskipa + \fi +\parskip=0pt % GM July 2000 (non numbered) section heads + \@ifstar + {\@ssect{#3}{#4}{#5}{#6}} + {\@dblarg{\@sect{#1}{#2}{#3}{#4}{#5}{#6}}}% +} +\def\@sect#1#2#3#4#5#6[#7]#8{% + \ifnum #2>\c@secnumdepth + \let\@svsec\@empty + \else + \refstepcounter{#1}% + \edef\@svsec{% + \begingroup + %\ifnum#2>2 \noexpand\rm \fi % changed to next 29 July 2002 gkmt + \ifnum#2>2 \noexpand#6 \fi + \csname the#1\endcsname + \endgroup + \ifnum #2=1\relax .\fi + \hskip 1em + }% + \fi + \@tempskipa #5\relax + \ifdim \@tempskipa>\z@ + \begingroup + #6\relax + \@hangfrom{\hskip #3\relax\@svsec}% + \begingroup + \interlinepenalty \@M + \if@uchead + \uppercase{#8}% + \else + #8% + \fi + \par + \endgroup + \endgroup + \csname #1mark\endcsname{#7}% + \vskip -12pt %gkmt, 11 aug 99 and GM July 2000 (was -14) - numbered section head spacing +\addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7% + }% + \else + \def\@svsechd{% + #6% + \hskip #3\relax + \@svsec + \if@uchead + \uppercase{#8}% + \else + #8% + \fi + \csname #1mark\endcsname{#7}% + \addcontentsline{toc}{#1}{% + \ifnum #2>\c@secnumdepth \else + \protect\numberline{\csname the#1\endcsname}% + \fi + #7% + }% + }% + \fi + \@xsect{#5}\hskip 1pt + \par +} +\def\@xsect#1{% + \@tempskipa #1\relax + \ifdim \@tempskipa>\z@ + \par + \nobreak + \vskip \@tempskipa + \@afterheading + \else + \global\@nobreakfalse + \global\@noskipsectrue + \everypar{% + \if@noskipsec + \global\@noskipsecfalse + \clubpenalty\@M + \hskip -\parindent + \begingroup + \@svsechd + \@period + \endgroup + \unskip + \@tempskipa #1\relax + \hskip -\@tempskipa + \else + \clubpenalty \@clubpenalty + \everypar{}% + \fi + }% + \fi + \ignorespaces +} +\def\@trivlist{% + \@topsepadd\topsep + \if@noskipsec + \global\let\@period\@empty + \leavevmode + \global\let\@period.% + \fi + \ifvmode + \advance\@topsepadd\partopsep + \else + \unskip + \par + \fi + \if@inlabel + \@noparitemtrue + \@noparlisttrue + \else + \@noparlistfalse + \@topsep\@topsepadd + \fi + \advance\@topsep \parskip + \leftskip\z@skip + \rightskip\@rightskip + \parfillskip\@flushglue + \@setpar{\if@newlist\else{\@@par}\fi} + \global\@newlisttrue + \@outerparskip\parskip +} + +%%% Actually, 'abbrev' works just fine as the default +%%% Bibliography style. + +\typeout{Using 'Abbrev' bibliography style} +\newcommand\bibyear[2]{% + \unskip\quad\ignorespaces#1\unskip + \if#2..\quad \else \quad#2 \fi +} +\newcommand{\bibemph}[1]{{\em#1}} +\newcommand{\bibemphic}[1]{{\em#1\/}} +\newcommand{\bibsc}[1]{{\sc#1}} +\def\@normalcite{% + \def\@cite##1##2{[##1\if@tempswa , ##2\fi]}% +} +\def\@citeNB{% + \def\@cite##1##2{##1\if@tempswa , ##2\fi}% +} +\def\@citeRB{% + \def\@cite##1##2{##1\if@tempswa , ##2\fi]}% +} +\def\start@cite#1#2{% + \edef\citeauthoryear##1##2##3{% + ###1% + \ifnum#2=\z@ \else\ ###2\fi + }% + \ifnum#1=\thr@@ + \let\@@cite\@citeyear + \else + \let\@@cite\@citenormal + \fi + \@ifstar{\@citeNB\@@cite}{\@normalcite\@@cite}% +} +%\def\cite{\start@cite23} +\DeclareRobustCommand\cite{\start@cite23} % January 2008 +\def\citeNP{\cite*} % No Parentheses e.g. 5 +%\def\citeA{\start@cite10} +\DeclareRobustCommand\citeA{\start@cite10} % January 2008 +\def\citeANP{\citeA*} +%\def\shortcite{\start@cite23} +\DeclareRobustCommand\shortcite{\start@cite23} % January 2008 +\def\shortciteNP{\shortcite*} +%\def\shortciteA{\start@cite20} +\DeclareRobustCommand\shortciteA{\start@cite20} % January 2008 +\def\shortciteANP{\shortciteA*} +%\def\citeyear{\start@cite30} +\DeclareRobustCommand\citeyear{\start@cite30} % January 2008 +\def\citeyearNP{\citeyear*} +%\def\citeN{% +\DeclareRobustCommand\citeN{% % January 2008 + \@citeRB + \def\citeauthoryear##1##2##3{##1\ [##3% + \def\reserved@a{##1}% + \def\citeauthoryear####1####2####3{% + \def\reserved@b{####1}% + \ifx\reserved@a\reserved@b + ####3% + \else + \errmessage{Package acmart Error: author mismatch + in \string\citeN^^J^^J% + See the acmart package documentation for explanation}% + \fi + }% + }% + \@ifstar\@citeyear\@citeyear +} +%\def\shortciteN{% +\DeclareRobustCommand\shortciteN{% % January 2008 + \@citeRB + \def\citeauthoryear##1##2##3{##2\ [##3% + \def\reserved@a{##2}% + \def\citeauthoryear####1####2####3{% + \def\reserved@b{####2}% + \ifx\reserved@a\reserved@b + ####3% + \else + \errmessage{Package acmart Error: author mismatch + in \string\shortciteN^^J^^J% + See the acmart package documentation for explanation}% + \fi + }% + }% + \@ifstar\@citeyear\@citeyear % GM July 2000 +} + +\def\@citenormal{% + \@ifnextchar [{\@tempswatrue\@citex;}% +% original {\@tempswafalse\@citex,[]}% was ; Gerry 2/24/00 +{\@tempswafalse\@citex[]}% % GERRY FIX FOR BABEL 3/20/2009 +} + +\def\@citeyear{% + \@ifnextchar [{\@tempswatrue\@citex,}% +% original {\@tempswafalse\@citex,[]}% +{\@tempswafalse\@citex[]}% % GERRY FIX FOR BABEL 3/20/2009 +} + +\def\@citex#1[#2]#3{% + \let\@citea\@empty + \@cite{% + \@for\@citeb:=#3\do{% + \@citea +% original \def\@citea{#1 }% + \def\@citea{#1, }% % GERRY FIX FOR BABEL 3/20/2009 -- SO THAT YOU GET [1, 2] IN THE BODY TEXT + \edef\@citeb{\expandafter\@iden\@citeb}% + \if@filesw + \immediate\write\@auxout{\string\citation{\@citeb}}% + \fi + \@ifundefined{b@\@citeb}{% + {\bf ?}% + \@warning{% + Citation `\@citeb' on page \thepage\space undefined% + }% + }% + {\csname b@\@citeb\endcsname}% + }% + }{#2}% +} +%\let\@biblabel\@gobble % Dec. 2008 - Gerry +% ---- +\def\@biblabelnum#1{[#1]} % Gerry's solution #1 - for Natbib -- April 2009 +\let\@biblabel=\@biblabelnum % Gerry's solution #1 - for Natbib -- April 2009 +\def\newblock{\relax} % Gerry Dec. 2008 +% --- +\newdimen\bibindent +\setcounter{enumi}{1} +\bibindent=0em +\def\thebibliography#1{% +\ifnum\addauflag=0\addauthorsection\global\addauflag=1\fi + \section[References]{% <=== OPTIONAL ARGUMENT ADDED HERE + {References} % was uppercased but this affects pdf bookmarks (SP/GM October 2004) + {\vskip -9pt plus 1pt} % GM Nov. 2006 / GM July 2000 (for somewhat tighter spacing) + \@mkboth{{\refname}}{{\refname}}% + }% + \list{[\arabic{enumi}]}{% + \settowidth\labelwidth{[#1]}% + \leftmargin\labelwidth + \advance\leftmargin\labelsep + \advance\leftmargin\bibindent + \parsep=0pt\itemsep=1pt % GM July 2000 + \itemindent -\bibindent + \listparindent \itemindent + \usecounter{enumi} + }% + \let\newblock\@empty + \raggedright % GM July 2000 + \sloppy + \sfcode`\.=1000\relax +} + + +\gdef\balancecolumns +{\vfill\eject +\global\@colht=\textheight +\global\ht\@cclv=\textheight +} + +\newcount\colcntr +\global\colcntr=0 +%\newbox\savebox +\newbox\saveb@x % January 2008 + +\gdef \@makecol {% +\global\advance\colcntr by 1 +\ifnum\colcntr>2 \global\colcntr=1\fi + \ifvoid\footins + \setbox\@outputbox \box\@cclv + \else + \setbox\@outputbox \vbox{% +\boxmaxdepth \@maxdepth + \@tempdima\dp\@cclv + \unvbox \@cclv + \vskip-\@tempdima + \vskip \skip\footins + \color@begingroup + \normalcolor + \footnoterule + \unvbox \footins + \color@endgroup + }% + \fi + \xdef\@freelist{\@freelist\@midlist}% + \global \let \@midlist \@empty + \@combinefloats + \ifvbox\@kludgeins + \@makespecialcolbox + \else + \setbox\@outputbox \vbox to\@colht {% +\@texttop + \dimen@ \dp\@outputbox + \unvbox \@outputbox + \vskip -\dimen@ + \@textbottom + }% + \fi + \global \maxdepth \@maxdepth +} +\def\titlenote{\@ifnextchar[\@xtitlenote{\stepcounter\@mpfn +\global\advance\titlenotecount by 1 +\ifnum\titlenotecount=1 + \raisebox{9pt}{$\ast$} +\fi +\ifnum\titlenotecount=2 + \raisebox{9pt}{$\dagger$} +\fi +\ifnum\titlenotecount=3 + \raisebox{9pt}{$\ddagger$} +\fi +\ifnum\titlenotecount=4 +\raisebox{9pt}{$\S$} +\fi +\ifnum\titlenotecount=5 +\raisebox{9pt}{$\P$} +\fi + \@titlenotetext +}} + +\long\def\@titlenotetext#1{\insert\footins{% +\ifnum\titlenotecount=1\global\tntoks={#1}\fi +\ifnum\titlenotecount=2\global\tntokstwo={#1}\fi +\ifnum\titlenotecount=3\global\tntoksthree={#1}\fi +\ifnum\titlenotecount=4\global\tntoksfour={#1}\fi +\ifnum\titlenotecount=5\global\tntoksfive={#1}\fi + \reset@font\footnotesize + \interlinepenalty\interfootnotelinepenalty + \splittopskip\footnotesep + \splitmaxdepth \dp\strutbox \floatingpenalty \@MM + \hsize\columnwidth \@parboxrestore + \protected@edef\@currentlabel{% + }% + \color@begingroup + \color@endgroup}} + +%%%%%%%%%%%%%%%%%%%%%%%%% +\ps@plain +\baselineskip=11pt +\let\thepage\relax % For NO page numbers - GM Nov. 30th. 1999 and July 2000 +\def\setpagenumber#1{\global\setcounter{page}{#1}} +%\pagenumbering{arabic} % Arabic page numbers GM July 2000 +\twocolumn % Double column. +\flushbottom % Even bottom -- alas, does not balance columns at end of document +\pagestyle{plain} + +% Need Copyright Year and Copyright Data to be user definable (in .tex file). +% Gerry Nov. 30th. 1999 +\newtoks\copyrtyr +\newtoks\acmcopyr +\newtoks\boilerplate +\global\acmcopyr={X-XXXXX-XX-X/XX/XX} % Default - 5/11/2001 *** Gerry +\global\copyrtyr={20XX} % Default - 3/3/2003 *** Gerry +\def\CopyrightYear#1{\global\copyrtyr{#1}} +\def\crdata#1{\global\acmcopyr{#1}} +\def\permission#1{\global\boilerplate{#1}} +% +\global\boilerplate={Permission to make digital or hard copies of all or part of this work for personal or classroom use is granted without fee provided that copies are not made or distributed for profit or commercial advantage and that copies bear this notice and the full citation on the first page. To copy otherwise, to republish, to post on servers or to redistribute to lists, requires prior specific permission and/or a fee.} +\newtoks\copyrightetc +\global\copyrightetc{Copyright \the\copyrtyr\ ACM \the\acmcopyr\ ...\$15.00} % Gerry changed to 15 May 2012 +\toappear{\the\boilerplate\par +{\confname{\the\conf}} \the\confinfo\par \the\copyrightetc.} +%\DeclareFixedFont{\altcrnotice}{OT1}{tmr}{m}{n}{8} % << patch needed for accenting e.g. Montreal - Gerry, May 2007 +%\DeclareFixedFont{\altconfname}{OT1}{tmr}{m}{it}{8} % << patch needed for accenting in italicized confname - Gerry, May 2007 +% +%{\altconfname{{\the\conf}}} {\altcrnotice\the\confinfo\par} \the\copyrightetc.} % << Gerry, May 2007 +% +% The following section (i.e. 3 .sty inclusions) was added in May 2007 so as to fix the problems that many +% authors were having with accents. Sometimes accents would occur, but the letter-character would be of a different +% font. Conversely the letter-character font would be correct but, e.g. a 'bar' would appear superimposed on the +% character instead of, say, an unlaut/diaresis. Sometimes the letter-character would NOT appear at all. +% Using [T1]{fontenc} outright was not an option as this caused 99% of the authors to 'produce' a Type-3 (bitmapped) +% PDF file - useless for production. +% +% For proper (font) accenting we NEED these packages to be part of the .cls file i.e. 'ae', 'aecompl' and 'aeguil' +% ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~ +%% This is file `ae.sty' +\def\fileversion{1.3} +\def\filedate{2001/02/12} +\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{ae}[\filedate\space\fileversion\space % GM +% Almost European Computer Modern] % GM - keeping the log file clean(er) +\newif\if@ae@slides \@ae@slidesfalse +\DeclareOption{slides}{\@ae@slidestrue} +\ProcessOptions +\fontfamily{aer} +\RequirePackage[T1]{fontenc} +\if@ae@slides + \renewcommand{\sfdefault}{laess} + \renewcommand{\rmdefault}{laess} % no roman + \renewcommand{\ttdefault}{laett} +\else + \renewcommand{\sfdefault}{aess} + \renewcommand{\rmdefault}{aer} + \renewcommand{\ttdefault}{aett} +\fi +\endinput +%% +%% End of file `ae.sty'. +% +% +\def\fileversion{0.9} +\def\filedate{1998/07/23} +\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{aecompl}[\filedate\space\fileversion\space % GM +%T1 Complements for AE fonts (D. Roegel)] % GM -- keeping the log file clean(er) + +\def\@ae@compl#1{{\fontencoding{T1}\fontfamily{cmr}\selectfont\symbol{#1}}} +\def\guillemotleft{\@ae@compl{19}} +\def\guillemotright{\@ae@compl{20}} +\def\guilsinglleft{\@ae@compl{14}} +\def\guilsinglright{\@ae@compl{15}} +\def\TH{\@ae@compl{222}} +\def\NG{\@ae@compl{141}} +\def\ng{\@ae@compl{173}} +\def\th{\@ae@compl{254}} +\def\DJ{\@ae@compl{208}} +\def\dj{\@ae@compl{158}} +\def\DH{\@ae@compl{208}} +\def\dh{\@ae@compl{240}} +\def\@perthousandzero{\@ae@compl{24}} +\def\textperthousand{\%\@perthousandzero} +\def\textpertenthousand{\%\@perthousandzero\@perthousandzero} +\endinput +% +% +%% This is file `aeguill.sty' +% This file gives french guillemets (and not guillemots!) +% built with the Polish CMR fonts (default), WNCYR fonts, the LASY fonts +% or with the EC fonts. +% This is useful in conjunction with the ae package +% (this package loads the ae package in case it has not been loaded) +% and with or without the french(le) package. +% +% In order to get the guillemets, it is necessary to either type +% \guillemotleft and \guillemotright, or to use an 8 bit encoding +% (such as ISO-Latin1) which selects these two commands, +% or, if you use the french package (but not the frenchle package), +% to type << or >>. +% +% By default, you get the Polish CMR guillemets; if this package is loaded +% with the `cm' option, you get the LASY guillemets; with `ec,' you +% get the EC guillemets, and with `cyr,' you get the cyrillic guillemets. +% +% In verbatim mode, you always get the EC/TT guillemets. +% +% The default option is interesting in conjunction with PDF, +% because there is a Type 1 version of the Polish CMR fonts +% and these guillemets are very close in shape to the EC guillemets. +% There are no free Type 1 versions of the EC fonts. +% +% Support for Polish CMR guillemets was kindly provided by +% Rolf Niepraschk in version 0.99 (2000/05/22). +% Bernd Raichle provided extensive simplifications to the code +% for version 1.00. +% +% This package is released under the LPPL. +% +% Changes: +% Date version +% 2001/04/12 1.01 the frenchle and french package are now distinguished. +% +\def\fileversion{1.01} +\def\filedate{2001/04/12} +\NeedsTeXFormat{LaTeX2e} +%\ProvidesPackage{aeguill}[2001/04/12 1.01 % % GM +%AE fonts with french guillemets (D. Roegel)] % GM - keeping the log file clean(er) +%\RequirePackage{ae} % GM May 2007 - already embedded here + +\newcommand{\@ae@switch}[4]{#4} +\DeclareOption{ec}{\renewcommand\@ae@switch[4]{#1}} +\DeclareOption{cm}{\renewcommand\@ae@switch[4]{#2}} +\DeclareOption{cyr}{\renewcommand\@ae@switch[4]{#3}} +\DeclareOption{pl}{\renewcommand\@ae@switch[4]{#4}} +\ExecuteOptions{pl} +\ProcessOptions + +% +% Load necessary packages +% +\@ae@switch{% ec + % do nothing +}{% cm + \RequirePackage{latexsym}% GM - May 2007 - already 'mentioned as required' up above +}{% cyr + \RequirePackage[OT2,T1]{fontenc}% +}{% pl + \RequirePackage[OT4,T1]{fontenc}% +} + +% The following command will be compared to \frenchname, +% as defined in french.sty and frenchle.sty. +\def\aeguillfrenchdefault{french}% + +\let\guill@verbatim@font\verbatim@font +\def\verbatim@font{\guill@verbatim@font\ecguills{cmtt}% + \let\guillemotleft\@oguills\let\guillemotright\@fguills} + +\begingroup \catcode`\<=13 \catcode`\>=13 +\def\x{\endgroup + \def\ae@lfguill{<<}% + \def\ae@rfguill{>>}% +}\x + +\newcommand{\ecguills}[1]{% + \def\selectguillfont{\fontencoding{T1}\fontfamily{#1}\selectfont}% + \def\@oguills{{\selectguillfont\symbol{19}}}% + \def\@fguills{{\selectguillfont\symbol{20}}}% + } + +\newcommand{\aeguills}{% + \ae@guills + % We redefine \guillemotleft and \guillemotright + % in order to catch them when they are used + % with \DeclareInputText (in latin1.def for instance) + % We use \auxWARNINGi as a safe indicator that french.sty is used. + \gdef\guillemotleft{\ifx\auxWARNINGi\undefined + \@oguills % neither french.sty nor frenchle.sty + \else + \ifx\aeguillfrenchdefault\frenchname + \ae@lfguill % french.sty + \else + \@oguills % frenchle.sty + \fi + \fi}% + \gdef\guillemotright{\ifx\auxWARNINGi\undefined + \@fguills % neither french.sty nor frenchle.sty + \else + \ifx\aeguillfrenchdefault\frenchname + \ae@rfguill % french.sty + \else + \@fguills % frenchle.sty + \fi + \fi}% + } + +% +% Depending on the class option +% define the internal command \ae@guills +\@ae@switch{% ec + \newcommand{\ae@guills}{% + \ecguills{cmr}}% +}{% cm + \newcommand{\ae@guills}{% + \def\selectguillfont{\fontencoding{U}\fontfamily{lasy}% + \fontseries{m}\fontshape{n}\selectfont}% + \def\@oguills{\leavevmode\nobreak + \hbox{\selectguillfont (\kern-.20em(\kern.20em}\nobreak}% + \def\@fguills{\leavevmode\nobreak + \hbox{\selectguillfont \kern.20em)\kern-.2em)}% + \ifdim\fontdimen\@ne\font>\z@\/\fi}}% +}{% cyr + \newcommand{\ae@guills}{% + \def\selectguillfont{\fontencoding{OT2}\fontfamily{wncyr}\selectfont}% + \def\@oguills{{\selectguillfont\symbol{60}}}% + \def\@fguills{{\selectguillfont\symbol{62}}}} +}{% pl + \newcommand{\ae@guills}{% + \def\selectguillfont{\fontencoding{OT4}\fontfamily{cmr}\selectfont}% + \def\@oguills{{\selectguillfont\symbol{174}}}% + \def\@fguills{{\selectguillfont\symbol{175}}}} +} + + +\AtBeginDocument{% + \ifx\GOfrench\undefined + \aeguills + \else + \let\aeguill@GOfrench\GOfrench + \gdef\GOfrench{\aeguill@GOfrench \aeguills}% + \fi + } + +\endinput +% + diff --git a/correctness-model/writeup/speccfg.tex b/correctness-model/writeup/speccfg.tex new file mode 100644 index 0000000..661c778 --- /dev/null +++ b/correctness-model/writeup/speccfg.tex @@ -0,0 +1,17 @@ +\begin{figure} + + +%\paragraph{Default settings} +%\begin{grammar} + +% ::= `=' +%\alt `for' `=' `to' `do' +%\alt `{' `}' +%\alt + +% ::= `;' | + +%\end{grammar} + +\caption{\label{fig:algorithm}\TOOL algorithm} +\end{figure} diff --git a/correctness-model/writeup/specification.tex b/correctness-model/writeup/specification.tex new file mode 100644 index 0000000..6fe0447 --- /dev/null +++ b/correctness-model/writeup/specification.tex @@ -0,0 +1,416 @@ +\mysection{Specification Language Design}\label{sec:specification} + +We begin by overviewing \TOOL's basic approach. The \TOOL +specification language specifies the correctness properties for +concurrent data structures by establishing a correspondence with an +equivalent sequential data structure, which requires: (1) defining the +equivalent sequential data structure; (2) establishing an equivalent +sequential history; (3) relating the behavior of the concurrent +execution to the sequential history; and (4) specifying the +synchronization properties between method invocations. The +specification language has the following key components: + +\mypara{\bf 1. Equivalent Sequential Data Structure:} This component defines a +sequential data structure against which the concurrent data structure +will be checked. + +\mypara{\bf 2. Defining the Equivalent Sequential History:} +For real-world data structures, generally there exist two types of API methods, +\textit{primitive} API methods and \textit{aggregate} API methods. Take +concurrent hashtables as an example, it provides primitive API methods +such as \code{put} and \code{get} that implement the core functionality of the +data structure, and it also has aggregate API methods such +as \code{putAll} that calls primitive API methods internally. From our +experience working with our benchmark set, it is generally possible to +generate a sequential history of primitive API method invocations for +real-world data structures as they generally serialize on a single memory +location --- while it is possible to observe partially completed aggregate +API method invocations. Therefore, our specifications will focus on the +correctness of primitive API methods. + +Borrowing from VYRD~\cite{vyrd} the concept of commit points, we allow +developers to specify \textit{ordering points} --- the specific atomic +operations between method invocation and response events that are used for +ordering method calls. Ordering points are a generalization of the commit +points as they also use memory operations that do not commit the data structure +operation to order method calls. Developers then specify ordering points to +generate the equivalent sequential history. + +\mypara{\bf 3. Specifying Correct Behaviors:} Developers use +the \TOOL specification to provide a set of \textit{side effects} +and \textit{assertions} to describe the desired behavior of each API +method. Side effects capture how a method updates the equivalent +sequential data structure. Assertions include both preconditions and +postconditions which specify what conditions each method must satisfy +before and after the method call, respectively. The specification of +the side effects and assertions may make use of the states of the +equivalent sequential data structure, meaning that these components +can access the internal variables and methods of the equivalent sequential data +structure. Additionally, they can reference the values available at +the method invocation and response, i.e., the parameter values and the +return value. + +\mypara{\bf 4. Synchronization:} The synchronization specification +describes the desired happens before relations between API method +invocations. \TOOL specifications allow developers to specify the +properties at the abstraction of methods. This makes specifications +cleaner, more understandable, and less error-prone because the +properties do not rely on low-level implementation +details. Moreover, \TOOL specifications allow developers to attach +conditions to methods when specifying synchronization properties so +that a method call might synchronize with another only under a +specific condition. For example, consider a spin lock with +a \code{try\_lock()} method, we need to specify that only a +successful \code{try\_lock()} method invocation must synchronize with the +previous \code{unlock()} method invocation. + +Figure~\ref{fig:speccfg} presents the grammar for the \TOOL specification +language. The grammar defines three types of specification annotations: +\textit{structure annotations}, \textit{method annotations}, and +\textit{ordering point annotations}. +In the grammar, \textit{code} means legal C/C++ source code; and +\textit{label} means a legal C/C++ variable name. +Annotations are embedded in C/C++ comments. +This format does not affect the semantics of the original +program and allows for the same source to be used by both a standard C/C++ +compiler to generate production code and for the \TOOL specification compiler to +extract the \TOOL specification from the comments. We discuss these constructs in more detail throughout the remainder of this section. + +\begin{figure}[!tb] +\vspace{-.2cm} +{\scriptsize + \begin{eqnarray*} + \textit{\textbf{structureSpec}} & \rightarrow & \code{"@Structure\_Define"}\\ + && \textit{structureDefine} \ \ \ (\textit{happensBefore})?\\ + \textit{structureDefine} & \rightarrow & +(\code{"@DeclareStruct:"} \ + \textit{code})\text{*}\\ + && \code{"@DeclareVar:"} \ \textit{code}\\ + && \code{"@InitVar:"} \ \textit{code}\\ + && (\code{"@DefineFunc:"} \ \textit{code})\text{*}\\ + \textit{happensBefore} & \rightarrow & \code{"@Happens\_Before:"} \ + (\textit{invocation} \ \code{"->"} \ + \textit{invocation})\textsuperscript{+}\\ + \textit{invocation} & \rightarrow & \textit{label} \ (\ \ \code{"("} \ + \textit{label} \code{")"} \ \ )?\\ + \textit{\textbf{methodSpec}} & \rightarrow & \code{"@Method:"} \ \textit{label}\\ + && \code{"@Ordering\_Point\_Set:"} \ \textit{label} \ (\code{"|"} \ + \textit{label})\text{*}\\ + && (\code{"@HB\_Condition:"} \ \textit{label} \ \code{"::"} \ \textit{code})\text{*}\\ + && (\code{"@ID:"} \ \textit{code})?\\ + && (\code{"@PreCondition:"} \ \textit{code})?\\ + && (\code{"@SideEffect:"} \ \textit{code})?\\ + && (\code{"@PostCondition:"} \ \textit{code})?\\ + \textit{\textbf{potentialOP}} & \rightarrow & \code{"@Potential\_Ordering\_Point:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opCheck}} & \rightarrow & \code{"@Ordering\_Point\_Check:"} \ \textit{code}\\ + && \code{"@Potential\_Ordering\_Point\_Label:"} \ \textit{label}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opLabelCheck}} & \rightarrow & \code{"@Ordering\_Point\_Label\_Check:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{\textbf{opClear}} & \rightarrow & \code{"@Ordering\_Point\_Clear:"} \ \textit{code}\\ + && \code{"@Label:"} \ \ \textit{label}\\ + \textit{code} & \rightarrow & \code{} + \end{eqnarray*}} +\vspace{-.7cm} +\caption{\label{fig:speccfg}Grammar for \TOOL specification language} +\vspace{-.3cm} +\end{figure} + + +\mysubsection{Example} + +To make the \TOOL specification language more concrete, +Figure~\ref{fig:rcuSpecExample} presents the annotated RCU example. We +use ordering points to order the method invocations to construct +the equivalent sequential history for the concurrent execution. We +first specify the ordering points for the \code{read} +and \code{update} methods to define the equivalent sequential +history. For the +\code{read} method, the load access of the \code{node} field in +Line~\ref{line:rcuSpecReadLoad} is the only operation that can be an ordering +point. For the \code{update} method, there exists more than one atomic +operation. However, they only serve as an ordering point when it successfully uses the CAS operation +to update the \code{node} field. Thus, we specify in +Line~\ref{line:rcuSpecUpdateOPBegin} that the CAS operation should be the +ordering point for the update operation when \code{succ} is \code{true}. We +associate the methods with the two ordering points in +Lines~\ref{line:rcuSpecReadInterfaceOPSet} and +\ref{line:rcuSpecUpdateInterfaceOPSet}. + +Next, we specify the equivalent sequential data structure for this RCU implementation. +Line~\ref{line:declVar} declares two integer fields \code{\_data} and +\code{\_version} as the internal states of the equivalent sequential RCU, and +Line~\ref{line:initVar} initializes both variables to \code{0}. + +We then specify the correct behaviors of the equivalent sequential +history by defining the side effects and assertions for +the \code{read} and \code{update} methods. Side effects specify how +to perform the corresponding operation on the equivalent sequential +data structure. For example, +Line~\ref{line:rcuSpecUpdateInterfaceSideEffect} specifies the side +effects of the \code{update} to the sequential states. +Assertions specify properties that should be true of the concurrent data structure execution. +For example, Line~\ref{line:rcuSpecReadInterfacePostCondition} +specifies that the \code{read} method should satisfy the postcondition that the +returned \code{data} and \code{version} fields should have consistent values +as the internal states of the equivalent sequential data structure. + +Our implementation of the RCU data structure is designed to establish +synchronization between the \code{update} method invocation and the later +\code{read} or \code{update} method invocation. This is important, for +example, if a client thread were to update an array index and use the RCU data +structure to communicate the updated index to a second client thread. Without +synchronization, the second client thread may not see the update to the array +index. Besides, the synchronization between two \code{update} calls ensures that +a later \code{read} will see the most updated values. +In order to specify the synchronization, we associate \code{read} and \code{update} methods with method call identifiers +(Lines~\ref{line:rcuSpecReadInterfaceID} and~\ref{line:rcuSpecUpdateInterfaceID}), which for this example is the value of the +\code{this} pointer. +Together these annotations ensure that every +API method call on the same RCU object will have the same method call ID. +Line~\ref{line:rcuSpecHB} then specifies +the synchronization properties for the RCU --- any \code{update} method invocation +should synchronize with all later \code{read} and \code{update} method invocations that have the +same method call identifier as that \code{update} method. This guarantees that +\code{update} calls should synchronize with the \code{read} and \code{update} +calls of the same RCU object. + + +\begin{figure}[h!] +\vspace{-.2cm} +\begin{lstlisting}[xleftmargin=6.0ex] +class RCU { + /** @Structure_Define: + @DeclareVar:/*@ \label{line:declVar} @*/ int _data, _version; + @InitVar:/*@ \label{line:initVar} @*/ _data = 0; _version = 0; + @Happens_Before: Update->Read Update->Update*//*@ \label{line:rcuSpecHB} @*/ + atomic node; + public: + RCU() { + Node *n = new Node; + n->data = 0; + n->version = 0; + atomic_init(&node, n); + } + /** @Interface: Read/*@ \label{line:rcuSpecReadInterfaceLabel} @*/ + @Ordering_Point_Set: Read_Point/*@ \label{line:rcuSpecReadInterfaceOPSet} @*/ + @ID: this/*@ \label{line:rcuSpecReadInterfaceID} @*/ + @PostCondition:/*@ \label{line:rcuSpecReadInterfacePostCondition} @*/ + _data == *data && _version == *version *//*@ \label{line:rcuSpecReadInterfaceEnd} @*/ + void read(int *data, int *version) { + Node *res = node.load(mo_acquire);/*@ \label{line:rcuSpecReadLoad} @*/ + /** @Ordering_Point_Label_Check: true/*@ \label{line:rcuSpecReadOPBegin} @*/ + @Label: Read_Point */ + *data = res->data; + *version = res->version; + } + /** @Interface: Update + @Ordering_Point_Set: Update_Point/*@ \label{line:rcuSpecUpdateInterfaceOPSet} @*/ + @ID: this/*@ \label{line:rcuSpecUpdateInterfaceID} @*/ + @SideEffect: _data = data; _version++; *//*@ \label{line:rcuSpecUpdateInterfaceSideEffect} @*/ + void update(int data) { + bool succ = false; + Node *newNode = new Node;/*@ \label{line:rcuSpecUpdateAlloc} @*/ + Node *prev = node.load(mo_acquire);/*@ \label{line:rcuSpecUpdateLoad} @*/ + do { + newNode->data = data; + newNode->version = prev->version + 1; + succ = node.compare_exchange_strong(prev,/*@\label{line:rcuSpecUpdateCAS} @*/ + newNode, mo_acq_rel, mo_acquire); + /** @Ordering_Point_Label_Check: succ/*@ \label{line:rcuSpecUpdateOPBegin} @*/ + @Label: Update_Point */ + } while (!succ); + } +}; + +\end{lstlisting} +\vspace{-.2cm} +\caption{\label{fig:rcuSpecExample}Annotated RCU specification example} +\vspace{-.3cm} +\end{figure} + +\subsection{Defining the Equivalent Sequential History} + +While defining the equivalent sequential history for concurrent executions is well studied in the context of the +SC memory model, optimizations that developers typically use in the +context of weaker memory models create the following new challenges when +we generate the equivalent sequential history using ordering points. + +\squishlist +\item {\bf Absence of a Meaningful Trace or Total Order:} +For the SC memory model, an execution can be represented by a simple +interleaving of all the memory operations, where each load operation reads from +the last store operation to the same location in the trace. However, under a +relaxed memory model like C/C++11, the interleaving does not uniquely define an +execution because a given load operation can potentially read from many +different store operations in the interleaving. Therefore, we have to rely on +the intrinsic relations between ordering points such as \textit{reads from} and +\textit{modification order} to order method calls. + +\item {\bf Lack of Program Order Preserving Sequential History:} +Moreover, as discussed in Section~\ref{sec:exampleMotivation}, in +general it is not possible to arrange an execution in any totally +ordered sequential history that preserves program order. + +A key insight is that many concurrent data structures' API methods +have a commit point, which is a single memory operation that makes the +update visible to other threads and that also serves as an ordering +point. When two data structure operations have a dependence, it is +often the case that their respective commit points are both +conflicting accesses to the same memory location. In this case, the +modification order provided by C/C++ is sufficient to order these +operations since modification order is guaranteed to be consistent +with the happens before relation (and therefore also the sequenced +before relation). + +For cases where the method calls are independent, such as +a \code{put(X, 1)} followed by a +\code{get(Y)} in a hashtable where \code{X} and \code{Y} are different keys, +the lack of an ordering is not a problem since those methods commute. +\squishend + +\mypara{\bf Ordering Points Annotations:} In many cases, it is not +possible to determine whether a given atomic operation is an ordering +point until later in the execution. For example, +some internal methods may be called by multiple API methods. In this +case, the same atomic operation can be identified as a potential +ordering point for multiple API methods, and each API method later has +a checking annotation to verify whether it was a real ordering +point. Therefore, the \TOOL specification separates the definition of ordering +points as follows: +\squishcount +\item {\code{Potential\_Ordering\_Point} annotation:} The labeling of ordering +points that identifies the location of a potential ordering point. +\item {\code{Ordering\_Point\_Check} annotation:} The checking of ordering +points that checks at a later point whether a potential ordering point was +really an ordering point. +\countend + +These two constructs together identify ordering points. For +example, assume that $A$ is an atomic operation that is potentially an +ordering point under some specific +condition. The developer would then write a +\code{Potential\_Ordering\_Point} annotation with a condition +\code{ConditionA} and a label +\code{LabelA}, and then use the label \code{LabelA} in an +\code{Ordering\_Point\_Check} annotation at a later point. + +The \code{Ordering\_Point\_Label\_Check} annotation combines +the \code{Potential\_Ordering\_Point} and the +\code{Ordering\_Point\_Check} annotations, and makes +specifications simpler for the use case where the ordering point is known immediately. +For example, in Line~\ref{line:rcuSpecReadOPBegin} of +Figure~\ref{fig:rcuSpecExample}, we use the \code{Ordering\_Point\_Label\_Check} annotation to +identify the ordering point for \code{read} because we know the load operation +in Line~\ref{line:rcuSpecReadLoad} is an ordering point at the time it is +executed. + +Some data structure operations may require multiple ordering points. +For example, consider a transaction implementation that first attempts +to lock all of the involved objects (dropping the locks and retrying +if it fails to acquire a lock), performs the updates, and then releases +the locks. To order such transactions in a relaxed memory model, we must consider all of the +locks it acquires rather than just the last lock. Thus, we allow a +method invocation to have more than one ordering point, and the +additional ordering points serve to order the operation with respect to +multiple different memory locations. For the transaction example, it +may be necessary to retry the acquisition of locks. To support this +scenario, the \code{Ordering\_Point\_Clear} annotation removes all +previous ordering points when it satisfies a specific condition. + +Moreover, when an API method calls another API method, they can share ordering points. In +that case, \TOOL requires that at that ordering point, the concurrent data +structure should satisfy the precondition and postcondition of both API methods. + +\subsection{Checking the IO Behavior of Methods} + +With the specified ordering points, \TOOL is able to generate the equivalent +sequential history. Developers then need to define the equivalent sequential +data structure. For example, in Line~\ref{line:declVar} and~\ref{line:initVar} of the annotated RCU example, we use the +\code{Structure\_define} annotation to define the equivalent sequential RCU +by specifying the internal states as two integers, \code{\_version} and \code{\_data}. In the +\code{Structure\_define} annotation, developers can also specify definitions for customized +structs and methods for convenience. We design these annotations in such a way +that developers can +write specifications in C/C++ code such that they do not have to learn a new +specification language. + +After defining the internal states and methods of the +equivalent data structure, developers use the \code{SideEffect} annotation to +define the corresponding sequential API methods, which should contain the action +to be performed on the equivalent sequential data structure. For example, in +Line~\ref{line:rcuSpecUpdateInterfaceSideEffect} of the annotated RCU example, +we use \code{SideEffect} to specify that when we execute the \code{update} +method on the equivalent sequential RCU, we should update the +internal states of \code{\_version} and \code{\_data} accordingly. When +the \code{SideEffect} annotation is omitted for a specific API method, it means +that no side effects will happen on the sequential data structure when that +method is called. Take the annotated RCU as an example, the \code{read} has no +side effects on the equivalent sequential RCU. + +With the well-defined equivalent sequential data structure, developers then relate +the generated equivalent sequential history to the equivalent sequential data +structure. In \TOOL, we allow developers to accomplish this by using the +\code{PreCondition} and \code{PostCondition} annotations to specify the +conditions to be checked before and after the API method appears to happen. +For example, Line~\ref{line:rcuSpecReadInterfaceEnd} in the +annotated RCU example means that when \code{read} appears to happen, it should +return the same value as the current internal variables of the equivalent +sequential RCU. +Note that these two annotations contain legitimate C/C++ +expressions that only access the method call parameters, return value and the +internal states of the equivalent sequential data structure. + +\subsection{Checking Synchronization} + +Under a relaxed memory model, compilers and processors can reorder +memory operations and thus the execution can exhibit counter-intuitive +behaviors. The C/C++11 memory model provides developers with memory ordering that establish synchronization, e.g., \code{acquire}, \code{release}, \code{seq\_cst}. Synchronization +serves to control which reorderings are allowed --- however, +restricting reorderings comes at a runtime cost so developers must +balance complexity against runtime overhead. Checking that data +structures establish proper synchronization is important to ensure +that the data structures can be effectively composed with client code. + +We generalize the notion of happens before to methods as follows. +Method call $c_1$ happens-before method call $c_2$ if the invocation +event of $c_1$ happens before the response event of $c_2$. Note that +by this definition two method calls can both happen before each other +--- an example of this is the \code{barrier} synchronization +construct. With this notion, for example, for a correctly synchronized queue, we want +an enqueue to happen before the corresponding dequeue, which avoids +the synchronization problems discussed earlier in +Section~\ref{sec:introNewChallenges}. + +In order to flexibly express the synchronization between methods, we associate +API methods with method call identifiers (or IDs) and happens-before conditional guard +expressions. The method +call ID is a C/C++ expression that computes a unique ID for the call, and if it +is omitted, a default value is used. For example, in our RCU example in +Figure~\ref{fig:rcuSpecExample}, both the \code{update} and \code{read} methods +have the \code{this} pointer of the corresponding RCU object. +The \code{HB\_Condition} component +associates one happens-before conditional guard expression with a unique label. +For one method, multiple conditional guard expressions are allowed to be +defined, and the conditional guard expression can only access the method +instance's argument values and return value. + +After specifying the +method call IDs and the \code{HB\_Condition} labels, developers +can specify the synchronization as ``\code{\small{method1(HB\_condition1)}} +\code{\small{->}} +\code{\small{method2(HB\_condition2)}}''. When the \code{HB\_condition} is omitted, it +defaults to \code{true}. The semantics of this expression is that all +instances of calls to \code{method1} that satisfy the conditional guard +expression \code{HB\_condition1} should happen-before all later instances (as determined by ordering points) of +calls to \code{method2} that satisfy the conditional guard expression +\code{HB\_condition2} such that both instances shared the same ID. +The ID and happens-before conditional guard expression are important because they +allow developers to impose synchronization only between specific method +invocations under specific conditions. For example, in +Figure~\ref{fig:rcuSpecExample}, Line~\ref{line:rcuSpecHB} specifies two +synchronization rules, which together mean that the +\code{update} should only establish synchronization with later \code{read} and +\code{update} from +the same RCU object under all circumstances. diff --git a/correctness-model/writeup/spell.lst b/correctness-model/writeup/spell.lst new file mode 100644 index 0000000..cc7a0be --- /dev/null +++ b/correctness-model/writeup/spell.lst @@ -0,0 +1,99 @@ +personal_ws-1.1 en 98 +runtime +API +dequeuing +opCheck +overviewing +atomics +PSO +thrd +IRIW +optimizations +atomicity +potentialOP +interleavings +updaters +Paraglider +hb +structureSpec +lookups +Lev +enqueue +resizing +linearizability +lrrr +Amit +cnt +MCS +InitVar +bool +multi +spinlock +trylock +Mellor +decrement +Valeadis +cst +happensBefore +SideEffect +putAll +dequeues +DeclareStruct +MPMC +deque +DefineFunc +methodSpec +STL +lockfree +opLabelCheck +rf +structureDefine +SPSC +sb +sc +hashtables +Cppmem +prev +dequeue +reorderings +VYRD +RW +init +TSO +ConditionA +Crummey +sw +opClear +ccccc +Valeiadis +Relacy +Concurrit +postconditions +iteratively +NDetermin +LabelA +resize +succ +TVLA +acq +nondeterministic +intra +linearizable +PreCondition +DeclareVar +hashtable +boolean +postcondition +PostCondition +CheckFence +enqueues +structs +scalability +struct +opo +newNode +linearization +CAS +RCU +Colvin +dependences diff --git a/correctness-model/writeup/technical.tex b/correctness-model/writeup/technical.tex new file mode 100644 index 0000000..674e37c --- /dev/null +++ b/correctness-model/writeup/technical.tex @@ -0,0 +1 @@ +\section{Technical}\label{sec:technical} -- 2.34.1