1PMEMOBJ_ALLOC(3)           PMDK Programmer's Manual           PMEMOBJ_ALLOC(3)
2
3
4

NAME

6       pmemobj_alloc(), pmemobj_xalloc(), pmemobj_zalloc(), pmemobj_realloc(),
7       pmemobj_zrealloc(),  pmemobj_strdup(),  pmemobj_wcsdup(),   pmemobj_al‐
8       loc_usable_size(),  POBJ_NEW(),  POBJ_ALLOC(),  POBJ_ZNEW(),  POBJ_ZAL‐
9       LOC(), POBJ_REALLOC(), POBJ_ZREALLOC(), POBJ_FREE() - non-transactional
10       atomic allocations
11

SYNOPSIS

13              #include <libpmemobj.h>
14
15              typedef int (*pmemobj_constr)(**PMEMobjpool *pop, void *ptr, void *arg);
16              int pmemobj_alloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
17                  uint64_t type_num, pmemobj_constr constructor, void *arg);
18              int pmemobj_xalloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
19                  uint64_t type_num, uint64_t flags, pmemobj_constr constructor,
20                  void *arg); (EXPERIMENTAL)
21              int pmemobj_zalloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
22                  uint64_t type_num);
23              void pmemobj_free(PMEMoid *oidp);
24              int pmemobj_realloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
25                  uint64_t type_num);
26              int pmemobj_zrealloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
27                  uint64_t type_num);
28              int pmemobj_strdup(PMEMobjpool *pop, PMEMoid *oidp, const char *s,
29                  uint64_t type_num);
30              int pmemobj_wcsdup(PMEMobjpool *pop, PMEMoid *oidp, const wchar_t *s,
31                  uint64_t type_num);
32              size_t pmemobj_alloc_usable_size(PMEMoid oid);
33
34              POBJ_NEW(PMEMobjpool *pop, TOID *oidp, TYPE, pmemobj_constr constructor,
35                  void *arg)
36              POBJ_ALLOC(PMEMobjpool *pop, TOID *oidp, TYPE, size_t size,
37                  pmemobj_constr constructor, void *arg)
38              POBJ_ZNEW(PMEMobjpool *pop, TOID *oidp, TYPE)
39              POBJ_ZALLOC(PMEMobjpool *pop, TOID *oidp, TYPE, size_t size)
40              POBJ_REALLOC(PMEMobjpool *pop, TOID *oidp, TYPE, size_t size)
41              POBJ_ZREALLOC(PMEMobjpool *pop, TOID *oidp, TYPE, size_t size)
42              POBJ_FREE(TOID *oidp)
43

DESCRIPTION

