123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127128129130131132133134135136137138139140141142143144145146147148149150151152153154155156157158159160161162163164165166167168169170171172173174175176177178179180181182183184185186187188189190191192193194195196197198199200201202203204205206207208209210211212213214215216217218219220221222223224225226227228229230231232233234235236237238239240241242243244245246247248249250251252253254255256257258259260261262263264265266267268269270271272273274275276277278279280281282283284285286287288289290291292293294295296297298299300301302303304305306307308309310311312313314315316317318319320321322323324325326327328329330331332333334335336337338339340341342343344345346347348349350351352353354355356357358359360361362363364365366367368369370371372373374375376377378379380381382383384385386387388389390391392393394395396397398399400401402403404405406407408409410411412413414415416417418419420421422423424425426427428429430431432433434435436437438439440441442443444445446447448449450451452453454455456457458459460461462463464465466467468469470471472473474475476477478479480481482483484485486487488489490491492493494495496497498499500501502503504505506507508509510511512513514515516517518519520521522523524525526527528529530531532533534535536537538539540541542543544545546547548549550551552553554555556557558559560561562563564565566567568569570571572573574575576577578579580581582583584585586587588589590591592593594595596597598599600601602603604605606607608609610611612613614615616617618619620621622623624625626627628629630631632633634635636637638639640641642643644645646647648649650651652653654655656657658659660661662663664665666667668669670671672673674675676677678679680681682683684685686687688689690691692693694695696697698699700701702703704705706707708709710711712713714715716717718719720721722723724725726727728729730731732733734735736737738739740741742743744745746747748749750751752753754755756757758759760761762763764765766767768769770771772773774775776777778779780781782783784785786787788789790791792793794795796797798799800801802803804805806807808809810811812813814815816817818819820821822823824825826827828829830831832833834835836837838839840841842843844845846847848849850851852853854855856857858859860861862863864865866867868869870871872873874875876877878879880881882883884885886887888889890891892893894895896897898899900901902903904905906907908909910911912913914915916917918919920921922923924925926927928929930931932933934935936937938939940941942943944945946947948949950951952953954955956957958959960961962963964965966967968969970971972973974975976977978979980981982983984985986987988989990991992993994995996997998999100010011002100310041005100610071008100910101011101210131014101510161017101810191020102110221023102410251026102710281029103010311032103310341035103610371038103910401041104210431044104510461047104810491050105110521053105410551056105710581059106010611062106310641065106610671068106910701071107210731074107510761077107810791080108110821083108410851086108710881089109010911092109310941095109610971098109911001101110211031104110511061107110811091110111111121113111411151116111711181119112011211122112311241125112611271128112911301131113211331134113511361137113811391140114111421143114411451146114711481149115011511152115311541155115611571158115911601161116211631164116511661167116811691170117111721173117411751176117711781179118011811182118311841185118611871188118911901191119211931194119511961197119811991200120112021203120412051206120712081209121012111212121312141215121612171218121912201221122212231224122512261227122812291230123112321233123412351236123712381239124012411242124312441245124612471248124912501251125212531254125512561257125812591260126112621263126412651266126712681269127012711272127312741275127612771278127912801281128212831284128512861287128812891290129112921293129412951296129712981299130013011302130313041305130613071308 |
- This is libitm.info, produced by makeinfo version 6.5 from libitm.texi.
- Copyright (C) 2011-2020 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-2020 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_free_exception (void *exc_ptr);
- void _ITM_cxa_throw (void *obj, void *tinfo, void (*dest) (void *));
- void *_ITM_cxa_begin_catch (void *exc_ptr);
- void _ITM_cxa_end_catch (void);
- The EH scheme changed in version 6 of GCC. Previously, the compiler
- added a call to '_ITM_commitTransactionEH' to commit a transaction if an
- exception could be in flight at this position in the code; 'exc_ptr' is
- the address of the current exception and must be non-zero. Now, the
- compiler must catch all exceptions that are about to be thrown out of a
- transaction and call '_ITM_commitTransactionEH' from the catch clause,
- with 'exc_ptr' being zero.
- Note that the old EH scheme never worked completely in GCC's
- implementation; libitm currently does not try to be compatible with the
- old scheme.
- The '_ITM_cxa...' functions are transactional wrappers for the
- respective '__cxa...' functions and must be called instead of these in
- transactional code. '_ITM_cxa_free_exception' is new in GCC 6.
- 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);
- Since GCC 6, 'unthrown_obj' is not used anymore and always null;
- prior to that, '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.
- libitm also provides transactional clones of C++ memory management
- functions such as global operator new and delete. They are part of
- libitm for historic reasons but do not need to be part of this ABI.
- 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: Top1141
- Node: Enabling libitm2045
- Node: C/C++ Language Constructs for TM2440
- Node: The libitm ABI3923
- Ref: txn-code-properties7721
- Node: Internals18814
- Ref: serial-lock-impl28852
- Ref: progress-guarantees33613
- Node: GNU Free Documentation License35891
- Node: Library Index61021
- End Tag Table
|