#ifndef LIBPMEMOBJ_PMEMOPS_H
#define LIBPMEMOBJ_PMEMOPS_H 1
#include <stddef.h>
#include <stdint.h>
typedef void (*persist_fn)(void *base, const void *, size_t);
typedef void (*flush_fn)(void *base, const void *, size_t);
typedef void (*drain_fn)(void *base);
typedef void *(*memcpy_fn)(void *base, void *dest, const void *src, size_t len);
typedef void *(*memset_fn)(void *base, void *dest, int c, size_t len);
typedef int (*remote_read_fn)(void *ctx, uintptr_t base, void *dest, void *addr,
size_t length);
struct pmem_ops {
persist_fn persist;
flush_fn flush;
drain_fn drain;
memcpy_fn memcpy_persist;
memset_fn memset_persist;
void *base;
struct remote_ops {
remote_read_fn read;
void *ctx;
uintptr_t base;
} remote;
};
#ifdef _MSC_VER
#define force_inline inline
#else
#define force_inline __attribute__((always_inline)) inline
#endif
static force_inline void
pmemops_persist(const struct pmem_ops *p_ops, const void *d, size_t s)
{
p_ops->persist(p_ops->base, d, s);
}
static force_inline void
pmemops_flush(const struct pmem_ops *p_ops, const void *d, size_t s)
{
p_ops->flush(p_ops->base, d, s);
}
static force_inline void
pmemops_drain(const struct pmem_ops *p_ops)
{
p_ops->drain(p_ops->base);
}
static force_inline void *
pmemops_memcpy_persist(const struct pmem_ops *p_ops, void *dest,
const void *src, size_t len)
{
return p_ops->memcpy_persist(p_ops->base, dest, src, len);
}
static force_inline void *
pmemops_memset_persist(const struct pmem_ops *p_ops, void *dest, int c,
size_t len)
{
return p_ops->memset_persist(p_ops->base, dest, c, len);
}
#endif