45       Functions described in this document provide the mechanism to allocate,
46       resize  and  free  objects  from  the  persistent  memory  pool  in   a
47       thread-safe and fail-safe manner.  All the routines are atomic with re‐
48       spect to other threads and any power-fail  interruptions.   If  any  of
49       these  operations is torn by program failure or system crash, on recov‐
50       ery they are guaranteed to be entirely completed or discarded,  leaving
51       the  persistent memory heap and internal object containers in a consis‐
52       tent state.
53
54       All these functions can be used outside transactions.  Note that opera‐
55       tions  performed using the non-transactional API are considered durable
56       after completion, even if executed within an  open  transaction.   Such
57       non-transactional changes will not be rolled back if the transaction is
58       aborted or interrupted.
59
60       The allocations are always aligned to a cache-line boundary.
61
62       The pmemobj_constr type represents a constructor for atomic  allocation
63       from  the  persistent memory heap associated with memory pool pop.  ptr
64       is a pointer to the allocated memory area and arg is a user-defined ar‐
65       gument passed to the constructor.
66
67       The pmemobj_alloc() function allocates a new object from the persistent
68       memory heap associated with memory pool pop.  The PMEMoid of the  allo‐
69       cated  object is stored in oidp.  If oidp is NULL, then the newly allo‐
70       cated object may be accessed only by iterating objects  in  the  object
71       container  associated  with  the  type number type_num, as described in
72       POBJ_FOREACH(3).  If oidp points to a memory location from the  pmemobj
73       heap,  oidp  is modified atomically.  Before returning, pmemobj_alloc()
74       calls the constructor function, passing the pool handle pop, the point‐
75       er  to  the newly allocated object in ptr, and the arg argument.  It is
76       guaranteed that the allocated object is either properly initialized, or
77       if  the allocation is interrupted before the constructor completes, the
78       memory space reserved for the object is reclaimed.   size  can  be  any
79       non-zero  value;  however, due to internal padding and object metadata,
80       the actual size of the allocation will differ from the  requested  size
81       by  at  least  64 bytes.  For this reason, making allocations of a size
82       less than 64 bytes is extremely inefficient and discouraged.  The allo‐
83       cated  object  is  added  to  the  internal  container  associated with
84       type_num.
85
86       pmemobj_xalloc() is equivalent to pmemobj_alloc(), but  with  an  addi‐
87       tional flags argument that is a bitmask of the following values:
88
89       · POBJ_XALLOC_ZERO  -  zero  the allocated object (equivalent of pmemo‐
90         bj_zalloc())
91
92       · POBJ_CLASS_ID(class_id) - allocate  an  object  from  the  allocation
93         class class_id.  The class id cannot be 0.
94
95       · POBJ_ARENA_ID(arena_id) - allocate an object from the arena specified
96         by arena_id.  The arena must exist, otherwise, the behavior is  unde‐
97         fined.   If  arena_id  is equal 0, then arena assigned to the current
98         thread will be used.
99
100       The pmemobj_zalloc() function allocates a new zeroed  object  from  the
101       persistent memory heap associated with memory pool pop.  The PMEMoid of
102       the allocated object is stored in oidp.  If oidp is NULL, then the new‐
103       ly  allocated  object  may be accessed only by iterating objects in the
104       object container associated with the type number type_num, as described
105       in POBJ_FOREACH(3).  If oidp points to a memory location from the pmem‐
106       obj heap, oidp is modified atomically.  size can be any non-zero value;
107       however,  due  to internal padding and object metadata, the actual size
108       of the allocation will differ from the requested one  by  at  least  64
109       bytes.   For  this  reason,  making  allocations of a size less than 64
110       bytes is extremely inefficient and discouraged.  The  allocated  object
111       is added to the internal container associated with type_num.
112
113       The pmemobj_free() function frees the memory space represented by oidp,
114       which must have been allocated by a previous call  to  pmemobj_alloc(),
115       pmemobj_xalloc(),  pmemobj_zalloc(), pmemobj_realloc(), or pmemobj_zre‐
116       alloc().  pmemobj_free() provides the same semantics  as  free(3),  but
117       instead of operating on the process heap supplied by the system, it op‐
118       erates on the persistent memory heap.  If oidp is OID_NULL,  no  opera‐
119       tion  is  performed.   If  oidp is NULL or if it points to the root ob‐
120       ject's OID, the behavior of pmemobj_free() is undefined.  oidp  is  set
121       to  OID_NULL after the memory is freed.  If oidp points to a memory lo‐
122       cation from the pmemobj heap, oidp is modified atomically.
123
124       The pmemobj_realloc() function changes the size of  the  object  repre‐
125       sented  by  oidp to size bytes.  pmemobj_realloc() provides similar se‐
126       mantics to realloc(3), but operates on the persistent memory heap asso‐
127       ciated with memory pool pop.  The resized object is also added or moved
128       to the internal container associated with type  number  type_num.   The
129       contents will be unchanged in the range from the start of the region up
130       to the minimum of the old and new sizes.  If the  new  size  is  larger
131       than  the  old size, the added memory will not be initialized.  If oidp
132       is OID_NULL, then the call is equivalent  to  pmemobj_alloc(pop,  size,
133       type_num).   If  size  is equal to zero, and oidp is not OID_NULL, then
134       the call is equivalent to pmemobj_free(oid).  Unless oidp is  OID_NULL,
135       it  must  have  been  allocated  by an earlier call to pmemobj_alloc(),
136       pmemobj_xalloc(), pmemobj_zalloc(), pmemobj_realloc(), or  pmemobj_zre‐
137       alloc().   Note  that the object handle value may change as a result of
138       reallocation.  If the object was moved, the memory space represented by
139       oid is reclaimed.  If oidp points to a memory location from the pmemobj
140       heap, oidp is modified atomically.  If oidp is NULL or if it points  to
141       the root object's OID, the behavior of pmemobj_realloc() is undefined.
142
143       pmemobj_zrealloc()  is  equivalent to pmemobj_realloc(), except that if
144       the new size is larger than the old size, the added memory will be  ze‐
145       roed.
146
147       The  pmemobj_strdup()  function stores a handle to a new object in oidp
148       which is a duplicate of the string s.   pmemobj_strdup()  provides  the
149       same semantics as strdup(3), but operates on the persistent memory heap
150       associated with memory pool pop.  If oidp is NULL, then the newly allo‐
151       cated  object  may  be accessed only by iterating objects in the object
152       container  associated  with  type  number  type_num,  as  described  in
153       POBJ_FOREACH(3).   If oidp points to a memory location from the pmemobj
154       heap, oidp is modified atomically.  The allocated string object is also
155       added  to  the internal container associated with type number type_num.
156       Memory for the new string is obtained with pmemobj_alloc(), on the giv‐
157       en memory pool, and can be freed with pmemobj_free() on the same memory
158       pool.
159
160       pmemobj_wcsdup() is equivalent to pmemobj_strdup(), but operates  on  a
161       wide  character  string  (wchar_t)  rather  than  a  standard character
162       string.
163
164       The pmemobj_alloc_usable_size() function provides the same semantics as
165       malloc_usable_size(3),  but instead of the process heap supplied by the
166       system, it operates on the persistent memory heap.
167
168       The POBJ_NEW() macro is a wrapper around the pmemobj_alloc()  function.
169       Instead of taking a pointer to PMEMoid, it takes a pointer to the typed
170       OID of type name TYPE, and passes the size and  type  number  from  the
171       typed OID to pmemobj_alloc().
172
173       The  POBJ_ALLOC()  macro is equivalent to POBJ_NEW, except that instead
174       of using the size of the typed OID, passes size to pmemobj_alloc().
175
176       The POBJ_ZNEW() macro is a wrapper around  the  pmemobj_zalloc()  func‐
177       tion.   Instead  of  taking a pointer to PMEMoid, it takes a pointer to
178       the typed OID of type name TYPE, and passes the size  and  type  number
179       from the typed OID to pmemobj_zalloc().
180
181       The POBJ_ZALLOC() macro is equivalent to POBJ_ZNEW, except that instead
182       of using the size of the typed OID, passes size to pmemobj_zalloc().
183
184       The POBJ_REALLOC() macro is  a  wrapper  around  the  pmemobj_realloc()
185       function.   Instead  of taking a pointer to PMEMoid, it takes a pointer
186       to the typed OID of type name TYPE, and passes the type number from the
187       typed OID to pmemobj_realloc().
188
189       The  POBJ_ZREALLOC()  macro  is a wrapper around the pmemobj_zrealloc()
190       function.  Instead of taking a pointer to PMEMoid, it takes  a  pointer
191       to the typed OID of type name TYPE, and passes the type number from the
192       typed OID to pmemobj_zrealloc().
193
194       The POBJ_FREE() macro is a wrapper around the  pmemobj_free()  function
195       which takes a pointer to the typed OID instead of to PMEMoid.
196

