Provided by: libpmemobj-dev_1.13.1-1.1ubuntu2_amd64 bug

NAME

       pmemobj_tx_add_range(),              pmemobj_tx_add_range_direct(),              pmemobj_tx_xadd_range(),
       pmemobj_tx_xadd_range_direct()

       TX_ADD(), TX_ADD_FIELD(), TX_ADD_DIRECT(), TX_ADD_FIELD_DIRECT(),

       TX_XADD(), TX_XADD_FIELD(), TX_XADD_DIRECT(), TX_XADD_FIELD_DIRECT(),

       TX_SET(), TX_SET_DIRECT(), TX_MEMCPY(), TX_MEMSET() - transactional object manipulation

SYNOPSIS

              #include <libpmemobj.h>

              int pmemobj_tx_add_range(PMEMoid oid, uint64_t off, size_t size);
              int pmemobj_tx_add_range_direct(const void *ptr, size_t size);
              int pmemobj_tx_xadd_range(PMEMoid oid, uint64_t off, size_t size, uint64_t flags);
              int pmemobj_tx_xadd_range_direct(const void *ptr, size_t size, uint64_t flags);

              TX_ADD(TOID o)
              TX_ADD_FIELD(TOID o, FIELD)
              TX_ADD_DIRECT(TYPE *p)
              TX_ADD_FIELD_DIRECT(TYPE *p, FIELD)

              TX_XADD(TOID o, uint64_t flags)
              TX_XADD_FIELD(TOID o, FIELD, uint64_t flags)
              TX_XADD_DIRECT(TYPE *p, uint64_t flags)
              TX_XADD_FIELD_DIRECT(TYPE *p, FIELD, uint64_t flags)

              TX_SET(TOID o, FIELD, VALUE)
              TX_SET_DIRECT(TYPE *p, FIELD, VALUE)
              TX_MEMCPY(void *dest, const void *src, size_t num)
              TX_MEMSET(void *dest, int c, size_t num)

