Provided by: libpmemobj-dev_1.4.1-0ubuntu1~18.04.1_amd64 bug

NAME

       pmemobj_memcpy_persist(), pmemobj_memset_persist(), pmemobj_persist(), pmemobj_flush(), pmemobj_drain() -
       low-level memory manipulation functions

SYNOPSIS

              #include <libpmemobj.h>

              void *pmemobj_memcpy_persist(PMEMobjpool *pop, void *dest,
                  const void *src, size_t len);
              void *pmemobj_memset_persist(PMEMobjpool *pop, void *dest,
                  int c, size_t len);
              void pmemobj_persist(PMEMobjpool *pop, const void *addr,
                  size_t len);
              void pmemobj_flush(PMEMobjpool *pop, const void *addr,
                  size_t len);
              void pmemobj_drain(PMEMobjpool *pop);

DESCRIPTION

       The libpmemobj-specific low-level memory manipulation functions described here leverage the knowledge  of
       the  additional  configuration options available for libpmemobj(7) pools, such as replication.  They also
       take advantage of the type of storage behind the pool and use appropriate flush/drain functions.   It  is
       advised  to  use  these  functions  in conjunction with libpmemobj(7) objects rather than using low-level
       memory manipulation functions from libpmem.

       The pmemobj_memcpy_persist() and pmemobj_memset_persist() functions provide the same  memory  copying  as
       their  namesakes  memcpy(3),  and  memset(3),  and ensure that the result has been flushed to persistence
       before returning.

       pmemobj_persist() forces any changes in the range [addr, addr+len) to be  stored  durably  in  persistent
       memory.   Internally  this  may  call  either  pmem_msync(3)  or pmem_persist(3).  There are no alignment
       restrictions on the range described by addr and len,  but  pmemobj_persist()  may  expand  the  range  as
       necessary to meet platform alignment requirements.

              WARNING:  Like  msync(2), there is nothing atomic or transactional about this call.  Any unwritten
              stores in the given range will be written, but some stores may have already been written by virtue
              of  normal  cache eviction/replacement policies.  Correctly written code must not depend on stores
              waiting until pmemobj_persist() is called to become persistent - they can become persistent at any
              time before pmemobj_persist() is called.

       The  pmemobj_flush()  and  pmemobj_drain()  functions  provide  partial versions of the pmemobj_persist()
       function described above.  These functions allow advanced programs to  create  their  own  variations  of
       pmemobj_persist().   For  example,  a  program  that needs to flush several discontiguous ranges can call
       pmemobj_flush() for each range and then follow up by calling pmemobj_drain() once.  For more  information
       on partial flushing operations, see pmem_flush(3).

RETURN VALUE

       The  pmemobj_memcpy_persist()  and  pmemobj_memset_persist()  functions  return  the same values as their
       namesakes memcpy(3), and memset(3).

       pmemobj_persist(), pmemobj_flush() and pmemobj_drain() return no value.

EXAMPLES

       The following code is functionally equivalent to pmemobj_memcpy_persist():

              void *
              pmemobj_memcpy_persist(PMEMobjpool *pop, void *dest,
                  const void *src, size_t len)
              {
                  void *retval = memcpy(dest, src, len);

                  pmemobj_persist(pop, dest, len);

                  return retval;
              }

       pmemobj_persist() can be thought of as this:

              void
              pmemobj_persist(PMEMobjpool *pop, const void *addr, size_t len)
              {
                  /* flush the processor caches */
                  pmemobj_flush(pop, addr, len);

                  /* wait for any pmem stores to drain from HW buffers */
                  pmemobj_drain(pop);
              }

SEE ALSO

       memcpy(3), memset(3), pmem_msync(3), pmem_persist(3), libpmem(7) libpmemobj(7) and <http://pmem.io>