\section{Introduction}

Writing correct concurrent programs (multi-threaded or distributed) is
a more difficult task than writing correct sequential programs. The
primary reason for this is that concurrent programs often involve
complex synchronizations.  A {\em synchronization fault\/} occurs when
there is a mismatch between expected and actual synchronizations in the
execution of a concurrent program. Some common examples of
synchronization faults are race conditions and deadlocks. The goal of
our research is to detect and avoid such synchronization faults at
run-time.

The proposed fault avoidance system operates as follows. First, it
allows the computation to proceed while tracing sufficient information
that would allow the same computation to be replayed if necessary. The
system would monitor the computation for specified synchronization
faults. On detecting a synchronization fault, the system rolls back. It
analyzes the stored trace to determine if the synchronization fault
could be avoided by added synchronizations. If this is possible, the
traced computation is replayed with added synchronization. If not, the
system deliberately avoids the same computation while allowing a new
computation to proceed freely.  In section~5, we describe the details
of the envisioned operation of the system and our preliminary design of
the prototype.

Our past work has centered around three areas: modeling concurrent
computations, predicate detection, and predicate control. While each of
these areas is of independent interest in itself, they are neatly
integrated in the fault avoidance system. Sections 2, 3, and 4 describe
the three areas and outline our past and proposed research.  To
emphasize that the areas are of independent interest, as well as of
interest to our fault avoidance system, we have illustrated our work in
each of these areas by two applications. While the first application
is chosen to highlight the independent relevance of the work, the
second application is consistently chosen to be the fault avoidance
system to highlight how the area contributes to the design of
the system.