RETURN VALUE

198       On  success,  pmemobj_alloc()  and pmemobj_xalloc return 0.  If oidp is
199       not NULL, the PMEMoid of the newly allocated object is stored in  oidp.
200       If the allocation fails, -1 is returned and errno is set appropriately.
201       If the constructor returns a non-zero value,  the  allocation  is  can‐
202       celed,  -1  is returned, and errno is set to ECANCELED.  If size equals
203       0, or the flags for pmemobj_xalloc are invalid, -1 is  returned,  errno
204       is set to EINVAL, and oidp is left untouched.
205
206       On success, pmemobj_zalloc() returns 0.  If oidp is not NULL, the PMEM‐
207       oid of the newly allocated object is stored in oidp.  If the allocation
208       fails,  it  returns -1 and sets errno appropriately.  If size equals 0,
209       it returns -1, sets errno to EINVAL, and leaves oidp untouched.
210
211       The pmemobj_free() function returns no value.
212
213       On success, pmemobj_realloc() and pmemobj_zrealloc() return 0  and  up‐
214       date  oidp if necessary.  On error, they return -1 and set errno appro‐
215       priately.
216
217       On success, pmemobj_strdup() and pmemobj_wcsdup() return 0.  If oidp is
218       not  NULL,  the  PMEMoid  of  the duplicated string object is stored in
219       oidp.  If s is NULL, they return -1, set errno  to  EINVAL,  and  leave
220       oidp  untouched.   On other errors, they return -1 and set errno appro‐
221       priately.
222
223       The pmemobj_alloc_usable_size() function returns the number  of  usable
224       bytes in the object represented by oid.  If oid is OID_NULL, it returns
225       0.
226

SEE ALSO

228       free(3), POBJ_FOREACH(3), realloc(3), strdup(3),  wcsdup(3),  libpmemo‐
229       bj(7) and <http://pmem.io>
230
231
232
233PMDK - pmemobj API version 2.3    2019-03-01                  PMEMOBJ_ALLOC(3)
Impressum