.\"
.\" Copyright 2013 Samy Al Bahra.
.\" All rights reserved.
.\"
.\" Redistribution and use in source and binary forms, with or without
.\" modification, are permitted provided that the following conditions
.\" are met:
.\" 1. Redistributions of source code must retain the above copyright
.\"    notice, this list of conditions and the following disclaimer.
.\" 2. Redistributions in binary form must reproduce the above copyright
.\"    notice, this list of conditions and the following disclaimer in the
.\"    documentation and/or other materials provided with the distribution.
.\"
.\" THIS SOFTWARE IS PROVIDED BY THE REGENTS AND CONTRIBUTORS ``AS IS'' AND
.\" ANY EXPRESS OR IMPLIED WARRANTIES, INCLUDING, BUT NOT LIMITED TO, THE
.\" IMPLIED WARRANTIES OF MERCHANTABILITY AND FITNESS FOR A PARTICULAR PURPOSE
.\" ARE DISCLAIMED.  IN NO EVENT SHALL THE REGENTS OR CONTRIBUTORS BE LIABLE
.\" FOR ANY DIRECT, INDIRECT, INCIDENTAL, SPECIAL, EXEMPLARY, OR CONSEQUENTIAL
.\" DAMAGES (INCLUDING, BUT NOT LIMITED TO, PROCUREMENT OF SUBSTITUTE GOODS
.\" OR SERVICES; LOSS OF USE, DATA, OR PROFITS; OR BUSINESS INTERRUPTION)
.\" HOWEVER CAUSED AND ON ANY THEORY OF LIABILITY, WHETHER IN CONTRACT, STRICT
.\" LIABILITY, OR TORT (INCLUDING NEGLIGENCE OR OTHERWISE) ARISING IN ANY WAY
.\" OUT OF THE USE OF THIS SOFTWARE, EVEN IF ADVISED OF THE POSSIBILITY OF
.\" SUCH DAMAGE.
.\"
.\"
.Dd December 17, 2013
.Dt ck_pr_rtm 3
.Sh NAME
.Nm ck_pr_rtm_begin ,
.Nm ck_pr_rtm_end ,
.Nm ck_pr_rtm_abort ,
.Nm ck_pr_rtm_test
.Nd restricted transactional memory
.Sh LIBRARY
Concurrency Kit (libck, \-lck)
.Sh SYNOPSIS
.In ck_pr.h
.Ft unsigned int
.Fn ck_pr_rtm_begin "void"
.Ft void
.Fn ck_pr_rtm_end "void"
.Ft void
.Fn ck_pr_rtm_abort "const unsigned int status"
.Ft bool
.Fn ck_pr_rtm_test "void"
.Sh DESCRIPTION
These family of functions implement support for restricted
transactional memory, if available on the underlying platform.
Currently, support is only provided for Intel Haswell and
newer x86 microarchitectures that have the TSX-NI feature.
.Pp
The
.Fn ck_pr_rtm_begin
function returns CK_PR_RTM_STARTED if a transaction was successfully
started. In case of an abort, either internal (through a ck_pr_rtm_abort)
or external, program flow will return to the point which the function
was called except the return value will consist of a bitmap with one or
more of the following bits set:
.Bl -tag -width indent
.It CK_PR_RTM_EXPLICIT
Set if the transactionally was explicitly aborted through
.Fn ck_pr_rtm_abort .
.It CK_PR_RTM_RETRY
Set if the transaction failed but can still succeed if
retried.
.It CK_PR_RTM_CONFLICT
The transaction failed due to a conflict in one of the memory
addresses that are part of the working set of the transaction.
.It CK_PR_RTM_CAPACITY
Set if the architecture-defined transaction size limit was exceeded.
.It CK_PR_RTM_DEBUG
Set if a hardware breakpoint was triggered.
.It CK_PR_RTM_NESTED
Set if a nested transaction failed.
.El
.Pp
The user is also able to specify a one byte abort status
by calling
.Fn ck_pr_rtm_abort .
This status byte can be extracted by calling the
.Fn CK_PR_RTM_CODE
function with the return value of
.Fn ck_pr_rtm_begin
as an argument. The return value of
.Fn CK_PR_RTM_CODE
will be the value of this status byte.
For additional information, please see the Intel instruction
set manuals.
.Sh SEE ALSO
.Xr ck_pr_fence_load 3 ,
.Xr ck_pr_fence_load_depends 3 ,
.Xr ck_pr_fence_store 3 ,
.Xr ck_pr_fence_memory 3 ,
.Xr ck_pr_load 3 ,
.Xr ck_pr_store 3 ,
.Xr ck_pr_fas 3 ,
.Xr ck_pr_faa 3 ,
.Xr ck_pr_inc 3 ,
.Xr ck_pr_dec 3 ,
.Xr ck_pr_neg 3 , 
.Xr ck_pr_not 3 ,
.Xr ck_pr_sub 3 ,
.Xr ck_pr_and 3 ,
.Xr ck_pr_or 3 ,
.Xr ck_pr_xor 3 ,
.Xr ck_pr_add 3 ,
.Xr ck_pr_btc 3 ,
.Xr ck_pr_bts 3 ,
.Xr ck_pr_btr 3
.Pp
Additional information available at http://concurrencykit.org/