DESCRIPTION

       pmemobj_tx_add_range() takes a “snapshot” of the memory block of given size, located at given offset  off
       in  the  object specified by oid, and saves it to the undo log.  The application is then free to directly
       modify the object in that memory range.  In case of a failure or abort, all the changes within this range
       will  be  rolled  back.   The  supplied  block  of  memory  has  to  be within the pool registered in the
       transaction.  This function must be called during TX_STAGE_WORK.

       The pmemobj_tx_xadd_range() function behaves exactly the same as pmemobj_tx_add_range() when flags equals
       zero.  flags is a bitmask of the following values:

       • POBJ_XADD_NO_FLUSH   -   skip   flush   on  commit  (when  application  deals  with  flushing  or  uses
         pmemobj_memcpy_persist)

       • POBJ_XADD_NO_SNAPSHOT - added range will not be “snapshotted”, i.e. any changes made within  it  during
         the transaction will not be rolled backed after abort

       • POBJ_XADD_ASSUME_INITIALIZED  -  added  range  is  assumed  to  be  initialized.   If  this flag is not
         specified, passing uninitialized memory will result in an error when run under Valgrind memcheck.

       • POBJ_XADD_NO_ABORT - if the function does not end successfully, do not abort the transaction.

       pmemobj_tx_add_range_direct() behaves the same as  pmemobj_tx_add_range()  with  the  exception  that  it
       operates  on  virtual  memory  addresses  and  not persistent memory objects.  It takes a “snapshot” of a
       persistent memory block of given size, located at the given address ptr in the virtual memory  space  and
       saves  it  to  the  undo  log.  The application is then free to directly modify the object in that memory
       range.  In case of a failure or abort, all the changes within  this  range  will  be  rolled  back.   The
       supplied  block of memory has to be within the pool registered in the transaction.  This function must be
       called during TX_STAGE_WORK.

       The pmemobj_tx_xadd_range_direct() function behaves exactly  the  same  as  pmemobj_tx_add_range_direct()
       when flags equals zero.  flags is a bitmask of the following values:

       • POBJ_XADD_NO_FLUSH   -   skip   flush   on  commit  (when  application  deals  with  flushing  or  uses
         pmemobj_memcpy_persist)

       • POBJ_XADD_NO_SNAPSHOT - added range will not be “snapshotted”, i.e. any changes made within  it  during
         the transaction will not be rolled backed after abort

       • POBJ_XADD_ASSUME_INITIALIZED  -  added  range  is  assumed  to  be  initialized.   If  this flag is not
         specified, passing uninitialized memory will result in an error when run under Valgrind memcheck.

       • POBJ_XADD_NO_ABORT - if the function does not end successfully, do not abort the transaction.

       Similarly to the macros controlling the transaction  flow,  libpmemobj  defines  a  set  of  macros  that
       simplify  the  transactional  operations  on persistent objects.  Note that those macros operate on typed
       object handles, thus eliminating the need to specify the size of the object, or the size  and  offset  of
       the field in the user-defined structure that is to be modified.

       The TX_ADD_FIELD() macro saves the current value of given FIELD of the object referenced by a handle o in
       the undo log.  The application is then free to directly modify the specified FIELD.  In case of a failure
       or abort, the saved value will be restored.

       The  TX_XADD_FIELD()  macro works exactly like TX_ADD_FIELD when flags equals 0.  The flags argument is a
       bitmask of values described in pmemobj_tx_xadd_range, above.

       The TX_ADD() macro takes a “snapshot” of the entire object referenced by object handle o and saves it  in
       the  undo  log.   The  object size is determined from its TYPE.  The application is then free to directly
       modify the object.  In case of a failure or abort, all the changes within the object will be rolled back.

       The TX_XADD() macro works exactly like TX_ADD when flags equals 0.  The flags argument is  a  bitmask  of
       values as described in pmemobj_tx_xadd_range, above.

       The  TX_ADD_FIELD_DIRECT()  macro  saves the current value of the given FIELD of the object referenced by
       (direct) pointer p in the undo log.  The application is then free to directly modify the specified FIELD.
       In case of a failure or abort, the saved value will be restored.

       The  TX_XADD_FIELD_DIRECT()  macro works exactly like TX_ADD_FIELD_DIRECT when flags equals 0.  The flags
       argument is a bitmask of values as described in pmemobj_tx_xadd_range_direct, above.

       The TX_ADD_DIRECT() macro takes a “snapshot” of the entire object referenced by (direct)  pointer  p  and
       saves  it in the undo log.  The object size is determined from its TYPE.  The application is then free to
       directly modify the object.  In case of a failure or abort, all the changes within  the  object  will  be
       rolled back.

       The TX_XADD_DIRECT() macro works exactly like TX_ADD_DIRECT when flags equals 0.  The flags argument is a
       bitmask of values as described in pmemobj_tx_xadd_range_direct, above.

       The TX_SET() macro saves the current value of the given FIELD of the object referenced by handle o in the
       undo log, and then sets its new VALUE.  In case of a failure or abort, the saved value will be restored.

       The TX_SET_DIRECT() macro saves in the undo log the current value of given FIELD of the object referenced
       by (direct) pointer p, and then set its new VALUE.  In case of a failure or abort, the saved  value  will
       be restored.

       The  TX_MEMCPY()  macro  saves in the undo log the current content of dest buffer and then overwrites the
       first num bytes of its memory area with the data copied from the buffer pointed by src.   In  case  of  a
       failure or abort, the saved value will be restored.

       The  TX_MEMSET()  macro  saves  the current content of the dest buffer in the undo log and then fills the
       first num bytes of its memory area with the constant byte c.  In case of a failure or  abort,  the  saved
       value will be restored.

RETURN VALUE

       On  success,  pmemobj_tx_add_range() and pmemobj_tx_add_range_direct() return 0.  Otherwise, the stage is
       changed to TX_STAGE_ONABORT, errno is set appropriately and transaction is aborted.

       On success, pmemobj_tx_xadd_range() and pmemobj_tx_xadd_range_direct() returns 0.  Otherwise,  the  error
       number  is  returned,  errno  is set and when flags do not contain POBJ_XADD_NO_ABORT, the transaction is
       aborted.

SEE ALSO

       pmemobj_tx_alloc(3), pmemobj_tx_begin(3), libpmemobj(7) and <https://pmem.io>