This is libitm.info, produced by makeinfo version 5.1 from libitm.texi.

Copyright (C) 2011-2014 Free Software Foundation, Inc.

   Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  A
copy of the license is included in the section entitled "GNU Free
Documentation License".
INFO-DIR-SECTION GNU Libraries
START-INFO-DIR-ENTRY
* libitm: (libitm).                    GNU Transactional Memory Library
END-INFO-DIR-ENTRY

   This manual documents the GNU Transactional Memory Library.

   Copyright (C) 2011-2014 Free Software Foundation, Inc.

   Permission is granted to copy, distribute and/or modify this document
under the terms of the GNU Free Documentation License, Version 1.2 or
any later version published by the Free Software Foundation; with no
Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.  A
copy of the license is included in the section entitled "GNU Free
Documentation License".


File: libitm.info,  Node: Top,  Next: Enabling libitm,  Up: (dir)

Introduction
************

This manual documents the usage and internals of libitm, the GNU
Transactional Memory Library.  It provides transaction support for
accesses to a process' memory, enabling easy-to-use synchronization of
accesses to shared memory by several threads.

* Menu:

* Enabling libitm::            How to enable libitm for your applications.
* C/C++ Language Constructs for TM::
                               Notes on the language-level interface supported
                               by gcc.
* The libitm ABI::             Notes on the external ABI provided by libitm.
* Internals::                  Notes on libitm's internal synchronization.
* GNU Free Documentation License::
                               How you can copy and share this manual.
* Library Index::              Index of this documentation.


File: libitm.info,  Node: Enabling libitm,  Next: C/C++ Language Constructs for TM,  Prev: Top,  Up: Top

1 Enabling libitm
*****************

To activate support for TM in C/C++, the compile-time flag '-fgnu-tm'
must be specified.  This enables TM language-level constructs such as
transaction statements (e.g., '__transaction_atomic', *note C/C++
Language Constructs for TM:: for details).


File: libitm.info,  Node: C/C++ Language Constructs for TM,  Next: The libitm ABI,  Prev: Enabling libitm,  Up: Top

2 C/C++ Language Constructs for TM
**********************************

Transactions are supported in C++ and C in the form of transaction
statements, transaction expressions, and function transactions.  In the
following example, both 'a' and 'b' will be read and the difference will
be written to 'c', all atomically and isolated from other transactions:

     __transaction_atomic { c = a - b; }

   Therefore, another thread can use the following code to concurrently
update 'b' without ever causing 'c' to hold a negative value (and
without having to use other synchronization constructs such as locks or
C++11 atomics):

     __transaction_atomic { if (a > b) b++; }

   GCC follows the Draft Specification of Transactional Language
