OSDN Git Service

Daily bump.
[pf3gnuchains/gcc-fork.git] / libitm / libitm.texi
1 \input texinfo @c -*-texinfo-*-
2
3 @c %**start of header
4 @setfilename libitm.info
5 @settitle GNU libitm
6 @c %**end of header
7
8
9 @copying
10 Copyright @copyright{} 2011 Free Software Foundation, Inc.
11
12 Permission is granted to copy, distribute and/or modify this document
13 under the terms of the GNU Free Documentation License, Version 1.2 or
14 any later version published by the Free Software Foundation; with no
15 Invariant Sections, no Front-Cover Texts, and no Back-Cover Texts.
16 A copy of the license is included in the section entitled ``GNU
17 Free Documentation License''.
18 @end copying
19
20 @ifinfo
21 @dircategory GNU Libraries
22 @direntry
23 * libitm: (libitm).                    GNU Transactional Memory Library
24 @end direntry
25
26 This manual documents the GNU Transactional Memory Library.
27
28 @insertcopying
29 @end ifinfo
30
31
32 @setchapternewpage odd
33
34 @titlepage
35 @title The GNU Transactional Memory Library
36 @page
37 @vskip 0pt plus 1filll
38 @comment For the @value{version-GCC} Version*
39 @sp 1
40 @insertcopying
41 @end titlepage
42
43 @summarycontents
44 @contents
45 @page
46
47
48 @node Top
49 @top Introduction
50 @cindex Introduction
51
52 This manual documents the usage and internals of libitm, the GNU Transactional
53 Memory Library. It provides transaction support for accesses to a process'
54 memory, enabling easy-to-use synchronization of accesses to shared memory by
55 several threads.
56
57
58 @comment
59 @comment  When you add a new menu item, please keep the right hand
60 @comment  aligned to the same column.  Do not use tabs.  This provides
61 @comment  better formatting.
62 @comment
63 @menu
64 * Enabling libitm::            How to enable libitm for your applications.
65 * C/C++ Language Constructs for TM::
66                                Notes on the language-level interface supported
67                                by gcc.
68 * The libitm ABI::             Notes on the external ABI provided by libitm.
69 * Internals::                  Notes on libitm's internal synchronization.
70 * GNU Free Documentation License::
71                                How you can copy and share this manual.
72 * Index::                      Index of this documentation.
73 @end menu
74
75
76 @c ---------------------------------------------------------------------
77 @c Enabling libitm
78 @c ---------------------------------------------------------------------
79
80 @node Enabling libitm
81 @chapter Enabling libitm
82
83 To activate support for TM in C/C++, the compile-time flag @option{-fgnu-tm}
84 must be specified. This enables TM language-level constructs such as
85 transaction statements (e.g., @code{__transaction_atomic}, @pxref{C/C++
86 Language Constructs for TM} for details).
87
88 @c ---------------------------------------------------------------------
89 @c C/C++ Language Constructs for TM
90 @c ---------------------------------------------------------------------
91
92 @node C/C++ Language Constructs for TM
93 @chapter C/C++ Language Constructs for TM
94
95 Transactions are supported in C++ and C in the form of transaction statements,
96 transaction expressions, and function transactions. In the following example,
97 both @code{a} and @code{b} will be read and the difference will be written to
98 @code{c}, all atomically and isolated from other transactions:
99
100 @example
101 __transaction_atomic @{ c = a - b; @}
102 @end example
103
104 Therefore, another thread can use the following code to concurrently update
105 @code{b} without ever causing @code{c} to hold a negative value (and without
106 having to use other synchronization constructs such as locks or C++11
107 atomics):
108
109 @example
110 __transaction_atomic @{ if (a > b) b++; @}
111 @end example
112
113 GCC follows the @uref{https://sites.google.com/site/tmforcplusplus/, Draft
114 Specification of Transactional Language Constructs for C++ (v1.1)} in its
115 implementation of transactions.
116
117 The precise semantics of transactions are defined in terms of the C++11/C11
118 memory model (see the specification). Roughly, transactions provide
119 synchronization guarantees that are similar to what would be guaranteed when
120 using a single global lock as a guard for all transactions. Note that like
121 other synchronization constructs in C/C++, transactions rely on a
122 data-race-free program (e.g., a nontransactional write that is concurrent
123 with a transactional read to the same memory location is a data race).
124
125 @c ---------------------------------------------------------------------
126 @c The libitm ABI
127 @c ---------------------------------------------------------------------
128
129 @node The libitm ABI
130 @chapter The libitm ABI
131
132 The ABI provided by libitm is basically equal to the Linux variant of Intel's
133 current TM ABI specification document (Revision 1.1, May 6 2009) but with the
134 differences listed in this chapter. It would be good if these changes would
135 eventually be merged into a future version of this specification. To ease
136 look-up, the following subsections mirror the structure of this specification.
137
138 @section [No changes] Objectives
139 @section [No changes] Non-objectives
140
141 @section Library design principles
142 @subsection [No changes] Calling conventions
143 @subsection [No changes] TM library algorithms
144 @subsection [No changes] Optimized load and store routines
145 @subsection [No changes] Aligned load and store routines
146
147 @subsection Data logging functions
148
149 The memory locations accessed with transactional loads and stores and the
150 memory locations whose values are logged must not overlap. This required
151 separation only extends to the scope of the execution of one transaction
152 including all the executions of all nested transactions.
153
154 The compiler must be consistent (within the scope of a single transaction)
155 about which memory locations are shared and which are not shared with other
156 threads (i.e., data must be accessed either transactionally or
157 nontransactionally). Otherwise, non-write-through TM algorithms would not work.
158
159 @subsection [No changes] Scatter/gather calls
160 @subsection [No changes] Serial and irrevocable mode
161 @subsection [No changes] Transaction descriptor
162 @subsection Store allocation
163
164 There is no @code{getTransaction} function. 
165
166 @subsection [No changes] Naming conventions
167
168 @subsection Function pointer encryption
169
170 Currently, this is not implemented.
171
172
173 @section Types and macros list
174
175 @code{_ITM_codeProperties} has changed, @pxref{txn-code-properties,,Starting a
176 transaction}.
177 @code{_ITM_srcLocation} is not used. 
178
179
180 @section Function list
181
182 @subsection Initialization and finalization functions
183 These functions are not part of the ABI.
184
185 @subsection [No changes] Version checking
186 @subsection [No changes] Error reporting
187 @subsection [No changes] inTransaction call
188
189 @subsection State manipulation functions
190 There is no @code{getTransaction} function. Transaction identifiers for
191 nested transactions will be ordered but not necessarily sequential (i.e., for
192 a nested transaction's identifier @var{IN} and its enclosing transaction's
193 identifier @var{IE}, it is guaranteed that @math{IN >= IE}).
194
195 @subsection [No changes] Source locations
196
197 @subsection Starting a transaction
198
199 @subsubsection Transaction code properties
200
201 @anchor{txn-code-properties}
202 The bit @code{hasNoXMMUpdate} is instead called @code{hasNoVectorUpdate}.
203 Iff it is set, vector register save/restore is not necessary for any target
204 machine.
205
206 The @code{hasNoFloatUpdate} bit (@code{0x0010}) is new. Iff it is set, floating
207 point register save/restore is not necessary for any target machine.
208
209 @code{undoLogCode} is not supported and a fatal runtime error will be raised
210 if this bit is set. It is not properly defined in the ABI why barriers
211 other than undo logging are not present; Are they not necessary (e.g., a
212 transaction operating purely on thread-local data) or have they been omitted by
213 the compiler because it thinks that some kind of global synchronization
214 (e.g., serial mode) might perform better? The specification suggests that the
215 latter might be the case, but the former seems to be more useful.
216
217 The @code{readOnly} bit (@code{0x4000}) is new. @strong{TODO} Lexical or dynamic
218 scope?
219
220 @code{hasNoRetry} is not supported. If this bit is not set, but
221 @code{hasNoAbort} is set, the library can assume that transaction
222 rollback will not be requested.
223
224 It would be useful if the absence of externally-triggered rollbacks would be
225 reported for the dynamic scope as well, not just for the lexical scope
226 (@code{hasNoAbort}). Without this, a library cannot exploit this together
227 with flat nesting.
228
229 @code{exceptionBlock} is not supported because exception blocks are not used.
230
231 @subsubsection [No changes] Windows exception state
232 @subsubsection [No changes] Other machine state
233
234 @subsubsection [No changes] Results from beginTransaction
235
236 @subsection Aborting a transaction
237
238 @code{_ITM_rollbackTransaction} is not supported. @code{_ITM_abortTransaction}
239 is supported but the abort reasons @code{exceptionBlockAbort},
240 @code{TMConflict}, and @code{userRetry} are not supported. There are no
241 exception blocks in general, so the related cases also do not have to be
242 considered. To encode @code{__transaction_cancel [[outer]]}, compilers must
243 set the new @code{outerAbort} bit (@code{0x10}) additionally to the
244 @code{userAbort} bit in the abort reason.
245
246 @subsection Committing a transaction
247
248 The exception handling (EH) scheme is different. The Intel ABI requires the
249 @code{_ITM_tryCommitTransaction} function that will return even when the
250 commit failed and will have to be matched with calls to either
251 @code{_ITM_abortTransaction} or @code{_ITM_commitTransaction}. In contrast,
252 gcc relies on transactional wrappers for the functions of the Exception
253 Handling ABI and on one additional commit function (shown below). This allows
254 the TM to keep track of EH internally and thus it does not have to embed the
255 cleanup of EH state into the existing EH code in the program.
256 @code{_ITM_tryCommitTransaction} is not supported.
257 @code{_ITM_commitTransactionToId} is also not supported because the
258 propagation of thrown exceptions will not bypass commits of nested
259 transactions.
260
261 @example
262 void _ITM_commitTransactionEH(void *exc_ptr) ITM_REGPARM;
263 void *_ITM_cxa_allocate_exception (size_t);
264 void _ITM_cxa_throw (void *obj, void *tinfo, void *dest);
265 void *_ITM_cxa_begin_catch (void *exc_ptr);
266 void _ITM_cxa_end_catch (void);
267 @end example
268
269 @code{_ITM_commitTransactionEH} must be called to commit a transaction if an
270 exception could be in flight at this position in the code. @code{exc_ptr} is
271 the current exception or zero if there is no current exception.
272 The @code{_ITM_cxa...} functions are transactional wrappers for the respective
273 @code{__cxa...} functions and must be called instead of these in transactional
274 code.
275
276 To support this EH scheme, libstdc++ needs to provide one additional function
277 (@code{_cxa_tm_cleanup}), which is used by the TM to clean up the exception
278 handling state while rolling back a transaction:
279
280 @example
281 void __cxa_tm_cleanup (void *unthrown_obj, void *cleanup_exc,
282                        unsigned int caught_count);
283 @end example
284
285 @code{unthrown_obj} is non-null if the program called
286 @code{__cxa_allocate_exception} for this exception but did not yet called
287 @code{__cxa_throw} for it. @code{cleanup_exc} is non-null if the program is
288 currently processing a cleanup along an exception path but has not caught this
289 exception yet. @code{caught_count} is the nesting depth of
290 @code{__cxa_begin_catch} within the transaction (which can be counted by the TM
291 using @code{_ITM_cxa_begin_catch} and @code{_ITM_cxa_end_catch});
292 @code{__cxa_tm_cleanup} then performs rollback by essentially performing
293 @code{__cxa_end_catch} that many times.
294
295
296
297 @subsection Exception handling support
298
299 Currently, there is no support for functionality like
300 @code{__transaction_cancel throw} as described in the C++ TM specification.
301 Supporting this should be possible with the EH scheme explained previously
302 because via the transactional wrappers for the EH ABI, the TM is able to
303 observe and intercept EH.
304
305
306 @subsection [No changes] Transition to serial--irrevocable mode
307 @subsection [No changes] Data transfer functions
308 @subsection [No changes] Transactional memory copies
309
310 @subsection Transactional versions of memmove
311
312 If either the source or destination memory region is to be accessed
313 nontransactionally, then source and destination regions must not be
314 overlapping. The respective @code{_ITM_memmove} functions are still
315 available but a fatal runtime error will be raised if such regions do overlap.
316 To support this functionality, the ABI would have to specify how the
317 intersection of the regions has to be accessed (i.e., transactionally or
318 nontransactionally).
319
320 @subsection [No changes] Transactional versions of memset
321 @subsection [No changes] Logging functions
322
323 @subsection User-registered commit and undo actions
324
325 Commit actions will get executed in the same order in which the respective
326 calls to @code{_ITM_addUserCommitAction} happened. Only
327 @code{_ITM_noTransactionId} is allowed as value for the
328 @code{resumingTransactionId} argument. Commit actions get executed after
329 privatization safety has been ensured.
330
331 Undo actions will get executed in reverse order compared to the order in which
332 the respective calls to @code{_ITM_addUserUndoAction} happened. The ordering of
333 undo actions w.r.t. the roll-back of other actions (e.g., data transfers or
334 memory allocations) is undefined.
335
336 @code{_ITM_getThreadnum} is not supported currently because its only purpose
337 is to provide a thread ID that matches some assumed performance tuning output,
338 but this output is not part of the ABI nor further defined by it.
339
340 @code{_ITM_dropReferences} is not supported currently because its semantics and
341 the intention behind it is not entirely clear. The
342 specification suggests that this function is necessary because of certain
343 orderings of data transfer undos and the releasing of memory regions (i.e.,
344 privatization). However, this ordering is never defined, nor is the ordering of
345 dropping references w.r.t. other events.
346
347 @subsection [New] Transactional indirect calls
348
349 Indirect calls (i.e., calls through a function pointer) within transactions
350 should execute the transactional clone of the original function (i.e., a clone
351 of the original that has been fully instrumented to use the TM runtime), if
352 such a clone is available. The runtime provides two functions to
353 register/deregister clone tables:
354
355 @example
356 struct clone_entry
357 @{
358   void *orig, *clone;
359 @};
360
361 void _ITM_registerTMCloneTable (clone_entry *table, size_t entries);
362 void _ITM_deregisterTMCloneTable (clone_entry *table);
363 @end example
364
365 Registered tables must be writable by the TM runtime, and must be live
366 throughout the life-time of the TM runtime.
367
368 @strong{TODO} The intention was always to drop the registration functions
369 entirely, and create a new ELF Phdr describing the linker-sorted table.  Much
370 like what currently happens for @code{PT_GNU_EH_FRAME}.
371 This work kept getting bogged down in how to represent the @var{N} different
372 code generation variants.  We clearly needed at least two---SW and HW
373 transactional clones---but there was always a suggestion of more variants for
374 different TM assumptions/invariants.
375
376 The compiler can then use two TM runtime functions to perform indirect calls in
377 transactions:
378 @example
379 void *_ITM_getTMCloneOrIrrevocable (void *function) ITM_REGPARM;
380 void *_ITM_getTMCloneSafe (void *function) ITM_REGPARM;
381 @end example
382
383 If there is a registered clone for supplied function, both will return a
384 pointer to the clone. If not, the first runtime function will attempt to switch
385 to serial--irrevocable mode and return the original pointer, whereas the second
386 will raise a fatal runtime error.
387
388 @subsection [New] Transactional dynamic memory management
389
390 @example
391 void *_ITM_malloc (size_t)
392        __attribute__((__malloc__)) ITM_PURE;
393 void *_ITM_calloc (size_t, size_t)
394        __attribute__((__malloc__)) ITM_PURE;
395 void _ITM_free (void *) ITM_PURE;
396 @end example
397
398 These functions are essentially transactional wrappers for @code{malloc},
399 @code{calloc}, and @code{free}. Within transactions, the compiler should
400 replace calls to the original functions with calls to the wrapper functions.
401
402
403 @section [No changes] Future Enhancements to the ABI
404
405 @section Sample code 
406
407 The code examples might not be correct w.r.t. the current version of the ABI,
408 especially everything related to exception handling.
409
410
411 @section [New] Memory model
412
413 The ABI should define a memory model and the ordering that is guaranteed for
414 data transfers and commit/undo actions, or at least refer to another memory
415 model that needs to be preserved. Without that, the compiler cannot ensure the
416 memory model specified on the level of the programming language (e.g., by the
417 C++ TM specification).
418
419 For example, if a transactional load is ordered before another load/store, then
420 the TM runtime must also ensure this ordering when accessing shared state. If
421 not, this might break the kind of publication safety used in the C++ TM
422 specification. Likewise, the TM runtime must ensure privatization safety.
423
424
425
426 @c ---------------------------------------------------------------------
427 @c Internals
428 @c ---------------------------------------------------------------------
429
430 @node Internals
431 @chapter Internals
432
433 @section TM methods and method groups
434
435 libitm supports several ways of synchronizing transactions with each other.
436 These TM methods (or TM algorithms) are implemented in the form of
437 subclasses of @code{abi_dispatch}, which provide methods for
438 transactional loads and stores as well as callbacks for rollback and commit.
439 All methods that are compatible with each other (i.e., that let concurrently
440 running transactions still synchronize correctly even if different methods
441 are used) belong to the same TM method group. Pointers to TM methods can be
442 obtained using the factory methods prefixed with @code{dispatch_} in
443 @file{libitm_i.h}. There are two special methods, @code{dispatch_serial} and
444 @code{dispatch_serialirr}, that are compatible with all methods because they
445 run transactions completely in serial mode.
446
447 @subsection TM method life cycle
448
449 The state of TM methods does not change after construction, but they do alter
450 the state of transactions that use this method. However, because
451 per-transaction data gets used by several methods, @code{gtm_thread} is
452 responsible for setting an initial state that is useful for all methods.
453 After that, methods are responsible for resetting/clearing this state on each
454 rollback or commit (of outermost transactions), so that the transaction
455 executed next is not affected by the previous transaction.
456
457 There is also global state associated with each method group, which is
458 initialized and shut down (@code{method_group::init()} and @code{fini()})
459 when switching between method groups (see @file{retry.cc}).
460
461 @subsection Selecting the default method
462
463 The default method that libitm uses for freshly started transactions (but
464 not necessarily for restarted transactions) can be set via an environment
465 variable (@env{ITM_DEFAULT_METHOD}), whose value should be equal to the name
466 of one of the factory methods returning abi_dispatch subclasses but without
467 the "dispatch_" prefix (e.g., "serialirr" instead of
468 @code{GTM::dispatch_serialirr()}).
469
470 Note that this environment variable is only a hint for libitm and might not
471 be supported in the future.
472
473
474 @section Nesting: flat vs. closed
475
476 We support two different kinds of nesting of transactions. In the case of
477 @emph{flat nesting}, the nesting structure is flattened and all nested
478 transactions are subsumed by the enclosing transaction. In contrast,
479 with @emph{closed nesting}, nested transactions that have not yet committed
480 can be rolled back separately from the enclosing transactions; when they
481 commit, they are subsumed by the enclosing transaction, and their effects
482 will be finally committed when the outermost transaction commits.
483 @emph{Open nesting} (where nested transactions can commit independently of the
484 enclosing transactions) are not supported.
485
486 Flat nesting is the default nesting mode, but closed nesting is supported and
487 used when transactions contain user-controlled aborts
488 (@code{__transaction_cancel} statements). We assume that user-controlled
489 aborts are rare in typical code and used mostly in exceptional situations.
490 Thus, it makes more sense to use flat nesting by default to avoid the
491 performance overhead of the additional checkpoints required for closed
492 nesting. User-controlled aborts will correctly abort the innermost enclosing
493 transaction, whereas the whole (i.e., outermost) transaction will be restarted
494 otherwise (e.g., when a transaction encounters data conflicts during
495 optimistic execution).
496
497
498 @section Locking conventions
499
500 This section documents the locking scheme and rules for all uses of locking
501 in libitm. We have to support serial(-irrevocable) mode, which is implemented
502 using a global lock as explained next (called the @emph{serial lock}). To
503 simplify the overall design, we use the same lock as catch-all locking
504 mechanism for other infrequent tasks such as (de)registering clone tables or
505 threads. Besides the serial lock, there are @emph{per-method-group locks} that
506 are managed by specific method groups (i.e., groups of similar TM concurrency
507 control algorithms), and lock-like constructs for quiescence-based operations
508 such as ensuring privatization safety.
509
510 Thus, the actions that participate in the libitm-internal locking are either
511 @emph{active transactions} that do not run in serial mode, @emph{serial
512 transactions} (which (are about to) run in serial mode), and management tasks
513 that do not execute within a transaction but have acquired the serial mode
514 like a serial transaction would do (e.g., to be able to register threads with
515 libitm). Transactions become active as soon as they have successfully used the
516 serial lock to announce this globally (@pxref{serial-lock-impl,,Serial lock
517 implementation}). Likewise, transactions become serial transactions as soon as
518 they have acquired the exclusive rights provided by the serial lock (i.e.,
519 serial mode, which also means that there are no other concurrent active or
520 serial transactions). Note that active transactions can become serial
521 transactions when they enter serial mode during the runtime of the
522 transaction.
523
524 @subsection State-to-lock mapping
525
526 Application data is protected by the serial lock if there is a serial
527 transaction and no concurrently running active transaction (i.e., non-serial).
528 Otherwise, application data is protected by the currently selected method
529 group, which might use per-method-group locks or other mechanisms. Also note
530 that application data that is about to be privatized might not be allowed to be
531 accessed by nontransactional code until privatization safety has been ensured;
532 the details of this are handled by the current method group.
533
534 libitm-internal state is either protected by the serial lock or accessed
535 through custom concurrent code. The latter applies to the public/shared part
536 of a transaction object and most typical method-group-specific state.
537
538 The former category (protected by the serial lock) includes:
539 @itemize @bullet
540 @item The list of active threads that have used transactions.
541 @item The tables that map functions to their transactional clones.
542 @item The current selection of which method group to use.
543 @item Some method-group-specific data, or invariants of this data. For example,
544 resetting a method group to its initial state is handled by switching to the
545 same method group, so the serial lock protects such resetting as well.
546 @end itemize
547 In general, such state is immutable whenever there exists an active
548 (non-serial) transaction. If there is no active transaction, a serial
549 transaction (or a thread that is not currently executing a transaction but has
550 acquired the serial lock) is allowed to modify this state (but must of course
551 be careful to not surprise the current method group's implementation with such
552 modifications).
553
554 @subsection Lock acquisition order
555
556 To prevent deadlocks, locks acquisition must happen in a globally agreed-upon
557 order. Note that this applies to other forms of blocking too, but does not
558 necessarily apply to lock acquisitions that do not block (e.g., trylock()
559 calls that do not get retried forever). Note that serial transactions are
560 never return back to active transactions until the transaction has committed.
561 Likewise, active transactions stay active until they have committed.
562 Per-method-group locks are typically also not released before commit.
563
564 Lock acquisition / blocking rules:
565 @itemize @bullet
566
567 @item Transactions must become active or serial before they are allowed to
568 use method-group-specific locks or blocking (i.e., the serial lock must be
569 acquired before those other locks, either in serial or nonserial mode).
570
571 @item Any number of threads that do not currently run active transactions can
572 block while trying to get the serial lock in exclusive mode. Note that active
573 transactions must not block when trying to upgrade to serial mode unless there
574 is no other transaction that is trying that (the latter is ensured by the
575 serial lock implementation.
576
577 @item Method groups must prevent deadlocks on their locks. In particular, they
578 must also be prepared for another active transaction that has acquired
579 method-group-specific locks but is blocked during an attempt to upgrade to
580 being a serial transaction. See below for details.
581
582 @item Serial transactions can acquire method-group-specific locks because there
583 will be no other active nor serial transaction.
584
585 @end itemize
586
587 There is no single rule for per-method-group blocking because this depends on
588 when a TM method might acquire locks. If no active transaction can upgrade to
589 being a serial transaction after it has acquired per-method-group locks (e.g.,
590 when those locks are only acquired during an attempt to commit), then the TM
591 method does not need to consider a potential deadlock due to serial mode.
592
593 If there can be upgrades to serial mode after the acquisition of
594 per-method-group locks, then TM methods need to avoid those deadlocks:
595 @itemize @bullet
596 @item When upgrading to a serial transaction, after acquiring exclusive rights
597 to the serial lock but before waiting for concurrent active transactions to
598 finish (@pxref{serial-lock-impl,,Serial lock implementation} for details),
599 we have to wake up all active transactions waiting on the upgrader's
600 per-method-group locks.
601 @item Active transactions blocking on per-method-group locks need to check the
602 serial lock and abort if there is a pending serial transaction.
603 @item Lost wake-ups have to be prevented (e.g., by changing a bit in each
604 per-method-group lock before doing the wake-up, and only blocking on this lock
605 using a futex if this bit is not group).
606 @end itemize
607
608 @strong{TODO}: Can reuse serial lock for gl-*? And if we can, does it make
609 sense to introduce further complexity in the serial lock? For gl-*, we can
610 really only avoid an abort if we do -wb and -vbv.
611
612
613 @subsection Serial lock implementation
614 @anchor{serial-lock-impl}
615
616 The serial lock implementation is optimized towards assuming that serial
617 transactions are infrequent and not the common case. However, the performance
618 of entering serial mode can matter because when only few transactions are run
619 concurrently or if there are few threads, then it can be efficient to run
620 transactions serially.
621
622 The serial lock is similar to a multi-reader-single-writer lock in that there
623 can be several active transactions but only one serial transaction. However,
624 we do want to avoid contention (in the lock implementation) between active
625 transactions, so we split up the reader side of the lock into per-transaction
626 flags that are true iff the transaction is active. The exclusive writer side
627 remains a shared single flag, which is acquired using a CAS, for example.
628 On the fast-path, the serial lock then works similar to Dekker's algorithm but
629 with several reader flags that a serial transaction would have to check.
630 A serial transaction thus requires a list of all threads with potentially
631 active transactions; we can use the serial lock itself to protect this list
632 (i.e., only threads that have acquired the serial lock can modify this list).
633
634 We want starvation-freedom for the serial lock to allow for using it to ensure
635 progress for potentially starved transactions (@pxref{progress-guarantees,,
636 Progress Guarantees} for details). However, this is currently not enforced by
637 the implementation of the serial lock.
638
639 Here is pseudo-code for the read/write fast paths of acquiring the serial
640 lock (read-to-write upgrade is similar to write_lock:
641 @example
642 // read_lock:
643 tx->shared_state |= active;
644 __sync_synchronize(); // or STLD membar, or C++0x seq-cst fence
645 while (!serial_lock.exclusive)
646   if (spinning_for_too_long) goto slowpath;
647
648 // write_lock:
649 if (CAS(&serial_lock.exclusive, 0, this) != 0)
650   goto slowpath; // writer-writer contention
651 // need a membar here, but CAS already has full membar semantics
652 bool need_blocking = false;
653 for (t: all txns)
654   @{
655     for (;t->shared_state & active;)
656       if (spinning_for_too_long) @{ need_blocking = true; break; @}
657   @}
658 if (need_blocking) goto slowpath;
659 @end example
660
661 Releasing a lock in this spin-lock version then just consists of resetting
662 @code{tx->shared_state} to inactive or clearing @code{serial_lock.exclusive}.
663
664 However, we can't rely on a pure spinlock because we need to get the OS
665 involved at some time (e.g., when there are more threads than CPUs to run on).
666 Therefore, the real implementation falls back to a blocking slow path, either
667 based on pthread mutexes or Linux futexes.
668
669
670 @subsection Reentrancy
671
672 libitm has to consider the following cases of reentrancy:
673 @itemize @bullet
674
675 @item Transaction calls unsafe code that starts a new transaction: The outer
676 transaction will become a serial transaction before executing unsafe code.
677 Therefore, nesting within serial transactions must work, even if the nested
678 transaction is called from within uninstrumented code.
679
680 @item Transaction calls either a transactional wrapper or safe code, which in
681 turn starts a new transaction: It is not yet defined in the specification
682 whether this is allowed. Thus, it is undefined whether libitm supports this.
683
684 @item Code that starts new transactions might be called from within any part
685 of libitm: This kind of reentrancy would likely be rather complex and can
686 probably be avoided. Therefore, it is not supported.
687
688 @end itemize
689
690 @subsection Privatization safety
691
692 Privatization safety is ensured by libitm using a quiescence-based approach.
693 Basically, a privatizing transaction waits until all concurrent active
694 transactions will either have finished (are not active anymore) or operate on
695 a sufficiently recent snapshot to not access the privatized data anymore. This
696 happens after the privatizing transaction has stopped being an active
697 transaction, so waiting for quiescence does not contribute to deadlocks.
698
699 In method groups that need to ensure publication safety explicitly, active
700 transactions maintain a flag or timestamp in the public/shared part of the
701 transaction descriptor. Before blocking, privatizers need to let the other
702 transactions know that they should wake up the privatizer.
703
704 @strong{TODO} Ho to implement the waiters? Should those flags be
705 per-transaction or at a central place? We want to avoid one wake/wait call
706 per active transactions, so we might want to use either a tree or combining
707 to reduce the syscall overhead, or rather spin for a long amount of time
708 instead of doing blocking. Also, it would be good if only the last transaction
709 that the privatizer waits for would do the wake-up.
710
711 @subsection Progress guarantees
712 @anchor{progress-guarantees}
713
714 Transactions that do not make progress when using the current TM method will
715 eventually try to execute in serial mode. Thus, the serial lock's progress
716 guarantees determine the progress guarantees of the whole TM. Obviously, we at
717 least need deadlock-freedom for the serial lock, but it would also be good to
718 provide starvation-freedom (informally, all threads will finish executing a
719 transaction eventually iff they get enough cycles).
720
721 However, the scheduling of transactions (e.g., thread scheduling by the OS)
722 also affects the handling of progress guarantees by the TM. First, the TM
723 can only guarantee deadlock-freedom if threads do not get stopped. Likewise,
724 low-priority threads can starve if they do not get scheduled when other
725 high-priority threads get those cycles instead.
726
727 If all threads get scheduled eventually, correct lock implementations will
728 provide deadlock-freedom, but might not provide starvation-freedom. We can
729 either enforce the latter in the TM's lock implementation, or assume that
730 the scheduling is sufficiently random to yield a probabilistic guarantee that
731 no thread will starve (because eventually, a transaction will encounter a
732 scheduling that will allow it to run). This can indeed work well in practice
733 but is not necessarily guaranteed to work (e.g., simple spin locks can be
734 pretty efficient).
735
736 Because enforcing stronger progress guarantees in the TM has a higher runtime
737 overhead, we focus on deadlock-freedom right now and assume that the threads
738 will get scheduled eventually by the OS (but don't consider threads with
739 different priorities). We should support starvation-freedom for serial
740 transactions in the future. Everything beyond that is highly related to proper
741 contention management across all of the TM (including with TM method to
742 choose), and is future work.
743
744 @strong{TODO} Handling thread priorities: We want to avoid priority inversion
745 but it's unclear how often that actually matters in practice. Workloads that
746 have threads with different priorities will likely also require lower latency
747 or higher throughput for high-priority threads. Therefore, it probably makes
748 not that much sense (except for eventual progress guarantees) to use
749 priority inheritance until the TM has priority-aware contention management.
750
751
752 @c ---------------------------------------------------------------------
753 @c GNU Free Documentation License
754 @c ---------------------------------------------------------------------
755
756 @include fdl.texi
757
758 @c ---------------------------------------------------------------------
759 @c Index
760 @c ---------------------------------------------------------------------
761
762 @node Index
763 @unnumbered Index
764
765 @printindex cp
766
767 @bye