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

NAME

       pmem_memmove_persist(),     pmem_memcpy_persist(),     pmem_memset_persist(),     pmem_memmove_nodrain(),
       pmem_memcpy_nodrain(), pmem_memset_nodrain() - functions that provide  optimized  copying  to  persistent
       memory

SYNOPSIS

              #include <libpmem.h>

              void *pmem_memmove_persist(void *pmemdest, const void *src, size_t len);
              void *pmem_memcpy_persist(void *pmemdest, const void *src, size_t len);
              void *pmem_memset_persist(void *pmemdest, int c, size_t len);
              void *pmem_memmove_nodrain(void *pmemdest, const void *src, size_t len);
              void *pmem_memcpy_nodrain(void *pmemdest, const void *src, size_t len);
              void *pmem_memset_nodrain(void *pmemdest, int c, size_t len);

DESCRIPTION

       The  pmem_memmove_persist(), pmem_memcpy_persist(), and pmem_memset_persist(), functions provide the same
       memory copying as their namesakes memmove(3), memcpy(3) and memset(3), and ensure  that  the  result  has
       been flushed to persistence before returning.  For example, the following code is functionally equivalent
       to pmem_memmove_persist():

              void *
              pmem_memmove_persist(void *pmemdest, const void *src, size_t len)
              {
                  void *retval = memmove(pmemdest, src, len);

                  pmem_persist(pmemdest, len);

                  return retval;
              }

       Calling  pmem_memmove_persist()  may  out-perform  the  above  code,  however,   since   the   libpmem(7)
       implementation  may  take  advantage  of the fact that pmemdest is persistent memory and use instructions
       such as non-temporal stores to avoid the need to flush processor caches.

              WARNING: Using these functions where pmem_is_pmem(3) returns false may  not  do  anything  useful.
              Use the normal libc functions in that case.

       The  pmem_memmove_nodrain(),  pmem_memcpy_nodrain()  and  pmem_memset_nodrain()  functions are similar to
       pmem_memmove_persist(), pmem_memcpy_persist(), and pmem_memset_persist()  described  above,  except  they
       skip  the  final  pmem_drain() step.  This allows applications to optimize cases where several ranges are
       being copied to persistent memory, followed by a single call  to  pmem_drain().   The  following  example
       illustrates  how  these  functions  might  be  used  to avoid multiple calls to pmem_drain() when copying
       several ranges of memory to pmem:

              /* ... write several ranges to pmem ... */
              pmem_memcpy_nodrain(pmemdest1, src1, len1);
              pmem_memcpy_nodrain(pmemdest2, src2, len2);

              /* ... */

              /* wait for any pmem stores to drain from HW buffers */
              pmem_drain();

RETURN VALUE

       The   pmem_memmove_persist(),   pmem_memcpy_persist(),   pmem_memset_persist(),   pmem_memmove_nodrain(),
       pmem_memcpy_nodrain() and pmem_memset_nodrain() functions return the address of the destination.

CAVEATS

       After   calling   any   of  the  _nodrain  functions  (pmem_memmove_nodrain(),  pmem_memcpy_nodrain()  or
       pmem_memset_nodrain()) you should not expect memory  to  be  visible  to  other  threads  before  calling
       pmem_drain(3)  or  any  of  the _persist functions.  This is because those functions may use non-temporal
       store instructions, which are weakly ordered.  See “Intel 64 and IA-32 Architectures Software Developer's
       Manual”, Volume 1, “Caching of Temporal vs. Non-Temporal Data” section for details.

SEE ALSO

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