Constructs for C++ (v1.1)
(https://sites.google.com/site/tmforcplusplus/) in its implementation of
transactions.

   The precise semantics of transactions are defined in terms of the
C++11/C11 memory model (see the specification).  Roughly, transactions
provide synchronization guarantees that are similar to what would be
guaranteed when using a single global lock as a guard for all
transactions.  Note that like other synchronization constructs in C/C++,
transactions rely on a data-race-free program (e.g., a nontransactional
write that is concurrent with a transactional read to the same memory
location is a data race).


File: libitm.info,  Node: The libitm ABI,  Next: Internals,  Prev: C/C++ Language Constructs for TM,  Up: Top

3 The libitm ABI
****************

The ABI provided by libitm is basically equal to the Linux variant of
Intel's current TM ABI specification document (Revision 1.1, May 6 2009)
but with the differences listed in this chapter.  It would be good if
these changes would eventually be merged into a future version of this
specification.  To ease look-up, the following subsections mirror the
structure of this specification.

3.1 [No changes] Objectives
===========================

3.2 [No changes] Non-objectives
===============================

3.3 Library design principles
=============================

3.3.1 [No changes] Calling conventions
--------------------------------------

3.3.2 [No changes] TM library algorithms
----------------------------------------

3.3.3 [No changes] Optimized load and store routines
----------------------------------------------------

3.3.4 [No changes] Aligned load and store routines
--------------------------------------------------

3.3.5 Data logging functions
----------------------------

The memory locations accessed with transactional loads and stores and
the memory locations whose values are logged must not overlap.  This
required separation only extends to the scope of the execution of one
transaction including all the executions of all nested transactions.

   The compiler must be consistent (within the scope of a single
transaction) about which memory locations are shared and which are not
shared with other threads (i.e., data must be accessed either
transactionally or nontransactionally).  Otherwise, non-write-through TM
algorithms would not work.

   For memory locations on the stack, this requirement extends to only
the lifetime of the stack frame that the memory location belongs to (or
the lifetime of the transaction, whichever is shorter).  Thus, memory
that is reused for several stack frames could be target of both data
logging and transactional accesses; however, this is harmless because
these stack frames' lifetimes will end before the transaction finishes.

3.3.6 [No changes] Scatter/gather calls
---------------------------------------

3.3.7 [No changes] Serial and irrevocable mode
----------------------------------------------

3.3.8 [No changes] Transaction descriptor
-----------------------------------------

3.3.9 Store allocation
----------------------

There is no 'getTransaction' function.

3.3.10 [No changes] Naming conventions
--------------------------------------

3.3.11 Function pointer encryption
----------------------------------

Currently, this is not implemented.

3.4 Types and macros list
=========================

'_ITM_codeProperties' has changed, *note Starting a transaction:
txn-code-properties.  '_ITM_srcLocation' is not used.

3.5 Function list
=================

3.5.1 Initialization and finalization functions
-----------------------------------------------

These functions are not part of the ABI.

3.5.2 [No changes] Version checking
-----------------------------------

3.5.3 [No changes] Error reporting
----------------------------------

3.5.4 [No changes] inTransaction call
-------------------------------------

3.5.5 State manipulation functions
----------------------------------

There is no 'getTransaction' function.  Transaction identifiers for
nested transactions will be ordered but not necessarily sequential
(i.e., for a nested transaction's identifier IN and its enclosing
transaction's identifier IE, it is guaranteed that IN >= IE).

3.5.6 [No changes] Source locations
-----------------------------------

3.5.7 Starting a transaction
----------------------------

3.5.7.1 Transaction code properties
...................................

The bit 'hasNoXMMUpdate' is instead called 'hasNoVectorUpdate'.  Iff it
is set, vector register save/restore is not necessary for any target
machine.

   The 'hasNoFloatUpdate' bit ('0x0010') is new.  Iff it is set,
floating point register save/restore is not necessary for any target
machine.

   'undoLogCode' is not supported and a fatal runtime error will be
raised if this bit is set.  It is not properly defined in the ABI why
barriers other than undo logging are not present; Are they not necessary
(e.g., a transaction operating purely on thread-local data) or have they
been omitted by the compiler because it thinks that some kind of global
synchronization (e.g., serial mode) might perform better?  The
specification suggests that the latter might be the case, but the former
seems to be more useful.

   The 'readOnly' bit ('0x4000') is new.  *TODO* Lexical or dynamic
scope?

   'hasNoRetry' is not supported.  If this bit is not set, but
'hasNoAbort' is set, the library can assume that transaction rollback
will not be requested.

   It would be useful if the absence of externally-triggered rollbacks
would be reported for the dynamic scope as well, not just for the
lexical scope ('hasNoAbort').  Without this, a library cannot exploit
this together with flat nesting.

   'exceptionBlock' is not supported because exception blocks are not
used.

3.5.7.2 [No changes] Windows exception state
............................................

3.5.7.3 [No changes] Other machine state
........................................

3.5.7.4 [No changes] Results from beginTransaction
..................................................

3.5.8 Aborting a transaction
----------------------------

'_ITM_rollbackTransaction' is not supported.  '_ITM_abortTransaction' is
supported but the abort reasons 'exceptionBlockAbort', 'TMConflict', and
'userRetry' are not supported.  There are no exception blocks in
general, so the related cases also do not have to be considered.  To
encode '__transaction_cancel [[outer]]', compilers must set the new
'outerAbort' bit ('0x10') additionally to the 'userAbort' bit in the
abort reason.

3.5.9 Committing a transaction
------------------------------

The exception handling (EH) scheme is different.  The Intel ABI requires
the '_ITM_tryCommitTransaction' function that will return even when the
commit failed and will have to be matched with calls to either
'_ITM_abortTransaction' or '_ITM_commitTransaction'.  In contrast, gcc
relies on transactional wrappers for the functions of the Exception
Handling ABI and on one additional commit function (shown below).  This
allows the TM to keep track of EH internally and thus it does not have
to embed the cleanup of EH state into the existing EH code in the
program.  '_ITM_tryCommitTransaction' is not supported.
'_ITM_commitTransactionToId' is also not supported because the
propagation of thrown exceptions will not bypass commits of nested
transactions.

     void _ITM_commitTransactionEH(void *exc_ptr) ITM_REGPARM;
     void *_ITM_cxa_allocate_exception (size_t);
     void _ITM_cxa_throw (void *obj, void *tinfo, void *dest);
     void *_ITM_cxa_begin_catch (void *exc_ptr);
     void _ITM_cxa_end_catch (void);

   '_ITM_commitTransactionEH' must be called to commit a transaction if
an exception could be in flight at this position in the code.  'exc_ptr'
is the current exception or zero if there is no current exception.  The
'_ITM_cxa...' functions are transactional wrappers for the respective
'__cxa...' functions and must be called instead of these in
transactional code.

   To support this EH scheme, libstdc++ needs to provide one additional
function ('_cxa_tm_cleanup'), which is used by the TM to clean up the
exception handling state while rolling back a transaction:

     void __cxa_tm_cleanup (void *unthrown_obj, void *cleanup_exc,
                            unsigned int caught_count);

   'unthrown_obj' is non-null if the program called
'__cxa_allocate_exception' for this exception but did not yet called
'__cxa_throw' for it.  'cleanup_exc' is non-null if the program is
currently processing a cleanup along an exception path but has not
caught this exception yet.  'caught_count' is the nesting depth of
'__cxa_begin_catch' within the transaction (which can be counted by the
TM using '_ITM_cxa_begin_catch' and '_ITM_cxa_end_catch');
'__cxa_tm_cleanup' then performs rollback by essentially performing
'__cxa_end_catch' that many times.

3.5.10 Exception handling support
---------------------------------

Currently, there is no support for functionality like
'__transaction_cancel throw' as described in the C++ TM specification.
Supporting this should be possible with the EH scheme explained
previously because via the transactional wrappers for the EH ABI, the TM
is able to observe and intercept EH.

3.5.11 [No changes] Transition to serial-irrevocable mode
---------------------------------------------------------

3.5.12 [No changes] Data transfer functions
-------------------------------------------

3.5.13 [No changes] Transactional memory copies
-----------------------------------------------

3.5.14 Transactional versions of memmove
----------------------------------------

If either the source or destination memory region is to be accessed
nontransactionally, then source and destination regions must not be
overlapping.  The respective '_ITM_memmove' functions are still
available but a fatal runtime error will be raised if such regions do
overlap.  To support this functionality, the ABI would have to specify
how the intersection of the regions has to be accessed (i.e.,
transactionally or nontransactionally).

3.5.15 [No changes] Transactional versions of memset
----------------------------------------------------

3.5.16 [No changes] Logging functions
-------------------------------------

3.5.17 User-registered commit and undo actions
----------------------------------------------

Commit actions will get executed in the same order in which the
respective calls to '_ITM_addUserCommitAction' happened.  Only
'_ITM_noTransactionId' is allowed as value for the
'resumingTransactionId' argument.  Commit actions get executed after
privatization safety has been ensured.

   Undo actions will get executed in reverse order compared to the order
in which the respective calls to '_ITM_addUserUndoAction' happened.  The
ordering of undo actions w.r.t.  the roll-back of other actions (e.g.,
data transfers or memory allocations) is undefined.

   '_ITM_getThreadnum' is not supported currently because its only
purpose is to provide a thread ID that matches some assumed performance
tuning output, but this output is not part of the ABI nor further
defined by it.

   '_ITM_dropReferences' is not supported currently because its
semantics and the intention behind it is not entirely clear.  The
specification suggests that this function is necessary because of
certain orderings of data transfer undos and the releasing of memory
regions (i.e., privatization).  However, this ordering is never defined,
nor is the ordering of dropping references w.r.t.  other events.

3.5.18 [New] Transactional indirect calls
-----------------------------------------

Indirect calls (i.e., calls through a function pointer) within
transactions should execute the transactional clone of the original
function (i.e., a clone of the original that has been fully instrumented
to use the TM runtime), if such a clone is available.  The runtime
provides two functions to register/deregister clone tables:

     struct clone_entry
     {
       void *orig, *clone;
     };

     void _ITM_registerTMCloneTable (clone_entry *table, size_t entries);
     void _ITM_deregisterTMCloneTable (clone_entry *table);

   Registered tables must be writable by the TM runtime, and must be
live throughout the life-time of the TM runtime.

   *TODO* The intention was always to drop the registration functions
entirely, and create a new ELF Phdr describing the linker-sorted table.
Much like what currently happens for 'PT_GNU_EH_FRAME'.  This work kept
getting bogged down in how to represent the N different code generation
variants.  We clearly needed at least two--SW and HW transactional
clones--but there was always a suggestion of more variants for different
TM assumptions/invariants.

   The compiler can then use two TM runtime functions to perform
indirect calls in transactions:
     void *_ITM_getTMCloneOrIrrevocable (void *function) ITM_REGPARM;
     void *_ITM_getTMCloneSafe (void *function) ITM_REGPARM;

   If there is a registered clone for supplied function, both will
return a pointer to the clone.  If not, the first runtime function will
attempt to switch to serial-irrevocable mode and return the original
pointer, whereas the second will raise a fatal runtime error.

3.5.19 [New] Transactional dynamic memory management
----------------------------------------------------

     void *_ITM_malloc (size_t)
            __attribute__((__malloc__)) ITM_PURE;
     void *_ITM_calloc (size_t, size_t)
            __attribute__((__malloc__)) ITM_PURE;
     void _ITM_free (void *) ITM_PURE;

   These functions are essentially transactional wrappers for 'malloc',
'calloc', and 'free'.  Within transactions, the compiler should replace
calls to the original functions with calls to the wrapper functions.

3.6 [No changes] Future Enhancements to the ABI
===============================================

3.7 Sample code
===============

The code examples might not be correct w.r.t.  the current version of
the ABI, especially everything related to exception handling.

3.8 [New] Memory model
======================

The ABI should define a memory model and the ordering that is guaranteed
for data transfers and commit/undo actions, or at least refer to another
memory model that needs to be preserved.  Without that, the compiler
cannot ensure the memory model specified on the level of the programming
language (e.g., by the C++ TM specification).

   For example, if a transactional load is ordered before another
load/store, then the TM runtime must also ensure this ordering when
accessing shared state.  If not, this might break the kind of
publication safety used in the C++ TM specification.  Likewise, the TM
runtime must ensure privatization safety.


File: libitm.info,  Node: Internals,  Next: GNU Free Documentation License,  Prev: The libitm ABI,  Up: Top

4 Internals
***********

4.1 TM methods and method groups
================================

libitm supports several ways of synchronizing transactions with each
other.  These TM methods (or TM algorithms) are implemented in the form
of subclasses of 'abi_dispatch', which provide methods for transactional
loads and stores as well as callbacks for rollback and commit.  All
methods that are compatible with each other (i.e., that let concurrently
running transactions still synchronize correctly even if different
methods are used) belong to the same TM method group.  Pointers to TM
methods can be obtained using the factory methods prefixed with
'dispatch_' in 'libitm_i.h'.  There are two special methods,
'dispatch_serial' and 'dispatch_serialirr', that are compatible with all
methods because they run transactions completely in serial mode.

4.1.1 TM method life cycle
--------------------------

The state of TM methods does not change after construction, but they do
alter the state of transactions that use this method.  However, because
per-transaction data gets used by several methods, 'gtm_thread' is
responsible for setting an initial state that is useful for all methods.
After that, methods are responsible for resetting/clearing this state on
each rollback or commit (of outermost transactions), so that the
transaction executed next is not affected by the previous transaction.

   There is also global state associated with each method group, which
is initialized and shut down ('method_group::init()' and 'fini()') when
switching between method groups (see 'retry.cc').

4.1.2 Selecting the default method
----------------------------------

The default method that libitm uses for freshly started transactions
(but not necessarily for restarted transactions) can be set via an
environment variable ('ITM_DEFAULT_METHOD'), whose value should be equal
to the name of one of the factory methods returning abi_dispatch
subclasses but without the "dispatch_" prefix (e.g., "serialirr" instead
of 'GTM::dispatch_serialirr()').

   Note that this environment variable is only a hint for libitm and
might not be supported in the future.

4.2 Nesting: flat vs. closed
============================

We support two different kinds of nesting of transactions.  In the case
of _flat nesting_, the nesting structure is flattened and all nested
transactions are subsumed by the enclosing transaction.  In contrast,
with _closed nesting_, nested transactions that have not yet committed
can be rolled back separately from the enclosing transactions; when they
commit, they are subsumed by the enclosing transaction, and their
effects will be finally committed when the outermost transaction
commits.  _Open nesting_ (where nested transactions can commit
independently of the enclosing transactions) are not supported.

   Flat nesting is the default nesting mode, but closed nesting is
supported and used when transactions contain user-controlled aborts
('__transaction_cancel' statements).  We assume that user-controlled
aborts are rare in typical code and used mostly in exceptional
situations.  Thus, it makes more sense to use flat nesting by default to
avoid the performance overhead of the additional checkpoints required
for closed nesting.  User-controlled aborts will correctly abort the
innermost enclosing transaction, whereas the whole (i.e., outermost)
transaction will be restarted otherwise (e.g., when a transaction
encounters data conflicts during optimistic execution).

4.3 Locking conventions
=======================

This section documents the locking scheme and rules for all uses of
locking in libitm.  We have to support serial(-irrevocable) mode, which
is implemented using a global lock as explained next (called the _serial
lock_).  To simplify the overall design, we use the same lock as
catch-all locking mechanism for other infrequent tasks such as
(de)registering clone tables or threads.  Besides the serial lock, there
are _per-method-group locks_ that are managed by specific method groups
(i.e., groups of similar TM concurrency control algorithms), and
lock-like constructs for quiescence-based operations such as ensuring
privatization safety.

   Thus, the actions that participate in the libitm-internal locking are
either _active transactions_ that do not run in serial mode, _serial
transactions_ (which (are about to) run in serial mode), and management
tasks that do not execute within a transaction but have acquired the
serial mode like a serial transaction would do (e.g., to be able to
register threads with libitm).  Transactions become active as soon as
they have successfully used the serial lock to announce this globally
(*note Serial lock implementation: serial-lock-impl.).  Likewise,
transactions become serial transactions as soon as they have acquired
the exclusive rights provided by the serial lock (i.e., serial mode,
which also means that there are no other concurrent active or serial
transactions).  Note that active transactions can become serial
transactions when they enter serial mode during the runtime of the
transaction.

4.3.1 State-to-lock mapping
---------------------------

Application data is protected by the serial lock if there is a serial
transaction and no concurrently running active transaction (i.e.,
non-serial).  Otherwise, application data is protected by the currently
selected method group, which might use per-method-group locks or other
mechanisms.  Also note that application data that is about to be
privatized might not be allowed to be accessed by nontransactional code
until privatization safety has been ensured; the details of this are
handled by the current method group.

   libitm-internal state is either protected by the serial lock or
accessed through custom concurrent code.  The latter applies to the
public/shared part of a transaction object and most typical
method-group-specific state.

   The former category (protected by the serial lock) includes:
   * The list of active threads that have used transactions.
   * The tables that map functions to their transactional clones.
   * The current selection of which method group to use.
   * Some method-group-specific data, or invariants of this data.  For
     example, resetting a method group to its initial state is handled
     by switching to the same method group, so the serial lock protects
     such resetting as well.
   In general, such state is immutable whenever there exists an active
(non-serial) transaction.  If there is no active transaction, a serial
transaction (or a thread that is not currently executing a transaction
but has acquired the serial lock) is allowed to modify this state (but
must of course be careful to not surprise the current method group's
implementation with such modifications).

4.3.2 Lock acquisition order
----------------------------

To prevent deadlocks, locks acquisition must happen in a globally
agreed-upon order.  Note that this applies to other forms of blocking
too, but does not necessarily apply to lock acquisitions that do not
block (e.g., trylock() calls that do not get retried forever).  Note
that serial transactions are never return back to active transactions
until the transaction has committed.  Likewise, active transactions stay
active until they have committed.  Per-method-group locks are typically
also not released before commit.

   Lock acquisition / blocking rules:

   * Transactions must become active or serial before they are allowed
     to use method-group-specific locks or blocking (i.e., the serial
     lock must be acquired before those other locks, either in serial or
     nonserial mode).

   * Any number of threads that do not currently run active transactions
     can block while trying to get the serial lock in exclusive mode.
     Note that active transactions must not block when trying to upgrade
     to serial mode unless there is no other transaction that is trying
     that (the latter is ensured by the serial lock implementation.

   * Method groups must prevent deadlocks on their locks.  In
     particular, they must also be prepared for another active
     transaction that has acquired method-group-specific locks but is
     blocked during an attempt to upgrade to being a serial transaction.
     See below for details.

   * Serial transactions can acquire method-group-specific locks because
     there will be no other active nor serial transaction.

   There is no single rule for per-method-group blocking because this
depends on when a TM method might acquire locks.  If no active
transaction can upgrade to being a serial transaction after it has
acquired per-method-group locks (e.g., when those locks are only
acquired during an attempt to commit), then the TM method does not need
to consider a potential deadlock due to serial mode.

   If there can be upgrades to serial mode after the acquisition of
per-method-group locks, then TM methods need to avoid those deadlocks:
   * When upgrading to a serial transaction, after acquiring exclusive
     rights to the serial lock but before waiting for concurrent active
     transactions to finish (*note Serial lock implementation:
     serial-lock-impl. for details), we have to wake up all active
     transactions waiting on the upgrader's per-method-group locks.
   * Active transactions blocking on per-method-group locks need to
     check the serial lock and abort if there is a pending serial
     transaction.
   * Lost wake-ups have to be prevented (e.g., by changing a bit in each
     per-method-group lock before doing the wake-up, and only blocking
     on this lock using a futex if this bit is not group).

   *TODO*: Can reuse serial lock for gl-*?  And if we can, does it make
sense to introduce further complexity in the serial lock?  For gl-*, we
can really only avoid an abort if we do -wb and -vbv.

4.3.3 Serial lock implementation
--------------------------------

The serial lock implementation is optimized towards assuming that serial
transactions are infrequent and not the common case.  However, the
performance of entering serial mode can matter because when only few
transactions are run concurrently or if there are few threads, then it
can be efficient to run transactions serially.

   The serial lock is similar to a multi-reader-single-writer lock in
that there can be several active transactions but only one serial
transaction.  However, we do want to avoid contention (in the lock
implementation) between active transactions, so we split up the reader
side of the lock into per-transaction flags that are true iff the
transaction is active.  The exclusive writer side remains a shared
single flag, which is acquired using a CAS, for example.  On the
fast-path, the serial lock then works similar to Dekker's algorithm but
with several reader flags that a serial transaction would have to check.
A serial transaction thus requires a list of all threads with
potentially active transactions; we can use the serial lock itself to
protect this list (i.e., only threads that have acquired the serial lock
can modify this list).

   We want starvation-freedom for the serial lock to allow for using it
to ensure progress for potentially starved transactions (*note Progress
Guarantees: progress-guarantees. for details).  However, this is
currently not enforced by the implementation of the serial lock.

   Here is pseudo-code for the read/write fast paths of acquiring the
serial lock (read-to-write upgrade is similar to write_lock:
     // read_lock:
     tx->shared_state |= active;
     __sync_synchronize(); // or STLD membar, or C++0x seq-cst fence
     while (!serial_lock.exclusive)
       if (spinning_for_too_long) goto slowpath;

     // write_lock:
     if (CAS(&serial_lock.exclusive, 0, this) != 0)
       goto slowpath; // writer-writer contention
     // need a membar here, but CAS already has full membar semantics
     bool need_blocking = false;
     for (t: all txns)
       {
         for (;t->shared_state & active;)
           if (spinning_for_too_long) { need_blocking = true; break; }
       }
     if (need_blocking) goto slowpath;

   Releasing a lock in this spin-lock version then just consists of
resetting 'tx->shared_state' to inactive or clearing
'serial_lock.exclusive'.

   However, we can't rely on a pure spinlock because we need to get the
OS involved at some time (e.g., when there are more threads than CPUs to
run on).  Therefore, the real implementation falls back to a blocking
slow path, either based on pthread mutexes or Linux futexes.

4.3.4 Reentrancy
----------------

libitm has to consider the following cases of reentrancy:

   * Transaction calls unsafe code that starts a new transaction: The
     outer transaction will become a serial transaction before executing
     unsafe code.  Therefore, nesting within serial transactions must
     work, even if the nested transaction is called from within
     uninstrumented code.

   * Transaction calls either a transactional wrapper or safe code,
     which in turn starts a new transaction: It is not yet defined in
     the specification whether this is allowed.  Thus, it is undefined
     whether libitm supports this.

   * Code that starts new transactions might be called from within any
     part of libitm: This kind of reentrancy would likely be rather
     complex and can probably be avoided.  Therefore, it is not
     supported.

4.3.5 Privatization safety
--------------------------

Privatization safety is ensured by libitm using a quiescence-based
approach.  Basically, a privatizing transaction waits until all
concurrent active transactions will either have finished (are not active
anymore) or operate on a sufficiently recent snapshot to not access the
privatized data anymore.  This happens after the privatizing transaction
has stopped being an active transaction, so waiting for quiescence does
not contribute to deadlocks.

   In method groups that need to ensure publication safety explicitly,
active transactions maintain a flag or timestamp in the public/shared
part of the transaction descriptor.  Before blocking, privatizers need
to let the other transactions know that they should wake up the
privatizer.

   *TODO* Ho to implement the waiters?  Should those flags be
per-transaction or at a central place?  We want to avoid one wake/wait
call per active transactions, so we might want to use either a tree or
combining to reduce the syscall overhead, or rather spin for a long
amount of time instead of doing blocking.  Also, it would be good if
only the last transaction that the privatizer waits for would do the
wake-up.

4.3.6 Progress guarantees
-------------------------

Transactions that do not make progress when using the current TM method
will eventually try to execute in serial mode.  Thus, the serial lock's
progress guarantees determine the progress guarantees of the whole TM.
Obviously, we at least need deadlock-freedom for the serial lock, but it
would also be good to provide starvation-freedom (informally, all
threads will finish executing a transaction eventually iff they get
enough cycles).

   However, the scheduling of transactions (e.g., thread scheduling by
the OS) also affects the handling of progress guarantees by the TM.
First, the TM can only guarantee deadlock-freedom if threads do not get
stopped.  Likewise, low-priority threads can starve if they do not get
scheduled when other high-priority threads get those cycles instead.

   If all threads get scheduled eventually, correct lock implementations
will provide deadlock-freedom, but might not provide starvation-freedom.
We can either enforce the latter in the TM's lock implementation, or
assume that the scheduling is sufficiently random to yield a
probabilistic guarantee that no thread will starve (because eventually,
a transaction will encounter a scheduling that will allow it to run).
This can indeed work well in practice but is not necessarily guaranteed
to work (e.g., simple spin locks can be pretty efficient).

   Because enforcing stronger progress guarantees in the TM has a higher
runtime overhead, we focus on deadlock-freedom right now and assume that
the threads will get scheduled eventually by the OS (but don't consider
threads with different priorities).  We should support
starvation-freedom for serial transactions in the future.  Everything
beyond that is highly related to proper contention management across all
of the TM (including with TM method to choose), and is future work.

   *TODO* Handling thread priorities: We want to avoid priority
inversion but it's unclear how often that actually matters in practice.
Workloads that have threads with different priorities will likely also
require lower latency or higher throughput for high-priority threads.
Therefore, it probably makes not that much sense (except for eventual
progress guarantees) to use priority inheritance until the TM has
priority-aware contention management.


File: libitm.info,  Node: GNU Free Documentation License,  Next: Library Index,  Prev: Internals,  Up: Top

GNU Free Documentation License
******************************

                     Version 1.3, 3 November 2008

     Copyright (C) 2000, 2001, 2002, 2007, 2008 Free Software Foundation, Inc.
     <http://fsf.org/>

     Everyone is permitted to copy and distribute verbatim copies
     of this license document, but changing it is not allowed.

  0. PREAMBLE

     The purpose of this License is to make a manual, textbook, or other
     functional and useful document "free" in the sense of freedom: to
     assure everyone the effective freedom to copy and redistribute it,
     with or without modifying it, either commercially or
     noncommercially.  Secondarily, this License preserves for the
     author and publisher a way to get credit for their work, while not
     being considered responsible for modifications made by others.

     This License is a kind of "copyleft", which means that derivative
     works of the document must themselves be free in the same sense.
     It complements the GNU General Public License, which is a copyleft
     license designed for free software.

     We have designed this License in order to use it for manuals for
     free software, because free software needs free documentation: a
     free program should come with manuals providing the same freedoms
     that the software does.  But this License is not limited to
     software manuals; it can be used for any textual work, regardless
     of subject matter or whether it is published as a printed book.  We
     recommend this License principally for works whose purpose is
     instruction or reference.

  1. APPLICABILITY AND DEFINITIONS

     This License applies to any manual or other work, in any medium,
     that contains a notice placed by the copyright holder saying it can
     be distributed under the terms of this License.  Such a notice
     grants a world-wide, royalty-free license, unlimited in duration,
     to use that work under the conditions stated herein.  The
     "Document", below, refers to any such manual or work.  Any member
     of the public is a licensee, and is addressed as "you".  You accept
     the license if you copy, modify or distribute the work in a way
     requiring permission under copyright law.

     A "Modified Version" of the Document means any work containing the
     Document or a portion of it, either copied verbatim, or with
     modifications and/or translated into another language.

     A "Secondary Section" is a named appendix or a front-matter section
     of the Document that deals exclusively with the relationship of the
     publishers or authors of the Document to the Document's overall
     subject (or to related matters) and contains nothing that could
     fall directly within that overall subject.  (Thus, if the Document
     is in part a textbook of mathematics, a Secondary Section may not
     explain any mathematics.)  The relationship could be a matter of
     historical connection with the subject or with related matters, or
     of legal, commercial, philosophical, ethical or political position
     regarding them.

     The "Invariant Sections" are certain Secondary Sections whose
     titles are designated, as being those of Invariant Sections, in the
     notice that says that the Document is released under this License.
     If a section does not fit the above definition of Secondary then it
     is not allowed to be designated as Invariant.  The Document may
     contain zero Invariant Sections.  If the Document does not identify
     any Invariant Sections then there are none.

     The "Cover Texts" are certain short passages of text that are
     listed, as Front-Cover Texts or Back-Cover Texts, in the notice
     that says that the Document is released under this License.  A
     Front-Cover Text may be at most 5 words, and a Back-Cover Text may
     be at most 25 words.

     A "Transparent" copy of the Document means a machine-readable copy,
     represented in a format whose specification is available to the
     general public, that is suitable for revising the document
     straightforwardly with generic text editors or (for images composed
     of pixels) generic paint programs or (for drawings) some widely
     available drawing editor, and that is suitable for input to text
     formatters or for automatic translation to a variety of formats
     suitable for input to text formatters.  A copy made in an otherwise
     Transparent file format whose markup, or absence of markup, has
     been arranged to thwart or discourage subsequent modification by
     readers is not Transparent.  An image format is not Transparent if
     used for any substantial amount of text.  A copy that is not
     "Transparent" is called "Opaque".

     Examples of suitable formats for Transparent copies include plain
     ASCII without markup, Texinfo input format, LaTeX input format,
     SGML or XML using a publicly available DTD, and standard-conforming
     simple HTML, PostScript or PDF designed for human modification.
     Examples of transparent image formats include PNG, XCF and JPG.
     Opaque formats include proprietary formats that can be read and
     edited only by proprietary word processors, SGML or XML for which
     the DTD and/or processing tools are not generally available, and
     the machine-generated HTML, PostScript or PDF produced by some word
     processors for output purposes only.

     The "Title Page" means, for a printed book, the title page itself,
     plus such following pages as are needed to hold, legibly, the
     material this License requires to appear in the title page.  For
     works in formats which do not have any title page as such, "Title
     Page" means the text near the most prominent appearance of the
     work's title, preceding the beginning of the body of the text.

     The "publisher" means any person or entity that distributes copies
     of the Document to the public.

     A section "Entitled XYZ" means a named subunit of the Document
     whose title either is precisely XYZ or contains XYZ in parentheses
     following text that translates XYZ in another language.  (Here XYZ
     stands for a specific section name mentioned below, such as
     "Acknowledgements", "Dedications", "Endorsements", or "History".)
     To "Preserve the Title" of such a section when you modify the
     Document means that it remains a section "Entitled XYZ" according
     to this definition.

     The Document may include Warranty Disclaimers next to the notice
     which states that this License applies to the Document.  These
     Warranty Disclaimers are considered to be included by reference in
     this License, but only as regards disclaiming warranties: any other
     implication that these Warranty Disclaimers may have is void and
     has no effect on the meaning of this License.

  2. VERBATIM COPYING

     You may copy and distribute the Document in any medium, either
     commercially or noncommercially, provided that this License, the
     copyright notices, and the license notice saying this License
     applies to the Document are reproduced in all copies, and that you
     add no other conditions whatsoever to those of this License.  You
     may not use technical measures to obstruct or control the reading
     or further copying of the copies you make or distribute.  However,
     you may accept compensation in exchange for copies.  If you
     distribute a large enough number of copies you must also follow the
     conditions in section 3.

     You may also lend copies, under the same conditions stated above,
     and you may publicly display copies.

  3. COPYING IN QUANTITY

     If you publish printed copies (or copies in media that commonly
     have printed covers) of the Document, numbering more than 100, and
     the Document's license notice requires Cover Texts, you must
     enclose the copies in covers that carry, clearly and legibly, all
     these Cover Texts: Front-Cover Texts on the front cover, and
     Back-Cover Texts on the back cover.  Both covers must also clearly
     and legibly identify you as the publisher of these copies.  The
     front cover must present the full title with all words of the title
     equally prominent and visible.  You may add other material on the
     covers in addition.  Copying with changes limited to the covers, as
     long as they preserve the title of the Document and satisfy these
     conditions, can be treated as verbatim copying in other respects.

     If the required texts for either cover are too voluminous to fit
     legibly, you should put the first ones listed (as many as fit
     reasonably) on the actual cover, and continue the rest onto
     adjacent pages.

     If you publish or distribute Opaque copies of the Document
     numbering more than 100, you must either include a machine-readable
     Transparent copy along with each Opaque copy, or state in or with
     each Opaque copy a computer-network location from which the general
     network-using public has access to download using public-standard
     network protocols a complete Transparent copy of the Document, free
     of added material.  If you use the latter option, you must take
     reasonably prudent steps, when you begin distribution of Opaque
     copies in quantity, to ensure that this Transparent copy will
     remain thus accessible at the stated location until at least one
     year after the last time you distribute an Opaque copy (directly or
     through your agents or retailers) of that edition to the public.

     It is requested, but not required, that you contact the authors of
     the Document well before redistributing any large number of copies,
     to give them a chance to provide you with an updated version of the
     Document.

  4. MODIFICATIONS

     You may copy and distribute a Modified Version of the Document
     under the conditions of sections 2 and 3 above, provided that you
     release the Modified Version under precisely this License, with the
     Modified Version filling the role of the Document, thus licensing
     distribution and modification of the Modified Version to whoever
     possesses a copy of it.  In addition, you must do these things in
     the Modified Version:

       A. Use in the Title Page (and on the covers, if any) a title
          distinct from that of the Document, and from those of previous
          versions (which should, if there were any, be listed in the
          History section of the Document).  You may use the same title
          as a previous version if the original publisher of that
          version gives permission.

       B. List on the Title Page, as authors, one or more persons or
          entities responsible for authorship of the modifications in
          the Modified Version, together with at least five of the
          principal authors of the Document (all of its principal
          authors, if it has fewer than five), unless they release you
          from this requirement.

       C. State on the Title page the name of the publisher of the
          Modified Version, as the publisher.

       D. Preserve all the copyright notices of the Document.

       E. Add an appropriate copyright notice for your modifications
          adjacent to the other copyright notices.

       F. Include, immediately after the copyright notices, a license
          notice giving the public permission to use the Modified
          Version under the terms of this License, in the form shown in
          the Addendum below.

       G. Preserve in that license notice the full lists of Invariant
          Sections and required Cover Texts given in the Document's
          license notice.

       H. Include an unaltered copy of this License.

       I. Preserve the section Entitled "History", Preserve its Title,
          and add to it an item stating at least the title, year, new
          authors, and publisher of the Modified Version as given on the
          Title Page.  If there is no section Entitled "History" in the
          Document, create one stating the title, year, authors, and
          publisher of the Document as given on its Title Page, then add
          an item describing the Modified Version as stated in the
          previous sentence.

       J. Preserve the network location, if any, given in the Document
          for public access to a Transparent copy of the Document, and
          likewise the network locations given in the Document for
          previous versions it was based on.  These may be placed in the
          "History" section.  You may omit a network location for a work
          that was published at least four years before the Document
          itself, or if the original publisher of the version it refers
          to gives permission.

       K. For any section Entitled "Acknowledgements" or "Dedications",
          Preserve the Title of the section, and preserve in the section
          all the substance and tone of each of the contributor
          acknowledgements and/or dedications given therein.

       L. Preserve all the Invariant Sections of the Document, unaltered
          in their text and in their titles.  Section numbers or the
          equivalent are not considered part of the section titles.

       M. Delete any section Entitled "Endorsements".  Such a section
          may not be included in the Modified Version.

       N. Do not retitle any existing section to be Entitled
          "Endorsements" or to conflict in title with any Invariant
          Section.

       O. Preserve any Warranty Disclaimers.

     If the Modified Version includes new front-matter sections or
     appendices that qualify as Secondary Sections and contain no
     material copied from the Document, you may at your option designate
     some or all of these sections as invariant.  To do this, add their
     titles to the list of Invariant Sections in the Modified Version's
     license notice.  These titles must be distinct from any other
     section titles.

     You may add a section Entitled "Endorsements", provided it contains
     nothing but endorsements of your Modified Version by various
     parties--for example, statements of peer review or that the text
     has been approved by an organization as the authoritative
     definition of a standard.

     You may add a passage of up to five words as a Front-Cover Text,
     and a passage of up to 25 words as a Back-Cover Text, to the end of
     the list of Cover Texts in the Modified Version.  Only one passage
     of Front-Cover Text and one of Back-Cover Text may be added by (or
     through arrangements made by) any one entity.  If the Document
     already includes a cover text for the same cover, previously added
     by you or by arrangement made by the same entity you are acting on
     behalf of, you may not add another; but you may replace the old
     one, on explicit permission from the previous publisher that added
     the old one.

     The author(s) and publisher(s) of the Document do not by this
     License give permission to use their names for publicity for or to
     assert or imply endorsement of any Modified Version.

  5. COMBINING DOCUMENTS

     You may combine the Document with other documents released under
     this License, under the terms defined in section 4 above for
     modified versions, provided that you include in the combination all
     of the Invariant Sections of all of the original documents,
     unmodified, and list them all as Invariant Sections of your
     combined work in its license notice, and that you preserve all
     their Warranty Disclaimers.

     The combined work need only contain one copy of this License, and
     multiple identical Invariant Sections may be replaced with a single
     copy.  If there are multiple Invariant Sections with the same name
     but different contents, make the title of each such section unique
     by adding at the end of it, in parentheses, the name of the
     original author or publisher of that section if known, or else a
     unique number.  Make the same adjustment to the section titles in
     the list of Invariant Sections in the license notice of the
     combined work.

     In the combination, you must combine any sections Entitled
     "History" in the various original documents, forming one section
     Entitled "History"; likewise combine any sections Entitled
     "Acknowledgements", and any sections Entitled "Dedications".  You
     must delete all sections Entitled "Endorsements."

  6. COLLECTIONS OF DOCUMENTS

     You may make a collection consisting of the Document and other
     documents released under this License, and replace the individual
     copies of this License in the various documents with a single copy
     that is included in the collection, provided that you follow the
     rules of this License for verbatim copying of each of the documents
     in all other respects.

     You may extract a single document from such a collection, and
     distribute it individually under this License, provided you insert
     a copy of this License into the extracted document, and follow this
     License in all other respects regarding verbatim copying of that
     document.

  7. AGGREGATION WITH INDEPENDENT WORKS

     A compilation of the Document or its derivatives with other
     separate and independent documents or works, in or on a volume of a
     storage or distribution medium, is called an "aggregate" if the
     copyright resulting from the compilation is not used to limit the
     legal rights of the compilation's users beyond what the individual
     works permit.  When the Document is included in an aggregate, this
     License does not apply to the other works in the aggregate which
     are not themselves derivative works of the Document.

     If the Cover Text requirement of section 3 is applicable to these
     copies of the Document, then if the Document is less than one half
     of the entire aggregate, the Document's Cover Texts may be placed
     on covers that bracket the Document within the aggregate, or the
     electronic equivalent of covers if the Document is in electronic
     form.  Otherwise they must appear on printed covers that bracket
     the whole aggregate.

  8. TRANSLATION

     Translation is considered a kind of modification, so you may
     distribute translations of the Document under the terms of section
     4.  Replacing Invariant Sections with translations requires special
     permission from their copyright holders, but you may include
     translations of some or all Invariant Sections in addition to the
     original versions of these Invariant Sections.  You may include a
     translation of this License, and all the license notices in the
     Document, and any Warranty Disclaimers, provided that you also
     include the original English version of this License and the
     original versions of those notices and disclaimers.  In case of a
     disagreement between the translation and the original version of
     this License or a notice or disclaimer, the original version will
     prevail.

     If a section in the Document is Entitled "Acknowledgements",
     "Dedications", or "History", the requirement (section 4) to
     Preserve its Title (section 1) will typically require changing the
     actual title.

  9. TERMINATION

     You may not copy, modify, sublicense, or distribute the Document
     except as expressly provided under this License.  Any attempt
     otherwise to copy, modify, sublicense, or distribute it is void,
     and will automatically terminate your rights under this License.

     However, if you cease all violation of this License, then your
     license from a particular copyright holder is reinstated (a)
     provisionally, unless and until the copyright holder explicitly and
     finally terminates your license, and (b) permanently, if the
     copyright holder fails to notify you of the violation by some
     reasonable means prior to 60 days after the cessation.

     Moreover, your license from a particular copyright holder is
     reinstated permanently if the copyright holder notifies you of the
     violation by some reasonable means, this is the first time you have
     received notice of violation of this License (for any work) from
     that copyright holder, and you cure the violation prior to 30 days
     after your receipt of the notice.

     Termination of your rights under this section does not terminate
     the licenses of parties who have received copies or rights from you
     under this License.  If your rights have been terminated and not
     permanently reinstated, receipt of a copy of some or all of the
     same material does not give you any rights to use it.

  10. FUTURE REVISIONS OF THIS LICENSE

     The Free Software Foundation may publish new, revised versions of
     the GNU Free Documentation License from time to time.  Such new
     versions will be similar in spirit to the present version, but may
     differ in detail to address new problems or concerns.  See
     <http://www.gnu.org/copyleft/>.

     Each version of the License is given a distinguishing version
     number.  If the Document specifies that a particular numbered
     version of this License "or any later version" applies to it, you
     have the option of following the terms and conditions either of
     that specified version or of any later version that has been
     published (not as a draft) by the Free Software Foundation.  If the
     Document does not specify a version number of this License, you may
     choose any version ever published (not as a draft) by the Free
     Software Foundation.  If the Document specifies that a proxy can
     decide which future versions of this License can be used, that
     proxy's public statement of acceptance of a version permanently
     authorizes you to choose that version for the Document.

  11. RELICENSING

     "Massive Multiauthor Collaboration Site" (or "MMC Site") means any
     World Wide Web server that publishes copyrightable works and also
     provides prominent facilities for anybody to edit those works.  A
     public wiki that anybody can edit is an example of such a server.
     A "Massive Multiauthor Collaboration" (or "MMC") contained in the
     site means any set of copyrightable works thus published on the MMC
     site.

     "CC-BY-SA" means the Creative Commons Attribution-Share Alike 3.0
     license published by Creative Commons Corporation, a not-for-profit
     corporation with a principal place of business in San Francisco,
     California, as well as future copyleft versions of that license
     published by that same organization.

     "Incorporate" means to publish or republish a Document, in whole or
     in part, as part of another Document.

     An MMC is "eligible for relicensing" if it is licensed under this
     License, and if all works that were first published under this
     License somewhere other than this MMC, and subsequently
     incorporated in whole or in part into the MMC, (1) had no cover
     texts or invariant sections, and (2) were thus incorporated prior
     to November 1, 2008.

     The operator of an MMC Site may republish an MMC contained in the
     site under CC-BY-SA on the same site at any time before August 1,
     2009, provided the MMC is eligible for relicensing.

ADDENDUM: How to use this License for your documents
====================================================

To use this License in a document you have written, include a copy of
the License in the document and put the following copyright and license
notices just after the title page:

       Copyright (C)  YEAR  YOUR NAME.
       Permission is granted to copy, distribute and/or modify this document
       under the terms of the GNU Free Documentation License, Version 1.3
       or any later version published by the Free Software Foundation;
       with no Invariant Sections, no Front-Cover Texts, and no Back-Cover
       Texts.  A copy of the license is included in the section entitled ``GNU
       Free Documentation License''.

   If you have Invariant Sections, Front-Cover Texts and Back-Cover
Texts, replace the "with...Texts."  line with this:

         with the Invariant Sections being LIST THEIR TITLES, with
         the Front-Cover Texts being LIST, and with the Back-Cover Texts
         being LIST.

   If you have Invariant Sections without Cover Texts, or some other
combination of the three, merge those two alternatives to suit the
situation.

   If your document contains nontrivial examples of program code, we
recommend releasing these examples in parallel under your choice of free
software license, such as the GNU General Public License, to permit
their use in free software.


File: libitm.info,  Node: Library Index,  Prev: GNU Free Documentation License,  Up: Top

Library Index
*************

 [index ]
* Menu:

* FDL, GNU Free Documentation License:   GNU Free Documentation License.
                                                                (line 6)
* Introduction:                          Top.                   (line 6)



Tag Table:
Node: Top1141
Node: Enabling libitm2045
Node: C/C++ Language Constructs for TM2440
Node: The libitm ABI3923
Ref: txn-code-properties7721
Node: Internals18026
Ref: serial-lock-impl28064
Ref: progress-guarantees32825
Node: GNU Free Documentation License35103
Node: Library Index60232

End Tag Table
