]> git.proxmox.com Git - ceph.git/blob - ceph/src/pmdk/src/libpmemobj/pmemops.h
import ceph 16.2.7
[ceph.git] / ceph / src / pmdk / src / libpmemobj / pmemops.h
1 /* SPDX-License-Identifier: BSD-3-Clause */
2 /* Copyright 2016-2020, Intel Corporation */
3
4 #ifndef LIBPMEMOBJ_PMEMOPS_H
5 #define LIBPMEMOBJ_PMEMOPS_H 1
6
7 #include <stddef.h>
8 #include <stdint.h>
9 #include "util.h"
10
11 #ifdef __cplusplus
12 extern "C" {
13 #endif
14
15 typedef int (*persist_fn)(void *base, const void *, size_t, unsigned);
16 typedef int (*flush_fn)(void *base, const void *, size_t, unsigned);
17 typedef void (*drain_fn)(void *base);
18
19 typedef void *(*memcpy_fn)(void *base, void *dest, const void *src, size_t len,
20 unsigned flags);
21 typedef void *(*memmove_fn)(void *base, void *dest, const void *src, size_t len,
22 unsigned flags);
23 typedef void *(*memset_fn)(void *base, void *dest, int c, size_t len,
24 unsigned flags);
25
26 typedef int (*remote_read_fn)(void *ctx, uintptr_t base, void *dest, void *addr,
27 size_t length);
28
29 struct pmem_ops {
30 /* for 'master' replica: with or without data replication */
31 persist_fn persist; /* persist function */
32 flush_fn flush; /* flush function */
33 drain_fn drain; /* drain function */
34 memcpy_fn memcpy; /* persistent memcpy function */
35 memmove_fn memmove; /* persistent memmove function */
36 memset_fn memset; /* persistent memset function */
37 void *base;
38
39 struct remote_ops {
40 remote_read_fn read;
41
42 void *ctx;
43 uintptr_t base;
44 } remote;
45 };
46
47 static force_inline int
48 pmemops_xpersist(const struct pmem_ops *p_ops, const void *d, size_t s,
49 unsigned flags)
50 {
51 return p_ops->persist(p_ops->base, d, s, flags);
52 }
53
54 static force_inline void
55 pmemops_persist(const struct pmem_ops *p_ops, const void *d, size_t s)
56 {
57 (void) pmemops_xpersist(p_ops, d, s, 0);
58 }
59
60 static force_inline int
61 pmemops_xflush(const struct pmem_ops *p_ops, const void *d, size_t s,
62 unsigned flags)
63 {
64 return p_ops->flush(p_ops->base, d, s, flags);
65 }
66
67 static force_inline void
68 pmemops_flush(const struct pmem_ops *p_ops, const void *d, size_t s)
69 {
70 (void) pmemops_xflush(p_ops, d, s, 0);
71 }
72
73 static force_inline void
74 pmemops_drain(const struct pmem_ops *p_ops)
75 {
76 p_ops->drain(p_ops->base);
77 }
78
79 static force_inline void *
80 pmemops_memcpy(const struct pmem_ops *p_ops, void *dest,
81 const void *src, size_t len, unsigned flags)
82 {
83 return p_ops->memcpy(p_ops->base, dest, src, len, flags);
84 }
85
86 static force_inline void *
87 pmemops_memmove(const struct pmem_ops *p_ops, void *dest,
88 const void *src, size_t len, unsigned flags)
89 {
90 return p_ops->memmove(p_ops->base, dest, src, len, flags);
91 }
92
93 static force_inline void *
94 pmemops_memset(const struct pmem_ops *p_ops, void *dest, int c,
95 size_t len, unsigned flags)
96 {
97 return p_ops->memset(p_ops->base, dest, c, len, flags);
98 }
99
100 #ifdef __cplusplus
101 }
102 #endif
103
104 #endif