diff --git a/doc/libpmemobj.3 b/doc/libpmemobj.3
index 6295a26d86800c5038ab8f41978484292dd9120c..0485b141b5aa595e7d0623f9d64d54eb32e12c92 100644
--- a/doc/libpmemobj.3
+++ b/doc/libpmemobj.3
@@ -37,14 +37,14 @@
.\" or
.\" groff -man -Tascii libpmemobj.3
.\"
-.TH libpmemobj 3 "pmemobj API version 0.4.4" "NVM Library"
+.TH libpmemobj 3 "pmemobj API version 0.4.5" "NVM Library"
.SH NAME
libpmemobj \- persistent memory transactional object store
.SH SYNOPSIS
.nf
.B #include <libpmemobj.h>
.sp
-.B cc ... -lpmemobj -lpmem
+.B cc -std=gnu99 ... -lpmemobj -lpmem
.sp
.B Most commonly used functions:
.sp
@@ -80,7 +80,7 @@ libpmemobj \- persistent memory transactional object store
.BI "int pmemobj_rwlock_timedwrlock(PMEMobjpool *" pop ,
.BI " PMEMrwlock *restrict " rwlockp ,
.BI " const struct timespec *restrict " abstime );
-.BI "int pmemobj_rwlock_tryrdlock(PMEMobjpool *" pop ", PMEMrwlock * "rwlockp );
+.BI "int pmemobj_rwlock_tryrdlock(PMEMobjpool *" pop ", PMEMrwlock *"rwlockp );
.BI "int pmemobj_rwlock_trywrlock(PMEMobjpool *" pop ", PMEMrwlock *" rwlockp );
.BI "int pmemobj_rwlock_unlock(PMEMobjpool *" pop ", PMEMrwlock *" rwlockp );
.sp
@@ -92,49 +92,87 @@ libpmemobj \- persistent memory transactional object store
.BI "int pmemobj_cond_wait(PMEMobjpool *" pop ", PMEMcond *" condp ,
.BI " PMEMmutex *restrict " mutexp );
.sp
+.B Persistent object identifier:
+.sp
+.BI "OID_IS_NULL(PMEMoid " oid )
+.BI "OID_EQUALS(PMEMoid " lhs ", PMEMoid " rhs )
+.sp
+.B Type-safety:
+.sp
+.BI "TOID(" TYPE )
+.BI "TOID_DECLARE(" TYPE ", unsigned int " type_num )
+.BI "TOID_DECLARE_ROOT(" ROOT_TYPE )
+.sp
+.BI "TOID_TYPE_NUM(" TYPE )
+.BI "TOID_TYPE_NUM_OF(TOID " oid ")
+.BI "TOID_VALID(TOID " oid ")
+.sp
+.BI "TOID_ASSIGN(TOID " oid ", " VALUE )
+.sp
+.BI "TOID_IS_NULL(TOID " oid )
+.BI "TOID_EQUALS(TOID " lhs ", TOID " rhs )
+.BI "DIRECT_RW(TOID " oid )
+.BI "DIRECT_RO(TOID " oid )
+.BI "D_RW(TOID " oid )
+.BI "D_RO(TOID " oid )
+.sp
+.B Layout declaration:
+.sp
+.BI "POBJ_LAYOUT_BEGIN(" layout )
+.BI "POBJ_LAYOUT_TOID(" layout ", " type )
+.BI "POBJ_LAYOUT_ROOT(" layout ", " root_type )
+.BI "POBJ_LAYOUT_END(" layout )
+.BI "POBJ_LAYOUT_NAME(" layout )
+.BI "POBJ_LAYOUT_TYPES_NUM(" layout )
+.sp
.B Non-transactional atomic allocations:
.sp
-.BI "PMEMoid pmemobj_alloc(PMEMobjpool *" pop ", size_t " size ", unsigned int " type_num );
-.BI "PMEMoid pmemobj_alloc_construct(PMEMobjpool *" pop ", size_t " size ", unsigned int " type_num ,
-.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg );
-.BI "PMEMoid pmemobj_zalloc(PMEMobjpool *" pop ", size_t " size ", unsigned int " type_num );
-.BI "PMEMoid pmemobj_realloc(PMEMobjpool *" pop ", PMEMoid " oid ", size_t " size ,
+.BI "int pmemobj_alloc(PMEMobjpool *" pop ", PMEMoid *" oidp ", size_t " size ",
+.BI " unsigned int " type_num ", void (*" constructor ")(void *" ptr ", void *" arg "),
+.BI " void *" arg );
+.BI "int pmemobj_zalloc(PMEMobjpool *" pop ", PMEMoid *" oidp ", size_t " size ", "
.BI " unsigned int " type_num );
-.BI "PMEMoid pmemobj_zrealloc(PMEMobjpool *" pop ", PMEMoid " oid ", size_t " size ,
+.BI "int pmemobj_realloc(PMEMobjpool *" pop ", PMEMoid *" oidp ", size_t " size ,
.BI " unsigned int " type_num );
-.BI "PMEMoid pmemobj_strdup(PMEMobjpool *" pop ", const char *" s ", unsigned int " type_num );
-.BI "void pmemobj_free(PMEMoid " oid );
+.BI "int pmemobj_zrealloc(PMEMobjpool *" pop ", PMEMoid *" oidp ", size_t " size ,
+.BI " unsigned int " type_num );
+.BI "int pmemobj_strdup(PMEMobjpool *" pop ", PMEMoid *" oidp ", const char *" s ", "
+.BI " unsigned int " type_num );
+.BI "void pmemobj_free(PMEMoid *" oidp );
.BI "size_t pmemobj_alloc_usable_size(PMEMoid " oid );
.BI "void *pmemobj_direct(PMEMoid " oid );
+.BI "unsigned int pmemobj_type_num(PMEMoid" oid );
.sp
-.B Type-safety
-.sp
-.BI "OID_TYPE(" TYPE )
-.sp
-.BI "OID_ASSIGN(OID_TYPE " oid ", " VALUE )
-.BI "OID_ASSIGN_TYPED(OID_TYPE " lhs ", OID_TYPE " rhs )
-.sp
-.BI "OID_IS_NULL(OID_TYPE " oid )
-.BI "OID_EQUALS(OID_TYPE " lhs ", OID_TYPE " rhs )
-.BI "DIRECT_RW(OID_TYPE " oid )
-.BI "DIRECT_RO(OID_TYPE " oid )
-.BI "D_RW(OID_TYPE " oid )
-.BI "D_RO(OID_TYPE " oid )
+.BI "POBJ_NEW(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, "
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
+.BI "POBJ_ALLOC(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, size_t " size ", "
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
+.BI "POBJ_ZNEW(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, "
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
+.BI "POBJ_ZALLOC(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, size_t " size ")
+.BI "POBJ_REALLOC(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, size_t " size )
+.BI "POBJ_ZREALLOC(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, size_t " size )
+.BI "POBJ_FREE(PMEMobjpool *" pop ", TOID(TYPE) *" oidp " )
.sp
.B Root object management:
.sp
.BI "PMEMoid pmemobj_root(PMEMobjpool *" pop ", size_t " size );
.BI "size_t pmemobj_root_size(PMEMobjpool *" pop );
.sp
+.BI "POBJ_ROOT(PMEMobjpool *" pop ", " TYPE )
+.sp
.B Object containers:
.sp
.BI "PMEMoid pmemobj_first(PMEMobjpool *" pop ", unsigned int " type_num );
.BI "PMEMoid pmemobj_next(PMEMoid " oid );
.sp
-.BI "PMEMOBJ_FOREACH(PMEMobjpool *" pop ", PMEMoid " varoid ", int " vartype_num );
-.BI "PMEMOBJ_FOREACH_SAFE(PMEMobjpool *" pop ", PMEMoid " varoid ", PMEMoid " nvaroid ", int " vartype_num );
-.BI "PMEMOBJ_FOREACH_TYPE(PMEMobjpool *" pop ", OID_TYPE " var ", unsigned int " type_num );
-.BI "PMEMOBJ_FOREACH_SAFE_TYPE(PMEMobjpool *" pop ", OID_TYPE " var ", OID_TYPE " nvar ", unsigned int " type_num );
+.BI "POBJ_FIRST(PMEMobjpool *" pop ", " TYPE )
+.BI "POBJ_NEXT(TOID " oid )
+.sp
+.BI "PMEMOBJ_FOREACH(PMEMobjpool *" pop ", PMEMoid " varoid ", int " vartype_num )
+.BI "PMEMOBJ_FOREACH_SAFE(PMEMobjpool *" pop ", PMEMoid " varoid ", PMEMoid " nvaroid ", int " vartype_num )
+.BI "PMEMOBJ_FOREACH_TYPE(PMEMobjpool *" pop ", TOID " var )
+.BI "PMEMOBJ_FOREACH_SAFE_TYPE(PMEMobjpool *" pop ", TOID " var ", TOID " nvar )
.sp
.B Non-transactional persistent atomic circular doubly-linked list:
.sp
@@ -155,41 +193,41 @@ libpmemobj \- persistent memory transactional object store
.BI "POBJ_LIST_FIRST(POBJ_LIST_HEAD *" head )
.BI "POBJ_LIST_LAST(POBJ_LIST_HEAD *" head ", POBJ_LIST_ENTRY " FIELD )
.BI "POBJ_LIST_EMPTY(POBJ_LIST_HEAD *" head )
-.BI "POBJ_LIST_NEXT(OID_TYPE " elm ", POBJ_LIST_ENTRY " FIELD )
-.BI "POBJ_LIST_PREV(OID_TYPE " elm ", POBJ_LIST_ENTRY " FIELD )
+.BI "POBJ_LIST_NEXT(TOID " elm ", POBJ_LIST_ENTRY " FIELD )
+.BI "POBJ_LIST_PREV(TOID " elm ", POBJ_LIST_ENTRY " FIELD )
.sp
-.BI "POBJ_LIST_FOREACH(OID_TYPE " var ", POBJ_LIST_HEAD *" head ", POBJ_LIST_ENTRY " FIELD )
-.BI "POBJ_LIST_FOREACH_REVERSE(OID_TYPE " var ", POBJ_LIST_HEAD *" head ", POBJ_LIST_ENTRY " FIELD )
+.BI "POBJ_LIST_FOREACH(TOID " var ", POBJ_LIST_HEAD *" head ", POBJ_LIST_ENTRY " FIELD )
+.BI "POBJ_LIST_FOREACH_REVERSE(TOID " var ", POBJ_LIST_HEAD *" head ", POBJ_LIST_ENTRY " FIELD )
.sp
.BI "POBJ_LIST_INSERT_HEAD(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " OID_TYPE " elm ", POBJ_LIST_ENTRY " FIELD )
+.BI " TOID " elm ", POBJ_LIST_ENTRY " FIELD )
.BI "POBJ_LIST_INSERT_TAIL(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " OID_TYPE " elm ", POBJ_LIST_ENTRY " FIELD )
+.BI " TOID " elm ", POBJ_LIST_ENTRY " FIELD )
.BI "POBJ_LIST_INSERT_AFTER(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " OID_TYPE " listelm ", OID_TYPE " elm ", POBJ_LIST_ENTRY " FIELD )
+.BI " TOID " listelm ", TOID " elm ", POBJ_LIST_ENTRY " FIELD )
.BI "POBJ_LIST_INSERT_BEFORE(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " OID_TYPE " listelm ", OID_TYPE " elm ", POBJ_LIST_ENTRY " FIELD )
+.BI " TOID " listelm ", TOID " elm ", POBJ_LIST_ENTRY " FIELD )
.BI "POBJ_LIST_INSERT_NEW_HEAD(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " unsigned int " type_num ", POBJ_LIST_ENTRY " FIELD ,
-.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg );
+.BI " POBJ_LIST_ENTRY " FIELD ", size_t " size ",
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
.BI "POBJ_LIST_INSERT_NEW_TAIL(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " unsigned int " type_num ", POBJ_LIST_ENTRY " FIELD ,
-.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg );
+.BI " POBJ_LIST_ENTRY " FIELD ", size_t " size ",
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
.BI "POBJ_LIST_INSERT_NEW_AFTER(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " OID_TYPE " listelm ", unsigned int " type_num ", POBJ_LIST_ENTRY " FIELD ,
-.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg );
+.BI " TOID " listelm ", POBJ_LIST_ENTRY " FIELD ", size_t " size ",
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
.BI "POBJ_LIST_INSERT_NEW_BEFORE(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " OID_TYPE " listelm ", unsigned int " type_num ", POBJ_LIST_ENTRY " FIELD ,
-.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg );
+.BI " TOID " listelm ", POBJ_LIST_ENTRY " FIELD ", size_t " size ",
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
.BI "POBJ_LIST_REMOVE(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " OID_TYPE " elm ", POBJ_LIST_ENTRY " FIELD )
+.BI " TOID " elm ", POBJ_LIST_ENTRY " FIELD )
.BI "POBJ_LIST_REMOVE_FREE(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " OID_TYPE " elm ", POBJ_LIST_ENTRY " FIELD )
+.BI " TOID " elm ", POBJ_LIST_ENTRY " FIELD )
.BI "POBJ_LIST_MOVE_ELEMENT_HEAD(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " POBJ_LIST_HEAD *" head_new ", OID_TYPE " elm ", POBJ_LIST_ENTRY " FIELD ",
+.BI " POBJ_LIST_HEAD *" head_new ", TOID " elm ", POBJ_LIST_ENTRY " FIELD ",
.BI " POBJ_LIST_ENTRY " field_new )
.BI "POBJ_LIST_MOVE_ELEMENT_TAIL(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
-.BI " POBJ_LIST_HEAD *" head_new ", OID_TYPE " elm ",POBJ_LIST_ENTRY " FIELD ",
+.BI " POBJ_LIST_HEAD *" head_new ", TOID " elm ", POBJ_LIST_ENTRY " FIELD ",
.BI " POBJ_LIST_ENTRY " field_new )
.sp
.B Transactional object manipulation:
@@ -218,19 +256,21 @@ libpmemobj \- persistent memory transactional object store
.BI "TX_FINALLY
.BI "TX_END
.sp
-.BI "TX_ADD(OID_TYPE " o )
-.BI "TX_ADD_FIELD(OID_TYPE " o ", " FIELD )
+.BI "TX_ADD(TOID " o )
+.BI "TX_ADD_FIELD(TOID " o ", " FIELD )
.sp
-.BI "TX_ALLOC(" TYPE ", unsigned int " type_num )
-.BI "TX_ZALLOC(" TYPE ", unsigned int " type_num )
-.BI "TX_REALLOC(OID_TYPE " o ", size_t " size ", unsigned int " type_num )
-.BI "TX_ZREALLOC(OID_TYPE " o ", size_t " size ", unsigned int " type_num )
+.BI "TX_NEW(" TYPE )
+.BI "TX_ALLOC(" TYPE ", size_t " size ")
+.BI "TX_ZNEW(" TYPE )
+.BI "TX_ZALLOC(" TYPE ", size_t " size ")
+.BI "TX_REALLOC(TOID " o ", size_t " size )
+.BI "TX_ZREALLOC(TOID " o ", size_t " size )
.BI "TX_STRDUP(const char *" s ", unsigned int " type_num )
-.BI "TX_FREE(OID_TYPE " o )
+.BI "TX_FREE(TOID " o )
.sp
-.BI "TX_SET(OID_TYPE " o ", " FIELD ", " VALUE )
-.BI "TX_MEMCPY(OID_TYPE " o ", " FIELD ", const void *" src ", size_t " num )
-.BI "TX_MEMSET(OID_TYPE " o ", " FIELD ", int " c ", size_t " num )
+.BI "TX_SET(TOID " o ", " FIELD ", " VALUE )
+.BI "TX_MEMCPY(TOID " o ", " FIELD ", const void *" src ", size_t " num )
+.BI "TX_MEMSET(TOID " o ", " FIELD ", int " c ", size_t " num )
.sp
.B Library API versioning:
.sp
@@ -270,6 +310,11 @@ builds on this type of memory mapped file.
.PP
This library is for applications that need a transactions
and persistent memory management.
+The
+.BR libpmemobj
+requires a
+.B -std=gnu99
+compilation flag to build properly.
This library builds on the low-level pmem support provided by
.BR libpmem ,
handling the transactional updates, flushing changes to
@@ -940,6 +985,18 @@ section for more details.
The
.BR PMEMOBJ_NUM_OID_TYPES
macro defines the limit of valid type numbers.
+.PP
+The
+.BR OID_IS_NULL
+macro checks if given
+.IR "PMEMoid"
+represents a NULL object.
+.PP
+The
+.BR OID_EQUALS
+macro compares two
+.IR "PMEMoid"
+objects.
.SH TYPE-SAFETY
.PP
Operating on untyped object handles, as well as on direct untyped object
@@ -952,62 +1009,93 @@ For example, a compile-time error is generated when an attempt is made
to assign a handle to an object of one type to the object handle variable
of another type of object.
.PP
-.BI "OID_TYPE(" TYPE )
+.BI "TOID_DECLARE(" TYPE ", unsigned int " type_num)
.IP
The
-.B OID_TYPE
+.B TOID_DECLARE
+macro declares a typed OID of user-defined type specified by argument
+.IR TYPE ,
+and with type number specified by argument
+.IR type_num .
+.PP
+.BI "TOID_DECLARE_ROOT(" ROOT_TYPE )
+.IP
+The
+.B TOID_DECLARE_ROOT
+macro declares a typed OID of user-defined type specified by argument
+.IR ROOT_TYPE ,
+and with type number for root object
+.BR POBJ_ROOT_TYPE_NUM .
+.PP
+.BI "TOID(" TYPE )
+.IP
+The
+.B TOID
macro declares a handle to an object of type specified by argument
.IR TYPE ,
where
.I TYPE
-is the name of a user-defined structure.
+is the name of a user-defined structure. The typed OID must be declared first
+using the
+.BR TOID_DECLARE ,
+.BR TOID_DECLARE_ROOT ,
+.BR POBJ_LAYOUT_TOID
+or
+.BR POBJ_LAYOUT_ROOT
+macros.
.PP
-.BI "OID_ASSIGN(OID_TYPE " o ", " VALUE )
+.BI "TOID_TYPE_NUM(" TYPE )
.IP
The
-.B OID_ASSIGN
-macro assigns an object handle specified by
-.I VALUE
-to the variable
-.IR o .
+.B TOID_TYPE_NUM
+macro returns a type number of the type specified by argument
+.IR TYPE .
+.PP
+.BI "TOID_TYPE_NUM_OF(TOID " oid ")
+.IP
+The
+.B TOID_TYPE_NUM_OF
+macro returns a type number of the object specified by argument
+.IR oid .
+The type number is read from the typed OID.
.PP
-.BI "OID_ASSIGN_TYPED(OID_TYPE " lhs ", OID_TYPE " rhs )
+.BI "TOID_VALID(TOID " oid ")
.IP
The
-.B OID_ASSIGN_TYPED
+.B TOID_VALID
+macro validates whether the type number stored in object's metadata
+is equal to the type number read from typed OID.
+.PP
+.BI "TOID_ASSIGN(TOID " o ", " VALUE )
+.IP
+The
+.B TOID_ASSIGN
macro assigns an object handle specified by
-.I rhs
-to the object handle variable
-.I lhs
-with the static type checking.
-Both
-.I lhs
-and
-.I rhs
-must be the object handles of the same type. Otherwise a compile-time error
-is generated.
+.I VALUE
+to the variable
+.IR o .
.PP
-.BI "OID_IS_NULL(OID_TYPE " o )
+.BI "TOID_IS_NULL(TOID " o )
.IP
The
-.B OID_IS_NULL
+.B TOID_IS_NULL
macro evaluates to true if the object handle represented by argument
.I o
has OID_NULL value.
.PP
-.BI "OID_EQUALS(OID_TYPE " lhs ", OID_TYPE " rhs )
+.BI "TOID_EQUALS(TOID " lhs ", TOID " rhs )
.IP
The
-.B OID_EQUALS
+.B TOID_EQUALS
macro evaluates to true if both
.I lhs
and
.I rhs
object handles are referencing the same persistent object.
.PP
-.BI "DIRECT_RW(OID_TYPE " oid )
+.BI "DIRECT_RW(TOID " oid )
.sp
-.BI "D_RW(OID_TYPE " oid )
+.BI "D_RW(TOID " oid )
.IP
The
.BR DIRECT_RW ()
@@ -1018,9 +1106,9 @@ represented by
.IR oid .
If OID_NULL is passed as an argument, the macro evaluates to NULL.
.PP
-.BI "DIRECT_RO(OID_TYPE " oid )
+.BI "DIRECT_RO(TOID " oid )
.sp
-.BI "D_RO(OID_TYPE " oid )
+.BI "D_RO(TOID " oid )
.IP
The
.BR DIRECT_RO ()
@@ -1030,6 +1118,99 @@ return a typed read-only (const) pointer (TYPE *) to an object
represented by
.IR oid .
If OID_NULL is passed as an argument, the macro evaluates to NULL.
+.SH LAYOUT DECLARATION
+.PP
+The
+.I libpmemobj
+defines a set of macros for convenient declaration of pool's layout.
+The declaration of layout consist of declaration of number of used types.
+The declared types will be assigned consecutive type numbers. Declared
+types may be used in conjunction with type safety macros.
+Once created the layout declaration shall not be changed unless the new types
+are added at the end of the existing layout declaration. Modifying any of existing declaration
+may lead to changes in type numbers of declared types which in consequence may cause
+data corruption.
+.PP
+.BI "POBJ_LAYOUT_BEGIN(" LAYOUT )
+.IP
+The
+.B POBJ_LAYOUT_BEGIN
+macro indicates a begin of declaration of layout. The
+.I LAYOUT
+argument is a name of layout. This argument must be passed to all macros related
+to the declaration of layout.
+.PP
+.BI "POBJ_LAYOUT_TOID(" LAYOUT ", " TYPE )
+.IP
+The
+.B POBJ_LAYOUT_TOID
+macro declares a typed OID for type passed as
+.I TYPE
+argument inside the declaration of layout. All types declared
+using this macro are assigned with consecutive type numbers. This macro must be used between
+the
+.B POBJ_LAYOUT_BEGIN
+and
+.B POBJ_LAYOUT_END
+macros, with the same name passed as
+.I LAYOUT
+argument.
+.PP
+.BI "POBJ_LAYOUT_ROOT(" LAYOUT ", " ROOT_TYPE )
+.IP
+The
+.B POBJ_LAYOUT_ROOT
+macro declares a typed OID for type passed as
+.I ROOT_TYPE
+argument inside the declaration of layout. The typed OID will be assigned
+with type number for root object
+.BR POBJ_ROOT_TYPE_NUM .
+.PP
+.BI "POBJ_LAYOUT_END(" LAYOUT )
+.IP
+The
+.B POBJ_LAYOUT_END
+macro ends the declaration of layout.
+.PP
+.BI "POBJ_LAYOUT_NAME(" LAYOUT )
+.IP
+The
+.B POBJ_LAYOUT_NAME
+macro returns the name of layout as a NULL-terminated string.
+.PP
+.BI "POBJ_LAYOUT_TYPES_NUM(" LAYOUT )
+.IP
+The
+.B POBJ_LAYOUT_TYPES_NUM
+macro returns number of types declared using the
+.B POBH_LAYOUT_TOID
+macro within the layout declaration.
+.PP
+This is an example of layout declaration:
+.IP
+.nf
+POBJ_LAYOUT_BEGIN(mylayout);
+POBJ_LAYOUT_ROOT(mylayout, struct root);
+POBJ_LAYOUT_TOID(mylayout, struct node);
+POBJ_LAYOUT_TOID(mylayout, struct foo);
+POBJ_LAYOUT_END(mylayout);
+
+struct root {
+ TOID(struct node) node;
+};
+
+struct node {
+ TOID(struct node) next;
+ TOID(struct foo) foo;
+};
+.fi
+.PP
+The name of layout and the number of declared types can be retrieved using the following code:
+.IP
+.nf
+const char *layout_name = POBJ_LAYOUT_NAME(mylayout);
+int num_of_types = POBJ_LAYOUT_TYPES_NUM(mylayout);
+.fi
.SH OBJECT CONTAINERS
.PP
All the objects in the persistent memory pool are organized by their
@@ -1059,6 +1240,13 @@ If the value of
argument exceeds the limit, an OID_NULL is returned and errno is
set appropriately.
.PP
+.BI "POBJ_FIRST(PMEMobjpool *" pop ", " TYPE )
+.IP
+The
+.B POBJ_FIRST
+macro returns the first object from the collection specified by the name of type
+.IR TYPE .
+.PP
.BI "PMEMoid pmemobj_next(PMEMoid " oid );
.IP
The
@@ -1071,6 +1259,19 @@ If an object referenced by
is the last object in the collection, or if the OID_NULL is passed as
an argument, function returns OID_NULL.
.PP
+.BI "POBJ_NEXT(TOID " oid )
+.IP
+The
+.B POBJ_NEXT
+macro returns the next object from the same collection as the object
+referenced by
+.IR oid .
+This macro works the same way as
+.B pmemobj_next()
+function with the difference that it takes typed OID instead of
+.B PMEMoid
+as an argument.
+.PP
The following two macros provide more convenient way to iterate through
the internal collections, performing a specific operation on each object.
.PP
@@ -1088,12 +1289,12 @@ and its type number to
.I vartype_num
variable.
.PP
-.BI "PMEMOBJ_FOREACH_TYPE(PMEMobjpool *" pop ", OID_TYPE " var ", unsigned int " type_num )
+.BI "PMEMOBJ_FOREACH_TYPE(PMEMobjpool *" pop ", OID_TYPE " var )
.IP
.BR PMEMOBJ_FOREACH_TYPE ()
-macro allows to perform a specific operation on each allocated object
-of the type specified by
-.I type_num
+macro allows to perform a specific operation on each allocated object of the
+same type as object passed as
+.I var
argument, stored in the persistent memory pool pointed by
.IR pop .
It traverses the internal collection of all the objects of the specified type,
@@ -1161,6 +1362,17 @@ is larger than the maximum allocation size supported for given pool,
or if there is not enough free space in the pool to satisfy the reallocation
of the root object. In such case, OID_NULL is returned.
.PP
+.BI "PMEMOBJ_ROOT(PMEMobjpool *" pop ", " TYPE )
+.IP
+The
+.B PMEMOBJ_ROOT
+macro works the same way as the
+.BR pmemobj_root ()
+function except it returns a typed OID of type
+.I TYPE
+instead of
+.BR PMEMoid .
+.PP
.BI "size_t pmemobj_root_size(PMEMobjpool *" pop );
.IP
The
@@ -1188,44 +1400,38 @@ will not be rolled-back if the transaction is aborted or interrupted.
.PP
The allocations are always aligned to the cache-line boundary.
.PP
-.BI "PMEMoid pmemobj_alloc(PMEMobjpool *" pop ", size_t " size ", unsigned int " type_num );
-.IP
-The
-.BR pmemobj_alloc ()
-function allocates a new object of given
-.I size
-from the persistent memory heap associated with memory pool
-.IR pop .
-The memory is
-.I not
-initialized.
-The allocated object is added to the internal container associated with given
-.IR type_num .
-The
-.I size
-can be any non-zero value, however due to internal padding and object metadata,
-the actual size of the allocation will differ from the requested one by at least
-64 bytes. For this reason, making the allocations of
-a size less than 64 bytes is extremely inefficient and discouraged.
-.IP
-In contrast to POSIX
-.BR malloc (3),
-the
-.BR pmemobj_alloc ()
-always return
-.I OID_NULL
-when called with
-.I size
-equal 0.
-.PP
-.BI "PMEMoid pmemobj_zalloc(PMEMobjpool *" pop ", size_t " size ", unsigned int " type_num );
+.BI "int pmemobj_alloc(PMEMobjpool *" pop ", PMEMoid *" oidp ", size_t " size ",
+.br
+.BI " unsigned int " type_num ", void (*" constructor ")(void *" ptr ", void *" arg "),
+.br
+.BI " void *" arg );
.IP
The
-.BR pmemobj_zalloc ()
-function allocates a new zeroed object from the the persistent memory heap
+.BR pmemobj_alloc
+function allocates a new object from the persistent memory heap
associated with memory pool
.IR pop .
The
+.B PMEMoid
+of allocated object is stored in
+.IR oidp .
+If the
+.I oidp
+points to memory location from the
+.B pmemobj
+heap the
+.I oidp
+is modified atomically. Before returning, it calls the
+.BR constructor
+function passing the pointer to the newly allocated object in
+.I ptr
+along with the
+.I arg
+argument.
+It is guaranteed that allocated object is either
+properly initialized, or if the allocation is interrupted before the constructor
+completes, the memory space reserved for the object is reclaimed.
+The
.I size
can be any non-zero value, however due to internal padding and object metadata,
the actual size of the allocation will differ from the requested one by at least
@@ -1234,33 +1440,32 @@ less than 64 bytes is extremely inefficient and discouraged.
If
.I size
is 0, then
-.BR pmemobj_zalloc ()
+.BR pmemobj_alloc ()
returns
.IR OID_NULL .
The allocated object is added to the internal container associated with given
-.I type_num.
+.IR type_num .
.PP
-.BI "PMEMoid pmemobj_alloc_construct(PMEMobjpool *" pop ", size_t " size ",
-.br
-.BI " unsigned int " type_num ,
+.BI "int pmemobj_zalloc(PMEMobjpool *" pop ", PMEMoid *" oidp ", size_t " size ", "
.br
-.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg );
+.BI " unsigned int " type_num );
.IP
The
-.BR pmemobj_alloc_construct
-function allocates a new object from the persistent memory heap
+.BR pmemobj_zalloc ()
+function allocates a new zeroed object from the the persistent memory heap
associated with memory pool
.IR pop .
-Before returning, it calls the
-.BR constructor
-function passing the pointer to the newly allocated object in
-.I ptr
-along with the
-.I arg
-argument.
-It is guaranteed that allocated object is either
-properly initialized, or if the allocation is interrupted before the constructor
-completes, the memory space reserved for the object is reclaimed.
+The
+.B PMEMoid
+of allocated object is stored in
+.IR oidp .
+If the
+.I oidp
+points to memory location from the
+.B pmemobj
+heap the
+.I oidp
+is modified atomically.
The
.I size
can be any non-zero value, however due to internal padding and object metadata,
@@ -1270,13 +1475,13 @@ less than 64 bytes is extremely inefficient and discouraged.
If
.I size
is 0, then
-.BR pmemobj_alloc_construct ()
+.BR pmemobj_zalloc ()
returns
.IR OID_NULL .
The allocated object is added to the internal container associated with given
-.IR type_num .
+.I type_num.
.PP
-.BI "void pmemobj_free(PMEMoid " oid );
+.BI "void pmemobj_free(PMEMoid *" oidp );
.IP
The
.BR pmemobj_free ()
@@ -1285,7 +1490,7 @@ function provides the same semantics as
but instead of the process heap supplied by the system, it operates on the
persistent memory heap.
It frees the memory space represented by
-.IR oid ,
+.IR oidp ,
which must have been returned by a previous call to
.BR pmemobj_alloc (),
.BR pmemobj_alloc_construct (),
@@ -1294,10 +1499,22 @@ which must have been returned by a previous call to
or
.BR pmemobj_zrealloc ().
If
-.I oid
-is OID_NULL, no operation is performed.
-.PP
-.BI "PMEMoid pmemobj_realloc(PMEMobjpool *" pop ", PMEMoid " oid ", size_t " size ,
+.I oidp
+points to
+.IR OID_NULL ,
+no operation is performed. It sets the
+.I oidp
+to
+.IR OID_NULL
+value after freeing the memory. If the
+.I oidp
+points to memory location from the
+.B pmemobj
+heap the
+.I oidp
+is changed atomically.
+.PP
+.BI "int pmemobj_realloc(PMEMobjpool *" pop ", PMEMoid *" oidp ", size_t " size ,
.br
.BI " unsigned int " type_num );
.IP
@@ -1308,7 +1525,7 @@ function provide similar semantics to
but operates on the persistent memory heap associated with memory pool
.IR pop .
It changes the size of the object represented by
-.IR oid ,
+.IR oidp ,
to
.I size
bytes. The resized object is also added or moved to the internal
@@ -1320,22 +1537,24 @@ If the new size is larger than the old size, the added memory will
.I not
be initialized.
If
-.I oid
-is
+.I oidp
+points to
.IR OID_NULL ,
then the call is equivalent to
.IR "pmemobj_alloc(pop, size, type_num)".
If
.I size
is equal to zero, and
-.I oid
+.I oidp
is not
.IR OID_NULL ,
then the call is equivalent to
.IR "pmemobj_free(oid)".
Unless
-.I oid
-is OID_NULL, it must have been returned by an earlier call to
+.I oidp
+is
+.IR OID_NULL ,
+it must have been returned by an earlier call to
.BR pmemobj_alloc (),
.BR pmemobj_alloc_construct (),
.BR pmemobj_zalloc (),
@@ -1345,13 +1564,19 @@ or
Note that the object handle value may change in result of reallocation.
If the object was moved, a memory space represented by
.I oid
-is reclaimed.
+is reclaimed. If
+.I oidp
+points to memory location from the
+.B pmemobj
+heap the
+.I oidp
+is changed atomically.
If
.BR pmemobj_realloc ()
-is unable to satisfy the allocation request, a OID_NULL is
-returned and errno is set appropriately.
+is unable to satisfy the allocation request, a non-zero value is returned and
+errno is set appropriately.
.PP
-.BI "PMEMoid pmemobj_zrealloc(PMEMobjpool *" pop ", PMEMoid " oid ", size_t " size ,
+.BI "int pmemobj_zrealloc(PMEMobjpool *" pop ", PMEMoid *" oidp ", size_t " size ,
.br
.BI " unsigned int " type_num );
.IP
@@ -1367,27 +1592,29 @@ to
.I size
bytes. The resized object is also added or moved to the internal
container associated with given
-.I type_num .
+.IR type_num .
The contents will be unchanged in the range from the start of the region
up to the minimum of the old and new sizes.
If the new size is larger than the old size, the added memory will be zeroed.
If
-.I oid
-is
+.I oidp
+points to
.I OID_NULL,
then the call is equivalent to
.IR "pmemobj_zalloc(poop, size, type_num)".
If
.I size
is equal to zero, and
-.I oid
-is not
+.I oidp
+doesn't point to
.IR OID_NULL ,
then the call is equivalent to
.IR "pmemobj_free(pop, oid)".
Unless
-.I oid
-is OID_NULL, it must have been returned by an earlier call to
+.I oidp
+points to
+.IR OID_NULL ,
+it must have been returned by an earlier call to
.BR pmemobj_alloc (),
.BR pmemobj_alloc_construct (),
.BR pmemobj_zalloc (),
@@ -1396,14 +1623,22 @@ or
.BR pmemobj_zrealloc ().
Note that the object handle value may change in result of reallocation.
If the object was moved, a memory space represented by
-.I oid
-is reclaimed.
+.I oidp
+is reclaimed. If
+.I oidp
+points to memory location from the
+.B pmemobj
+heap the
+.I oidp
+is changed atomically.
If
.BR pmemobj_zrealloc ()
-is unable to satisfy the allocation request, a OID_NULL is
+is unable to satisfy the allocation request, OID_NULL is
returned and errno is set appropriately.
.PP
-.BI "PMEMoid pmemobj_strdup(PMEMobjpool *" pop ", const char *" s ", unsigned int " type_num );
+.BI "int pmemobj_strdup(PMEMobjpool *" pop ", PMEMoid *" oidp ", const char *" s ", "
+.br
+.BI " unsigned int " type_num );
.IP
The
.BR pmemobj_strdup ()
@@ -1411,8 +1646,17 @@ function provides the same semantics as
.BR strdup (3),
but operates on the persistent memory heap associated with memory pool
.IR pop .
-It returns a handle to a new object which is a duplicate of the string
+It stores a handle to a new object in
+.I oidp
+which is a duplicate of the string
.IR s .
+If the
+.I oidp
+points to memory location from the
+.B pmemobj
+heap the
+.I oidp
+is changed atomically.
The allocated string object is also added to the internal
container associated with given
.IR type_num .
@@ -1424,7 +1668,7 @@ on the given memory pool, and can be freed with
on the same memory pool.
If
.BR pmemobj_strdup ()
-is unable to satisfy the allocation request, a OID_NULL is
+is unable to satisfy the allocation request, OID_NULL is
returned and errno is set appropriately.
.PP
.BI "size_t pmemobj_alloc_usable_size(PMEMoid " oid );
@@ -1439,11 +1683,127 @@ It returns the number of usable bytes in the object represented
by
.IR oid ,
a handle to an object allocated by
-.BR pmemobj_malloc ()
+.BR pmemobj_alloc ()
or a related function.
If
.I oid
is OID_NULL, 0 is returned.
+.PP
+.BI "POBJ_NEW(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, "
+.br
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
+.IP
+The
+.B POBJ_NEW
+macro is a wrapper around the
+.BR pmemobj_alloc ()
+function which takes the type name
+.B TYPE
+and passes the size and type number to the
+.BR pmemobj_alloc ()
+function from the typed OID.
+Instead of taking a pointer to
+.B PMEMoid
+it takes a pointer to typed OID of
+.BR TYPE .
+.PP
+.BI "POBJ_ALLOC(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, size_t " size "
+.br
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
+.IP
+The
+.B POBJ_ALLOC
+macro is a wrapper around the
+.BR pmemobj_alloc ()
+function which takes the type name
+.BR TYPE ,
+the size of allocation
+.IR size
+and passes the type number to the
+.BR pmemobj_alloc ()
+function from the typed OID.
+Instead of taking a pointer to
+.B PMEMoid
+it takes a pointer to typed OID of
+.BR TYPE .
+.PP
+.BI "POBJ_ZNEW(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE )
+.IP
+The
+.B POBJ_ZNEW
+macro is a wrapper around the
+.BR pmemobj_zalloc ()
+function which takes the type name
+.BR TYPE
+and passes the size and type number to
+the
+.BR pmemobj_zalloc ()
+function from the typed OID.
+Instead of taking a pointer to
+.B PMEMoid
+it takes a pointer to typed OID of
+.BR TYPE .
+.PP
+.BI "POBJ_ZALLOC(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, size_t " size ")
+.IP
+The
+.B POBJ_ZALLOC
+macro is a wrapper around the
+.BR pmemobj_zalloc ()
+function which takes the type name
+.BR TYPE ,
+the size of allocation
+.IR size
+and passes the type number to the
+.BR pmemobj_zalloc ()
+function from the typed OID.
+Instead of taking a pointer to
+.B PMEMoid
+it takes a pointer to typed OID of
+.BR TYPE .
+.PP
+.BI "POBJ_REALLOC(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, size_t " size )
+.IP
+The
+.B POBJ_REALLOC
+macro is a wrapper around the
+.BR pmemobj_realloc ()
+function which takes the type name
+.BR TYPE
+and passes the type number to the
+.BR pmemobj_realloc ()
+function from the typed OID.
+Instead of taking a pointer to
+.B PMEMoid
+it takes a pointer to typed OID of
+.BR TYPE .
+.PP
+.BI "POBJ_ZREALLOC(PMEMobjpool *" pop ", TOID(TYPE) *" oidp ", TYPE, size_t " size )
+.IP
+The
+.B POBJ_ZREALLOC
+macro is a wrapper around the
+.BR pmemobj_zrealloc ()
+function which takes the type name
+.BR TYPE
+and passes the type number to the
+.BR pmemobj_zrealloc ()
+function from the typed OID.
+Instead of taking a pointer to
+.B PMEMoid
+it takes a pointer to typed OID of
+.BR TYPE .
+.PP
+.BI "POBJ_FREE(PMEMobjpool *" pop ", TOID(TYPE) *" oidp " )
+.IP
+The
+.B POBJ_FREE
+macro is a wrapper around the
+.BR pmemobj_free ()
+function which takes pointer to typed OID
+.I oidp
+as an argument instead of
+.BR PMEMoid .
.SH NON-TRANSACTIONAL PERSISTENT ATOMIC LISTS
.PP
Besides the internal objects collections described in section
@@ -1855,71 +2215,71 @@ before the element
.PP
.BI "POBJ_LIST_INSERT_NEW_HEAD(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
.br
-.BI " unsigned int " type_num ", POBJ_LIST_ENTRY " FIELD ,
+.BI " POBJ_LIST_ENTRY " FIELD ", size_t " size ",
.br
-.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg );
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
.IP
The macro
.BR POBJ_LIST_INSERT_NEW_HEAD
-atomically allocates a new object of type
-.I type_num
+atomically allocates a new object of size
+.I size
and inserts it at the head of the list referenced by
.IR head .
The newly allocated object is also added to the internal object
-container associated with
-.IR type_num .
+container associated with a type number which is retrieved from the typed OID of
+the first element on list.
.PP
.BI "POBJ_LIST_INSERT_NEW_TAIL(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
.br
-.BI " unsigned int " type_num ", POBJ_LIST_ENTRY " FIELD ,
+.BI " POBJ_LIST_ENTRY " FIELD ", size_t " size ",
.br
-.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg );
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
.IP
The macro
.BR POBJ_LIST_INSERT_NEW_TAIL
-atomically allocates a new object of type
-.I type_num
+atomically allocates a new object of size
+.I size
and inserts it at the tail of the list referenced by
.IR head .
The newly allocated object is also added to the internal object
-container associated with
-.IR type_num .
+container associated with with a type number which is retrieved from the typed OID of
+the first element on list.
.PP
.BI "POBJ_LIST_INSERT_NEW_AFTER(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
.br
-.BI " OID_TYPE " listelm ", unsigned int " type_num ", POBJ_LIST_ENTRY " FIELD ,
+.BI " TOID " listelm ", POBJ_LIST_ENTRY " FIELD ", size_t " size ",
.br
-.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg );
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
.IP
The macro
.BR POBJ_LIST_INSERT_NEW_AFTER
-atomically allocates a new object of type
-.I type_num
+atomically allocates a new object of size
+.I size
and inserts it into the list referenced by
.I head
after the element
.IR listelm .
The newly allocated object is also added to the internal object
-container associated with
-.IR type_num .
+container associated with with a type number which is retrieved from the typed OID of
+the first element on list.
.PP
.BI "POBJ_LIST_INSERT_NEW_BEFORE(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
.br
-.BI " OID_TYPE " listelm ", unsigned int " type_num ", POBJ_LIST_ENTRY " FIELD ,
+.BI " TOID " listelm ", POBJ_LIST_ENTRY " FIELD ", size_t " size ",
.br
-.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg );
+.BI " void (*" constructor ")(void *" ptr ", void *" arg "), void *" arg )
.IP
The macro
.BR POBJ_LIST_INSERT_NEW_BEFORE
-atomically allocates a new object of type
-.I type_num
+atomically allocates a new object of size
+.I size
and inserts it into the list referenced by
.I head
before the element
.IR listelm .
The newly allocated object is also added to the internal object
-container associated with
-.IR type_num .
+container associated with with a type number which is retrieved from the typed OID of
+the first element on list.
.PP
.BI "POBJ_LIST_REMOVE(PMEMobjpool *" pop ", POBJ_LIST_HEAD *" head ",
.br
@@ -2501,26 +2861,16 @@ bytes of its memory area with the constant byte
.IR c .
In case of a failure or abort, the saved value will be restored.
.PP
-.BI "TX_ALLOC(" TYPE ", unsigned int " type_num )
+.BI "TX_NEW(" TYPE )
.IP
The
-.BR TX_ALLOC ()
+.BR TX_NEW ()
macro transactionally allocates an new object of given
.I TYPE
-and assigns it a type number
-.IR type_num .
+and assigns it a type number read from the typed OID.
The allocation size is determined from the size of the
user-defined structure
.IR TYPE .
-This macro may only be called from inside the
-.BR OID_ASSIGN
-macro, like in the following example:
-.IP
-.nf
-OID_TYPE(struct mytype) o;
-OID_ASSIGN(o, TX_ALLOC(struct mytype, MYTYPE_NUM));
-.fi
-.IP
If successful and called during
.I TX_STAGE_WORK
it returns a handle to the newly allocated object. Otherwise, stage
@@ -2528,22 +2878,32 @@ changes to
.IR TX_STAGE_ONABORT ,
OID_NULL is returned, and errno is set appropriately.
.PP
-.BI "TX_ZALLOC(" TYPE ", unsigned int " type_num )
+.BI "TX_ALLOC(" TYPE , size_t " size ")
.IP
The
-.BR TX_ZALLOC ()
+.BR TX_ALLOC ()
+macro transactionally allocates an new object of given
+.I TYPE
+and assigns it a type number read from the typed OID.
+The allocation size is passed by
+.IR size
+parameter. If successful and called during
+.I TX_STAGE_WORK
+it returns a handle to the newly allocated object. Otherwise, stage
+changes to
+.IR TX_STAGE_ONABORT ,
+OID_NULL is returned, and errno is set appropriately.
+.PP
+.BI "TX_NEW(" TYPE )
+.IP
+The
+.BR TX_NEW ()
macro transactionally allocates a new zeroed object of given
.I TYPE
-and assigns it a type number
-.IR type_num .
+and assigns it a type number read from the typed OID.
The allocation size is determined from the size of the
user-defined structure
.IR TYPE .
-Similarly to
-.BR TX_ALLOC (),
-this macro may only be called from inside the
-.BR OID_ASSIGN
-macro.
If successful and called during
.I TX_STAGE_WORK
it returns a handle to the newly allocated object. Otherwise, stage
@@ -2551,6 +2911,22 @@ changes to
.IR TX_STAGE_ONABORT ,
OID_NULL is returned, and errno is set appropriately.
.PP
+.BI "TX_ZALLOC(" TYPE )
+.IP
+The
+.BR TX_ZALLOC ()
+macro transactionally allocates a new zeroed object of given
+.I TYPE
+and assigns it a type number read from the typed OID.
+The allocation size is passed by
+.IR size
+argument. If successful and called during
+.I TX_STAGE_WORK
+it returns a handle to the newly allocated object. Otherwise, stage
+changes to
+.IR TX_STAGE_ONABORT ,
+OID_NULL is returned, and errno is set appropriately.
+.PP
.BI "TX_REALLOC(OID_TYPE " o ", size_t " size ", unsigned int " type_num )
.IP
The
@@ -2558,14 +2934,7 @@ The
macro transactionally resizes an existing object referenced by a handle
.I o
to the given
-.I size
-and changes its type to
-.IR type_num .
-Similarly to
-.BR TX_ALLOC (),
-this macro may only be called from inside the
-.BR OID_ASSIGN
-macro.
+.I size .
If successful and called during
.I TX_STAGE_WORK
it returns a handle to the reallocated object. Otherwise, stage
@@ -2580,15 +2949,8 @@ The
macro transactionally resizes an existing object referenced by a handle
.I o
to the given
-.I size
-and changes its type to
-.IR type_num .
+.I size .
If the new size is larger than the old size, the extended new space is zeroed.
-Similarly to
-.BR TX_ALLOC (),
-this macro may only be called from inside the
-.BR OID_ASSIGN
-macro.
If successful and called during
.I TX_STAGE_WORK
it returns a handle to the reallocated object. Otherwise, stage
@@ -2605,11 +2967,6 @@ string
.I s
and assigns it a type
.IR type_num .
-Similarly to
-.BR TX_ALLOC (),
-this macro may only be called from inside the
-.BR OID_ASSIGN
-macro.
If successful and called during
.I TX_STAGE_WORK
it returns a handle to the newly allocated object. Otherwise, stage
diff --git a/src/examples/libpmemobj/pminvaders/pminvaders.c b/src/examples/libpmemobj/pminvaders/pminvaders.c
index 9e85c1b537252444dad7e978ee4b9598438226a8..67529d713e029579a46daf85803ceffaa0dbfe82 100644
--- a/src/examples/libpmemobj/pminvaders/pminvaders.c
+++ b/src/examples/libpmemobj/pminvaders/pminvaders.c
@@ -64,16 +64,6 @@
#define MAX_PLAYER_TIMER 1000
#define MAX_BULLET_TIMER 500
-enum alloc_type {
- ALLOC_UNKNOWN,
- ALLOC_GAME_STATE,
- ALLOC_PLAYER,
- ALLOC_ALIEN,
- ALLOC_BULLET,
-
- MAX_ALLOC
-};
-
enum colors {
C_UNKNOWN,
C_PLAYER,
@@ -107,6 +97,17 @@ struct bullet {
uint32_t timer; /* movement timer */
};
+/*
+ * Layout definition
+ */
+POBJ_LAYOUT_BEGIN(pminvaders);
+POBJ_LAYOUT_ROOT(pminvaders, struct game_state);
+POBJ_LAYOUT_TOID(pminvaders, struct player);
+POBJ_LAYOUT_TOID(pminvaders, struct alien);
+POBJ_LAYOUT_TOID(pminvaders, struct bullet);
+POBJ_LAYOUT_END(pminvaders);
+
+
static PMEMobjpool *pop;
static struct game_state *gstate;
@@ -171,21 +172,21 @@ draw_border()
}
void
-draw_alien(const struct alien *a)
+draw_alien(const TOID(struct alien) a)
{
- mvaddch(a->y, a->x, ACS_DIAMOND|COLOR_PAIR(C_ALIEN));
+ mvaddch(D_RO(a)->y, D_RO(a)->x, ACS_DIAMOND|COLOR_PAIR(C_ALIEN));
}
void
-draw_player(const struct player *p)
+draw_player(const TOID(struct player) p)
{
- mvaddch(PLAYER_Y, p->x, ACS_DIAMOND|COLOR_PAIR(C_PLAYER));
+ mvaddch(PLAYER_Y, D_RO(p)->x, ACS_DIAMOND|COLOR_PAIR(C_PLAYER));
}
void
-draw_bullet(const struct bullet *b)
+draw_bullet(const TOID(struct bullet) b)
{
- mvaddch(b->y, b->x, ACS_BULLET|COLOR_PAIR(C_BULLET));
+ mvaddch(D_RO(b)->y, D_RO(b)->x, ACS_BULLET|COLOR_PAIR(C_BULLET));
}
void
@@ -237,22 +238,21 @@ process_aliens()
if (timer_tick(&gstate->timer)) {
gstate->timer = RRAND(MIN_GSTATE_TIMER, MAX_GSTATE_TIMER);
pmemobj_persist(pop, gstate, sizeof (*gstate));
- pmemobj_alloc_construct(pop, sizeof (struct alien), ALLOC_ALIEN,
- create_alien, NULL);
+ POBJ_NEW(pop, NULL, struct alien, create_alien, NULL);
}
- OID_TYPE(struct alien) iter, next;
- POBJ_FOREACH_SAFE_TYPE(pop, iter, next, ALLOC_ALIEN) {
+ TOID(struct alien) iter, next;
+ POBJ_FOREACH_SAFE_TYPE(pop, iter, next) {
if (timer_tick(&D_RW(iter)->timer)) {
D_RW(iter)->timer = MAX_ALIEN_TIMER;
D_RW(iter)->y++;
}
pmemobj_persist(pop, D_RW(iter), sizeof (struct alien));
- draw_alien(D_RO(iter));
+ draw_alien(iter);
/* decrease the score if the ship wasn't intercepted */
if (D_RO(iter)->y > GAME_HEIGHT - 1) {
- pmemobj_free(iter.oid);
+ POBJ_FREE(&iter);
update_score(-1);
pmemobj_persist(pop, gstate, sizeof (*gstate));
}
@@ -263,14 +263,14 @@ process_aliens()
* process_collision -- search for any aliens on the position of the bullet
*/
int
-process_collision(const struct bullet *b)
+process_collision(const TOID(struct bullet) b)
{
- OID_TYPE(struct alien) iter;
-
- POBJ_FOREACH_TYPE(pop, iter, ALLOC_ALIEN) {
- if (b->x == D_RO(iter)->x && b->y == D_RO(iter)->y) {
+ TOID(struct alien) iter;
+ POBJ_FOREACH_TYPE(pop, iter) {
+ if (D_RO(b)->x == D_RO(iter)->x &&
+ D_RO(b)->y == D_RO(iter)->y) {
update_score(1);
- pmemobj_free(iter.oid);
+ POBJ_FREE(&iter);
return 1;
}
}
@@ -284,9 +284,9 @@ process_collision(const struct bullet *b)
void
process_bullets()
{
- OID_TYPE(struct bullet) iter, next;
+ TOID(struct bullet) iter, next;
- POBJ_FOREACH_SAFE_TYPE(pop, iter, next, ALLOC_BULLET) {
+ POBJ_FOREACH_SAFE_TYPE(pop, iter, next) {
/* bullet movement timer */
if (timer_tick(&D_RW(iter)->timer)) {
D_RW(iter)->timer = MAX_BULLET_TIMER;
@@ -294,9 +294,9 @@ process_bullets()
}
pmemobj_persist(pop, D_RW(iter), sizeof (struct bullet));
- draw_bullet(D_RO(iter));
- if (D_RO(iter)->y == 0 || process_collision(D_RO(iter)))
- pmemobj_free(iter.oid);
+ draw_bullet(iter);
+ if (D_RO(iter)->y == 0 || process_collision(iter))
+ POBJ_FREE(&iter);
}
}
@@ -306,8 +306,7 @@ process_bullets()
void
process_player(int input)
{
- OID_TYPE(struct player) plr;
- OID_ASSIGN(plr, pmemobj_first(pop, ALLOC_PLAYER));
+ TOID(struct player) plr = POBJ_FIRST(pop, struct player);
/* weapon cooldown tick */
timer_tick(&D_RW(plr)->timer);
@@ -322,13 +321,12 @@ process_player(int input)
D_RW(plr)->x = dstx;
} else if (input == ' ' && D_RO(plr)->timer == 0) {
D_RW(plr)->timer = MAX_PLAYER_TIMER;
- pmemobj_alloc_construct(pop, sizeof (struct bullet),
- ALLOC_BULLET, create_bullet, D_RW(plr));
+ POBJ_NEW(pop, NULL, struct bullet, create_bullet, D_RW(plr));
}
pmemobj_persist(pop, D_RW(plr), sizeof (struct player));
- draw_player(D_RO(plr));
+ draw_player(plr);
}
/*
@@ -362,16 +360,14 @@ main(int argc, char *argv[])
srand(time(NULL));
if (access(path, F_OK) != 0) {
- if ((pop = pmemobj_create(path, LAYOUT_NAME,
+ if ((pop = pmemobj_create(path, POBJ_LAYOUT_NAME(pminvaders),
PMINVADERS_POOL_SIZE, S_IRWXU)) == NULL) {
printf("failed to create pool\n");
return 1;
}
/* create the player and initialize with a constructor */
- pmemobj_alloc_construct(pop, sizeof (struct player),
- ALLOC_PLAYER, create_player, NULL);
-
+ POBJ_NEW(pop, NULL, struct player, create_player, NULL);
} else {
if ((pop = pmemobj_open(path, LAYOUT_NAME)) == NULL) {
printf("failed to open pool\n");
@@ -380,7 +376,34 @@ main(int argc, char *argv[])
}
/* global state of the game is kept in the root object */
- gstate = pmemobj_direct(pmemobj_root(pop, sizeof (struct game_state)));
+ TOID(struct game_state) game_state = POBJ_ROOT(pop, struct game_state);
+ if (!TOID_VALID(game_state)) {
+ printf("failed to get root object\n");
+ return 1;
+ }
+
+ TOID(struct alien) alien;
+ POBJ_FOREACH_TYPE(pop, alien) {
+ if (!TOID_VALID(alien)) {
+ printf("invalid alien found\n");
+ return 1;
+ }
+ }
+
+ TOID(struct bullet) bullet;
+ POBJ_FOREACH_TYPE(pop, bullet) {
+ if (!TOID_VALID(bullet)) {
+ printf("invalid bullet found\n");
+ return 1;
+ }
+ }
+
+ if (!TOID_VALID(POBJ_FIRST(pop, struct player))) {
+ printf("invalid player found\n");
+ return 1;
+ }
+
+ gstate = D_RW(game_state);
initscr();
start_color();
diff --git a/src/include/libpmemobj.h b/src/include/libpmemobj.h
index 25bccec6db939c68d1bbdc616a697ce3d1ecd459..9b631354d3337b97e0ee8b5b693aa16af60c678d 100644
--- a/src/include/libpmemobj.h
+++ b/src/include/libpmemobj.h
@@ -47,10 +47,15 @@
extern "C" {
#endif
+#ifndef __STDC_LIMIT_MACROS
+#define __STDC_LIMIT_MACROS
+#endif
+
#include <sys/types.h>
#include <setjmp.h>
#include <stdint.h>
#include <stddef.h>
+#include <pthread.h>
/*
* opaque type internal to libpmemobj
@@ -171,41 +176,131 @@ typedef struct pmemoid {
uint64_t off;
} PMEMoid;
-#define OID_TYPE(type)\
-union {\
- type *_type;\
+#define OID_NULL ((PMEMoid) {0, 0})
+#define OID_IS_NULL(o) ((o).off == 0)
+#define OID_EQUALS(lhs, rhs)\
+((lhs).off == (rhs).off &&\
+ (lhs).pool_uuid_lo == (rhs).pool_uuid_lo)
+
+/*
+ * Type safety macros
+ */
+
+#define TOID_ASSIGN(o, value) (\
+{\
+ (o).oid = value;\
+ (o);\
+})
+#define TOID_EQUALS(lhs, rhs)\
+((lhs).oid.off == (rhs).oid.off &&\
+ (lhs).oid.pool_uuid_lo == (rhs).oid.pool_uuid_lo)
+
+/* type number of root object */
+#define POBJ_ROOT_TYPE_NUM UINT16_MAX
+#define _toid_struct
+#define _toid_union
+#define _toid_enum
+#define _POBJ_LAYOUT_REF(name) (sizeof (_pobj_layout_##name##_ref))
+
+/*
+ * Typed OID
+ */
+#define TOID(t)\
+union _toid_##t##_toid
+
+#ifdef __cplusplus
+#define _TOID_CONSTR(t)\
+_toid_##t##_toid()\
+{ }\
+_toid_##t##_toid(PMEMoid _oid) : oid(_oid)\
+{ }
+#else
+#define _TOID_CONSTR(t)
+#endif
+
+/*
+ * Declaration of typed OID
+ */
+#define TOID_DECLARE(t, i)\
+typedef uint8_t _toid_##t##_toid_type_num[(i)];\
+TOID(t)\
+{\
+ _TOID_CONSTR(t)\
PMEMoid oid;\
+ t *_type;\
+ _toid_##t##_toid_type_num *_type_num;\
}
-#define OID_ASSIGN(o, value) ((o).oid = value)
+/*
+ * Declaration of typed OID of root object
+ */
+#define TOID_DECLARE_ROOT(t) TOID_DECLARE(t, POBJ_ROOT_TYPE_NUM)
-#ifdef __cplusplus
-#define OID_ASSIGN_TYPED(lhs, rhs)\
- ((lhs).oid = (rhs).oid)
-#else
-#define OID_ASSIGN_TYPED(lhs, rhs)\
-__builtin_choose_expr(\
- __builtin_types_compatible_p(\
- typeof((lhs)._type),\
- typeof((rhs)._type)),\
- (void) ((lhs).oid = (rhs).oid),\
- (lhs._type = rhs._type))
-#endif /* __cplusplus */
+/*
+ * Type number of specified type
+ */
+#define TOID_TYPE_NUM(t) (sizeof (_toid_##t##_toid_type_num))
-#define OID_NULL ((PMEMoid) {0, 0})
+/*
+ * Type number of object read from typed OID
+ */
+#define TOID_TYPE_NUM_OF(o) (sizeof (*(o)._type_num))
-#define OID_IS_NULL(o) ((o).oid.off == 0)
+/*
+ * NULL check
+ */
+#define TOID_IS_NULL(o) ((o).oid.off == 0)
-#define OID_EQUALS(lhs, rhs)\
-((lhs).oid.off == (rhs).oid.off &&\
- (lhs).oid.pool_uuid_lo == (rhs).oid.pool_uuid_lo)
+/*
+ * Validates whether type number stored in typed OID is the same
+ * as type number stored in object's metadata
+ */
+#define TOID_VALID(o) (TOID_TYPE_NUM_OF(o) == pmemobj_type_num((o).oid))
+
+/*
+ * Begin of layout declaration
+ */
+#define POBJ_LAYOUT_BEGIN(name)\
+const char *_pobj_layout_##name##_name = #name;\
+typedef uint8_t _pobj_layout_##name##_ref[__COUNTER__]
+
+/*
+ * End of layout declaration
+ */
+#define POBJ_LAYOUT_END(name)\
+typedef char _pobj_layout_##name##_cnt[__COUNTER__ -\
+1 - _POBJ_LAYOUT_REF(name)];
+
+/*
+ * Number of types declared inside layout without the root object
+ */
+#define POBJ_LAYOUT_TYPES_NUM(name) (sizeof (_pobj_layout_##name##_cnt))
+
+/*
+ * Declaration of typed OID inside layout declaration
+ */
+#define POBJ_LAYOUT_TOID(name, t)\
+TOID_DECLARE(t, (__COUNTER__ - _POBJ_LAYOUT_REF(name)));
+
+/*
+ * Declaration of typed OID of root inside layout declaration
+ */
+#define POBJ_LAYOUT_ROOT(name, t)\
+TOID_DECLARE(t, POBJ_ROOT_TYPE_NUM);
+
+/*
+ * Name of declared layout
+ */
+#define POBJ_LAYOUT_NAME(name) _pobj_layout_##name##_name
/*
* Returns the direct pointer of an object.
*/
void *pmemobj_direct(PMEMoid oid);
-#define DIRECT_RW(o) ((typeof (*(o)._type)*)pmemobj_direct((o).oid))
+#define DIRECT_RW(o) (\
+{typeof((o)) _o; _o.oid = _o.oid;\
+(typeof(*(o)._type)*)pmemobj_direct((o).oid); })
#define DIRECT_RO(o) ((const typeof (*(o)._type)*)pmemobj_direct((o).oid))
#define D_RW DIRECT_RW
@@ -218,47 +313,44 @@ void *pmemobj_direct(PMEMoid oid);
* aligned to the cache-line boundary.
*/
-/*
- * Allocates a new object from the pool.
- */
-PMEMoid pmemobj_alloc(PMEMobjpool *pop, size_t size, unsigned int type_num);
-
-/*
- * Allocates a new zeroed object from the pool.
- */
-PMEMoid pmemobj_zalloc(PMEMobjpool *pop, size_t size, unsigned int type_num);
-
/*
* Allocates a new object from the pool and calls a constructor function before
* returning. It is guaranteed that allocated object is either properly
* initialized, or if it's interrupted before the constructor completes, the
* memory reserved for the object is automatically reclaimed.
*/
-PMEMoid pmemobj_alloc_construct(PMEMobjpool *pop, size_t size,
- unsigned int type_num,
- void (*constructor)(void *ptr, void *arg), void *arg);
+int pmemobj_alloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
+ unsigned int type_num, void (*constructor)(void *ptr, void *arg),
+ void *arg);
+
+/*
+ * Allocates a new zeroed object from the pool.
+ */
+int pmemobj_zalloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
+ unsigned int type_num);
/*
* Resizes an existing object.
*/
-PMEMoid pmemobj_realloc(PMEMobjpool *pop, PMEMoid oid, size_t size,
+int pmemobj_realloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
unsigned int type_num);
/*
* Resizes an existing object, if extended new space is zeroed.
*/
-PMEMoid pmemobj_zrealloc(PMEMobjpool *pop, PMEMoid oid, size_t size,
+int pmemobj_zrealloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
unsigned int type_num);
/*
* Allocates a new object with duplicate of the string s.
*/
-PMEMoid pmemobj_strdup(PMEMobjpool *pop, const char *s, unsigned int type_num);
+int pmemobj_strdup(PMEMobjpool *pop, PMEMoid *oidp, const char *s,
+ unsigned int type_num);
/*
* Frees an existing object.
*/
-void pmemobj_free(PMEMoid oid);
+void pmemobj_free(PMEMoid *oidp);
/*
* Returns the number of usable bytes in the object. May be greater than
@@ -268,6 +360,11 @@ void pmemobj_free(PMEMoid oid);
*/
size_t pmemobj_alloc_usable_size(PMEMoid oid);
+/*
+ * Returns the type number of the object.
+ */
+unsigned int pmemobj_type_num(PMEMoid oid);
+
/*
* If called for the first time on a newly created pool, the root object
* of given size is allocated. Otherwise, it returns the existing root object.
@@ -339,6 +436,50 @@ PMEMoid pmemobj_first(PMEMobjpool *pop, unsigned int type_num);
*/
PMEMoid pmemobj_next(PMEMoid oid);
+#define POBJ_FIRST(pop, t) (\
+{ TOID(t) ret = (TOID(t))pmemobj_first((pop), TOID_TYPE_NUM(t));\
+ret; })
+
+#define POBJ_NEXT(o) (\
+{ typeof((o)) ret = (typeof((o)))pmemobj_next((o).oid);\
+ret; })
+
+#define POBJ_NEW(pop, o, t, constr, arg) (\
+{ TOID(t) *tmp = (o);\
+PMEMoid *oidp = tmp ? &tmp->oid : NULL;\
+pmemobj_alloc((pop), oidp, sizeof (t), TOID_TYPE_NUM(t), (constr), (arg)); })
+
+#define POBJ_ALLOC(pop, o, t, size, constr, arg) (\
+{ TOID(t) *tmp = (o);\
+PMEMoid *oidp = tmp ? &tmp->oid : NULL;\
+pmemobj_alloc((pop), oidp, (size), TOID_TYPE_NUM(t), (constr), (arg)); })
+
+#define POBJ_ZNEW(pop, o, t) (\
+{ TOID(t) *tmp = (o);\
+PMEMoid *oidp = tmp ? &tmp->oid : NULL;\
+pmemobj_zalloc((pop), oidp, sizeof (t), TOID_TYPE_NUM(t)); })
+
+#define POBJ_ZALLOC(pop, o, t, size) (\
+{ TOID(t) *tmp = (o);\
+PMEMoid *oidp = tmp ? &tmp->oid : NULL;\
+pmemobj_zalloc((pop), oidp, (size), TOID_TYPE_NUM(t)); })
+
+#define POBJ_REALLOC(pop, o, t, size) (\
+{ TOID(t) *tmp = (o);\
+PMEMoid *oidp = tmp ? &tmp->oid : NULL;\
+pmemobj_realloc((pop), oidp, (size), TOID_TYPE_NUM(t)); })
+
+#define POBJ_ZREALLOC(pop, o, t, size) (\
+{ TOID(t) *tmp = (o);\
+PMEMoid *oidp = tmp ? &tmp->oid : NULL;\
+pmemobj_zrealloc((pop), (PMEMoid *)(o), (size), TOID_TYPE_NUM_OF(*(o))); })
+
+#define POBJ_FREE(o) pmemobj_free((PMEMoid *)(o))
+
+#define POBJ_ROOT(pop, t) (\
+{ TOID(t) ret = (TOID(t))pmemobj_root((pop), sizeof (t));\
+ret; })
+
/*
* Debug helper function and macros
*/
@@ -387,36 +528,39 @@ for (_POBJ_DEBUG_NOTICE_IN_TX_FOR("POBJ_FOREACH_SAFE")\
varoid = nvaroid)
/*
- * Iterates through every object of the specified type number.
+ * Iterates through every object of the specified type.
*/
-#define POBJ_FOREACH_TYPE(pop, var, type_num)\
+#define POBJ_FOREACH_TYPE(pop, var)\
for (_POBJ_DEBUG_NOTICE_IN_TX_FOR("POBJ_FOREACH_TYPE")\
- OID_ASSIGN(var, pmemobj_first(pop, type_num));\
- OID_IS_NULL(var) == 0;\
- OID_ASSIGN(var, pmemobj_next((var).oid)))
+ var = (typeof((var)))pmemobj_first((pop),\
+ TOID_TYPE_NUM_OF(var));\
+ TOID_IS_NULL(var) == 0;\
+ var = POBJ_NEXT(var))
/*
- * Safe variant of POBJ_FOREACH_TYPE in which pmemobj_free on var is allowed
+ * Safe variant of POBJ_FOREACH_TYPE in which pmemobj_free on var
+ * is allowed.
*/
-#define POBJ_FOREACH_SAFE_TYPE(pop, var, nvar, type_num)\
+#define POBJ_FOREACH_SAFE_TYPE(pop, var, nvar)\
for (_POBJ_DEBUG_NOTICE_IN_TX_FOR("POBJ_FOREACH_SAFE_TYPE")\
- OID_ASSIGN(var, pmemobj_first(pop, type_num));\
- OID_IS_NULL(var) == 0 &&\
- (OID_ASSIGN(nvar, pmemobj_next((var).oid)), 1);\
- OID_ASSIGN_TYPED(var, nvar))
+ var = (typeof((var)))pmemobj_first((pop),\
+ TOID_TYPE_NUM_OF(var));\
+ TOID_IS_NULL(var) == 0 &&\
+ (nvar = POBJ_NEXT(var), 1);\
+ var = nvar)
/*
* Non-transactional persistent atomic circular doubly-linked list
*/
#define PLIST_ENTRY(type)\
struct {\
- OID_TYPE(type) pe_next;\
- OID_TYPE(type) pe_prev;\
+ TOID(type) pe_next;\
+ TOID(type) pe_prev;\
}
#define PLIST_HEAD(name, type)\
struct name {\
- OID_TYPE(type) pe_first;\
+ TOID(type) pe_first;\
PMEMmutex lock;\
}
@@ -435,37 +579,32 @@ int pmemobj_list_move(PMEMobjpool *pop, size_t pe_old_offset,
PMEMoid dest, int before, PMEMoid oid);
#define POBJ_LIST_FIRST(head) ((head)->pe_first)
-#define POBJ_LIST_LAST(head, field) (\
-{\
- OID_TYPE(typeof(*(head)->pe_first._type)) t;\
- if (OID_IS_NULL((head)->pe_first))\
- OID_ASSIGN_TYPED(t, (head)->pe_first);\
- else\
- OID_ASSIGN_TYPED(t, D_RO((head)->pe_first)->field.pe_prev);\
- t;\
-})
+#define POBJ_LIST_LAST(head, field) (\
+TOID_IS_NULL((head)->pe_first) ?\
+(head)->pe_first :\
+D_RO((head)->pe_first)->field.pe_prev)
-#define POBJ_LIST_EMPTY(head) (OID_IS_NULL((head)->pe_first))
+#define POBJ_LIST_EMPTY(head) (TOID_IS_NULL((head)->pe_first))
#define POBJ_LIST_NEXT(elm, field) (D_RO(elm)->field.pe_next)
#define POBJ_LIST_PREV(elm, field) (D_RO(elm)->field.pe_prev)
#define POBJ_LIST_FOREACH(var, head, field)\
for (_POBJ_DEBUG_NOTICE_IN_TX_FOR("POBJ_LIST_FOREACH")\
- OID_ASSIGN_TYPED((var), POBJ_LIST_FIRST((head)));\
- OID_IS_NULL((var)) == 0;\
- OID_EQUALS(POBJ_LIST_NEXT((var), field),\
+ (var) = POBJ_LIST_FIRST((head));\
+ TOID_IS_NULL((var)) == 0;\
+ TOID_EQUALS(POBJ_LIST_NEXT((var), field),\
POBJ_LIST_FIRST((head))) ?\
- OID_ASSIGN((var), OID_NULL) :\
- OID_ASSIGN_TYPED((var), POBJ_LIST_NEXT((var), field)))
+ TOID_ASSIGN((var), OID_NULL) :\
+ ((var) = POBJ_LIST_NEXT((var), field)))
#define POBJ_LIST_FOREACH_REVERSE(var, head, field)\
for (_POBJ_DEBUG_NOTICE_IN_TX_FOR("POBJ_LIST_FOREACH_REVERSE")\
- OID_ASSIGN_TYPED((var), POBJ_LIST_LAST((head), field));\
- OID_IS_NULL((var)) == 0;\
- OID_EQUALS(POBJ_LIST_PREV((var), field),\
+ (var) = POBJ_LIST_LAST((head), field);\
+ TOID_IS_NULL((var)) == 0;\
+ TOID_EQUALS(POBJ_LIST_PREV((var), field),\
POBJ_LIST_LAST((head), field)) ?\
- OID_ASSIGN((var), OID_NULL) :\
- OID_ASSIGN_TYPED((var), POBJ_LIST_PREV((var), field)))
+ TOID_ASSIGN((var), OID_NULL) :\
+ ((var) = POBJ_LIST_PREV((var), field)))
#define POBJ_LIST_INSERT_HEAD(pop, head, elm, field)\
pmemobj_list_insert((pop),\
@@ -491,35 +630,33 @@ pmemobj_list_insert((pop), offsetof(typeof (*D_RO((elm))),\
(head), (listelm).oid,\
1 /* before */, (elm).oid)
-#define POBJ_LIST_INSERT_NEW_HEAD(pop, head, type_num, field, constr, arg)\
+#define POBJ_LIST_INSERT_NEW_HEAD(pop, head, field, size, constr, arg)\
pmemobj_list_insert_new((pop),\
offsetof(typeof (*((head)->pe_first._type)), field),\
(head), POBJ_LIST_FIRST((head)).oid,\
- 1 /* before */, sizeof (*(POBJ_LIST_FIRST(head)._type)), type_num,\
- (constr), (arg))
+ 1 /* before */, (size),\
+ TOID_TYPE_NUM_OF((head)->pe_first), (constr), (arg))
-#define POBJ_LIST_INSERT_NEW_TAIL(pop, head, type_num, field, constr, arg)\
+#define POBJ_LIST_INSERT_NEW_TAIL(pop, head, field, size, constr, arg)\
pmemobj_list_insert_new((pop),\
offsetof(typeof (*((head)->pe_first._type)), field),\
(head), POBJ_LIST_LAST((head), field).oid,\
- 0 /* after */, sizeof (*(POBJ_LIST_FIRST(head)._type)), type_num,\
- (constr), (arg))
+ 0 /* after */, (size),\
+ TOID_TYPE_NUM_OF((head)->pe_first), (constr), (arg))
-#define POBJ_LIST_INSERT_NEW_AFTER(pop, head, listelm, type_num, field,\
+#define POBJ_LIST_INSERT_NEW_AFTER(pop, head, listelm, field, size,\
constr, arg)\
pmemobj_list_insert_new((pop),\
offsetof(typeof (*((head)->pe_first._type)), field),\
- (head), (listelm).oid, 0 /* after */,\
- sizeof (*(POBJ_LIST_FIRST(head)._type)), type_num,\
- (constr), (arg))
+ (head), (listelm).oid, 0 /* after */, (size),\
+ TOID_TYPE_NUM_OF((head)->pe_first), (constr), (arg))
-#define POBJ_LIST_INSERT_NEW_BEFORE(pop, head, listelm, type_num, field,\
- constr, arg)\
+#define POBJ_LIST_INSERT_NEW_BEFORE(pop, head, listelm, field, size,\
+ constr, arg)\
pmemobj_list_insert_new((pop),\
offsetof(typeof (*(POBJ_LIST_FIRST(head)._type)), field),\
- (head), (listelm).oid, 1 /* before */,\
- sizeof (*(POBJ_LIST_FIRST(head)._type)), type_num,\
- (constr), (arg))
+ (head), (listelm).oid, 1 /* before */, (size),\
+ TOID_TYPE_NUM_OF((head)->pe_first), (constr), (arg))
#define POBJ_LIST_REMOVE(pop, head, elm, field)\
pmemobj_list_remove((pop),\
@@ -713,40 +850,40 @@ int pmemobj_tx_add_range_direct(void *ptr, size_t size);
/*
* Transactionally allocates a new object.
*
- * If successful and called during TX_STAGE_WORK, function returns zero.
- * Otherwise, state changes to TX_STAGE_ONABORT and an error number is returned.
+ * If successful and called during TX_STAGE_WORK, function returns PMEMoid.
+ * Otherwise, state changes to TX_STAGE_ONABORT and an OID_NULL is returned.
*/
PMEMoid pmemobj_tx_alloc(size_t size, unsigned int type_num);
/*
* Transactionally allocates new zeroed object.
*
- * If successful and called during TX_STAGE_WORK, function returns zero.
- * Otherwise, state changes to TX_STAGE_ONABORT and an error number is returned.
+ * If successful and called during TX_STAGE_WORK, function returns PMEMoid.
+ * Otherwise, state changes to TX_STAGE_ONABORT and an OID_NULL is returned.
*/
PMEMoid pmemobj_tx_zalloc(size_t size, unsigned int type_num);
/*
* Transactionally resizes an existing object.
*
- * If successful and called during TX_STAGE_WORK, function returns zero.
- * Otherwise, state changes to TX_STAGE_ONABORT and an error number is returned.
+ * If successful and called during TX_STAGE_WORK, function returns PMEMoid.
+ * Otherwise, state changes to TX_STAGE_ONABORT and an OID_NULL is returned.
*/
PMEMoid pmemobj_tx_realloc(PMEMoid oid, size_t size, unsigned int type_num);
/*
* Transactionally resizes an existing object, if extended new space is zeroed.
*
- * If successful and called during TX_STAGE_WORK, function returns zero.
- * Otherwise, state changes to TX_STAGE_ONABORT and an error number is returned.
+ * If successful and called during TX_STAGE_WORK, function returns PMEMoid.
+ * Otherwise, state changes to TX_STAGE_ONABORT and an OID_NULL is returned.
*/
PMEMoid pmemobj_tx_zrealloc(PMEMoid oid, size_t size, unsigned int type_num);
/*
* Transactionally allocates a new object with duplicate of the string s.
*
- * If successful and called during TX_STAGE_WORK, function returns zero.
- * Otherwise, state changes to TX_STAGE_ONABORT and an error number is returned.
+ * If successful and called during TX_STAGE_WORK, function returns PMEMoid.
+ * Otherwise, state changes to TX_STAGE_ONABORT and an OID_NULL is returned.
*/
PMEMoid pmemobj_tx_strdup(const char *s, unsigned int type_num);
@@ -765,20 +902,29 @@ pmemobj_tx_add_range((o).oid, 0, sizeof (*(o)._type));
pmemobj_tx_add_range((o).oid, offsetof(typeof(*(o)._type), field),\
sizeof (D_RO(o)->field));\
-/*
- * TX_ALLOC (et al.) must be called inside the OID_ASSIGN macro.
- */
-#define TX_ALLOC(type, type_num)\
-pmemobj_tx_alloc(sizeof (type), type_num)
+#define TX_NEW(t) (\
+{ TOID(t) ret = (TOID(t))pmemobj_tx_alloc(sizeof (t),\
+TOID_TYPE_NUM(t)); ret; })
+
+#define TX_ALLOC(t, size) (\
+{ TOID(t) ret = (TOID(t))pmemobj_tx_alloc((size),\
+TOID_TYPE_NUM(t)); ret; })
+
+#define TX_ZNEW(t) (\
+{ TOID(t) ret = (TOID(t))pmemobj_tx_zalloc(sizeof (t),\
+TOID_TYPE_NUM(t)); ret; })
-#define TX_ZALLOC(type, type_num)\
-pmemobj_tx_zalloc(sizeof (type), type_num)
+#define TX_ZALLOC(t, size) (\
+{ TOID(t) ret = (TOID(t))pmemobj_tx_zalloc((size),\
+TOID_TYPE_NUM(t)); ret; })
-#define TX_REALLOC(o, size, type_num)\
-pmemobj_tx_realloc((o).oid, size, type_num)
+#define TX_REALLOC(o, size) (\
+{ TOID(t) ret = (TOID(t))pmemobj_tx_realloc(sizeof (t),\
+TOID_TYPE_NUM_OF(o)); ret; })
-#define TX_ZREALLOC(o, size, type_num)\
-pmemobj_tx_zrealloc((o).oid, size, type_num)
+#define TX_ZREALLOC(o, size, type_num) (\
+{ TOID(t) ret = (TOID(t))pmemobj_tx_zrealloc(sizeof (t),\
+TOID_TYPE_NUM_OF(o)); ret; })
#define TX_STRDUP(s, type_num)\
pmemobj_tx_strdup(s, type_num)
diff --git a/src/libpmemobj/libpmemobj.map b/src/libpmemobj/libpmemobj.map
index 6d7842462eae3da12d77816bade2247822e784c9..8eb48efe29dba8d679193097ae2dd75e5742b941 100644
--- a/src/libpmemobj/libpmemobj.map
+++ b/src/libpmemobj/libpmemobj.map
@@ -61,12 +61,12 @@ libpmemobj.so {
pmemobj_direct;
pmemobj_alloc;
pmemobj_zalloc;
- pmemobj_alloc_construct;
pmemobj_realloc;
pmemobj_zrealloc;
pmemobj_strndup;
pmemobj_free;
pmemobj_alloc_usable_size;
+ pmemobj_type_num;
pmemobj_root;
pmemobj_root_size;
pmemobj_first;
diff --git a/src/libpmemobj/list.c b/src/libpmemobj/list.c
index 6dbe360c4e63ab03567ace7f5bef54dc46497ee1..55e876858cd25ea40a785d0fe4e585a3c61ffb89 100644
--- a/src/libpmemobj/list.c
+++ b/src/libpmemobj/list.c
@@ -201,6 +201,32 @@ list_get_dest(PMEMobjpool *pop, struct list_head *head, PMEMoid dest,
return first_ptr->pe_prev;
}
+/*
+ * list_set_oid_redo_log -- (internal) set PMEMoid value using redo log
+ */
+static size_t
+list_set_oid_redo_log(PMEMobjpool *pop,
+ struct redo_log *redo, size_t redo_index,
+ PMEMoid *oidp, uint64_t obj_doffset)
+{
+ ASSERT(OBJ_PTR_IS_VALID(pop, oidp));
+
+ if (oidp->pool_uuid_lo != pop->uuid_lo) {
+ ASSERTeq(oidp->pool_uuid_lo, 0);
+ uint64_t oid_uuid_off = OBJ_PTR_TO_OFF(pop,
+ &oidp->pool_uuid_lo);
+ redo_log_store(pop, redo, redo_index, oid_uuid_off,
+ pop->uuid_lo);
+ redo_index += 1;
+ }
+
+ uint64_t oid_off_off = OBJ_PTR_TO_OFF(pop, &oidp->off);
+ redo_log_store(pop, redo, redo_index, oid_off_off, obj_doffset);
+
+ return redo_index + 1;
+}
+
+
/*
* list_update_head -- (internal) update pe_first entry in list head
*/
@@ -666,23 +692,25 @@ list_realloc_replace(PMEMobjpool *pop,
* size - size of allocation, will be increased by OBJ_OOB_OFFSET
* constructor - object's constructor
* arg - argument for object's constructor
+ * oidp - pointer to target object ID
*/
-PMEMoid
+int
list_insert_new(PMEMobjpool *pop, struct list_head *oob_head,
size_t pe_offset, struct list_head *head, PMEMoid dest, int before,
- size_t size, void (*constructor)(void *ptr, void *arg), void *arg)
+ size_t size, void (*constructor)(void *ptr, void *arg), void *arg,
+ PMEMoid *oidp)
{
LOG(3, NULL);
ASSERTne(oob_head, NULL);
int ret;
- PMEMoid retoid = OID_NULL;
+ int out_ret;
struct lane_section *lane_section;
- if (lane_hold(pop, &lane_section, LANE_SECTION_LIST)) {
+ if ((ret = lane_hold(pop, &lane_section, LANE_SECTION_LIST))) {
LOG(2, "lane_hold failed");
- return OID_NULL;
+ return ret;
}
ASSERTne(lane_section, NULL);
@@ -694,13 +722,13 @@ list_insert_new(PMEMobjpool *pop, struct list_head *oob_head,
*
* XXX performance improvement: initialize oob locks at pool opening
*/
- if (pmemobj_mutex_lock(pop, &oob_head->lock)) {
+ if ((ret = pmemobj_mutex_lock(pop, &oob_head->lock))) {
LOG(2, "pmemobj_mutex_lock failed");
goto err_oob_lock;
}
if (head) {
- if (pmemobj_mutex_lock(pop, &head->lock)) {
+ if ((ret = pmemobj_mutex_lock(pop, &head->lock))) {
LOG(2, "pmemobj_mutex_lock failed");
goto err_lock;
}
@@ -719,12 +747,14 @@ list_insert_new(PMEMobjpool *pop, struct list_head *oob_head,
§ion->obj_offset, size,
constructor, arg, OBJ_OOB_OFFSET))) {
LOG(1, "!pmalloc_construct");
+ ret = -1;
goto err_pmalloc;
}
} else {
if ((errno = pmalloc(pop, §ion->obj_offset,
size))) {
LOG(1, "!pmalloc");
+ ret = -1;
goto err_pmalloc;
}
}
@@ -783,34 +813,42 @@ list_insert_new(PMEMobjpool *pop, struct list_head *oob_head,
next_offset, prev_offset);
}
+ if (oidp != NULL) {
+ if (OBJ_PTR_IS_VALID(pop, oidp))
+ redo_index = list_set_oid_redo_log(pop, redo,
+ redo_index, oidp, obj_doffset);
+ else {
+ oidp->off = obj_doffset;
+ oidp->pool_uuid_lo = pop->uuid_lo;
+ }
+ }
+
/* clear the obj_offset in lane section */
redo_log_store_last(pop, redo, redo_index, sec_off_off, 0);
ASSERT(redo_index <= REDO_NUM_ENTRIES);
redo_log_process(pop, redo, REDO_NUM_ENTRIES);
- retoid.pool_uuid_lo = pop->uuid_lo;
- retoid.off = obj_doffset;
-
+ ret = 0;
err_pmalloc:
if (head) {
- ret = pmemobj_mutex_unlock(pop, &head->lock);
- ASSERTeq(ret, 0);
- if (ret)
+ out_ret = pmemobj_mutex_unlock(pop, &head->lock);
+ ASSERTeq(out_ret, 0);
+ if (out_ret)
LOG(2, "pmemobj_mutex_unlock failed");
}
err_lock:
- ret = pmemobj_mutex_unlock(pop, &oob_head->lock);
- ASSERTeq(ret, 0);
- if (ret)
+ out_ret = pmemobj_mutex_unlock(pop, &oob_head->lock);
+ ASSERTeq(out_ret, 0);
+ if (out_ret)
LOG(2, "pmemobj_mutex_unlock failed");
err_oob_lock:
- ret = lane_release(pop);
- ASSERTeq(ret, 0);
- if (ret)
+ out_ret = lane_release(pop);
+ ASSERTeq(out_ret, 0);
+ if (out_ret)
LOG(2, "lane_release failed");
- return retoid;
+ return ret;
}
/*
@@ -914,12 +952,12 @@ err:
* oob_head - oob list head
* pe_offset - offset to list entry on user list relative to user data
* head - user list head
- * oid - target object ID
+ * oidp - pointer to target object ID
*/
int
list_remove_free(PMEMobjpool *pop, struct list_head *oob_head,
size_t pe_offset, struct list_head *head,
- PMEMoid oid)
+ PMEMoid *oidp)
{
LOG(3, NULL);
ASSERTne(oob_head, NULL);
@@ -961,7 +999,7 @@ list_remove_free(PMEMobjpool *pop, struct list_head *oob_head,
struct redo_log *redo = section->redo;
size_t redo_index = 0;
- uint64_t obj_doffset = oid.off;
+ uint64_t obj_doffset = oidp->off;
uint64_t obj_offset = obj_doffset - OBJ_OOB_OFFSET;
struct list_entry *oob_entry_ptr =
@@ -994,6 +1032,13 @@ list_remove_free(PMEMobjpool *pop, struct list_head *oob_head,
redo_index = list_remove_single(pop, redo, redo_index, &args);
}
+ /* clear the oid */
+ if (OBJ_PTR_IS_VALID(pop, oidp))
+ redo_index = list_set_oid_redo_log(pop, redo, redo_index,
+ oidp, 0);
+ else
+ oidp->off = 0;
+
redo_log_store_last(pop, redo, redo_index, sec_off_off, obj_offset);
ASSERT(redo_index <= REDO_NUM_ENTRIES);
@@ -1006,6 +1051,8 @@ list_remove_free(PMEMobjpool *pop, struct list_head *oob_head,
if ((errno = pfree(pop, §ion->obj_offset))) {
LOG(1, "!pfree");
ret = -1;
+ } else {
+ ret = 0;
}
if (head) {
@@ -1334,17 +1381,18 @@ err:
* arg - argument for object's constructor
* field_offset - offset to user's field
* field_value - user's field value
- * oid - target object ID
+ * oidp - pointer to target object ID
*/
int
list_realloc(PMEMobjpool *pop, struct list_head *oob_head,
size_t pe_offset, struct list_head *head,
size_t size, void (*constructor)(void *ptr, void *arg), void *arg,
uint64_t field_offset, uint64_t field_value,
- PMEMoid *oid)
+ PMEMoid *oidp)
{
LOG(3, NULL);
ASSERTne(oob_head, NULL);
+ ASSERTne(oidp, NULL);
int ret;
int out_ret;
@@ -1383,7 +1431,7 @@ list_realloc(PMEMobjpool *pop, struct list_head *oob_head,
(struct lane_list_section *)lane_section->layout;
struct redo_log *redo = section->redo;
size_t redo_index = 0;
- uint64_t obj_doffset = oid->off;
+ uint64_t obj_doffset = oidp->off;
uint64_t obj_offset = obj_doffset - OBJ_OOB_OFFSET;
uint64_t old_size = pmalloc_usable_size(pop, obj_offset);
uint64_t sec_off_off = OBJ_PTR_TO_OFF(pop, §ion->obj_offset);
@@ -1458,8 +1506,11 @@ list_realloc(PMEMobjpool *pop, struct list_head *oob_head,
ASSERT(redo_index <= REDO_NUM_ENTRIES);
redo_log_process(pop, redo, REDO_NUM_ENTRIES);
- /* return new oid */
- oid->off = new_obj_doffset;
+ if (OBJ_PTR_IS_VALID(pop, oidp))
+ redo_index = list_set_oid_redo_log(pop, redo,
+ redo_index, oidp, obj_doffset);
+ else
+ oidp->off = new_obj_doffset;
/* free the old object */
if ((errno = pfree(pop, §ion->obj_offset))) {
@@ -1524,6 +1575,7 @@ list_realloc(PMEMobjpool *pop, struct list_head *oob_head,
redo_log_process(pop, redo, REDO_NUM_ENTRIES);
}
+ ret = 0;
err_unlock:
if (head) {
out_ret = pmemobj_mutex_unlock(pop, &head->lock);
@@ -1558,7 +1610,7 @@ err_oob_lock:
* arg - argument for object's constructor
* field_offset - offset to user's field
* field_value - user's field value
- * oid - target object ID
+ * oidp - pointer to target object ID
*/
int
list_realloc_move(PMEMobjpool *pop, struct list_head *oob_head_old,
@@ -1566,7 +1618,7 @@ list_realloc_move(PMEMobjpool *pop, struct list_head *oob_head_old,
struct list_head *head, size_t size,
void (*constructor)(void *ptr, void *arg), void *arg,
uint64_t field_offset, uint64_t field_value,
- PMEMoid *oid)
+ PMEMoid *oidp)
{
LOG(3, NULL);
@@ -1611,7 +1663,7 @@ list_realloc_move(PMEMobjpool *pop, struct list_head *oob_head_old,
}
}
- uint64_t obj_doffset = oid->off;
+ uint64_t obj_doffset = oidp->off;
uint64_t obj_offset = obj_doffset - OBJ_OOB_OFFSET;
uint64_t new_obj_doffset = obj_doffset;
uint64_t new_obj_offset = obj_offset;
@@ -1655,8 +1707,11 @@ list_realloc_move(PMEMobjpool *pop, struct list_head *oob_head_old,
sec_off_off, obj_offset);
redo_index += 1;
- /* return new oid */
- oid->off = new_obj_doffset;
+ if (OBJ_PTR_IS_VALID(pop, oidp))
+ redo_index = list_set_oid_redo_log(pop, redo,
+ redo_index, oidp, obj_doffset);
+ else
+ oidp->off = new_obj_doffset;
} else {
/*
* The following steps may be in consistency with the recovery
@@ -1775,6 +1830,7 @@ list_realloc_move(PMEMobjpool *pop, struct list_head *oob_head_old,
}
}
+ ret = 0;
err_unlock:
if (head) {
out_ret = pmemobj_mutex_unlock(pop, &head->lock);
diff --git a/src/libpmemobj/list.h b/src/libpmemobj/list.h
index ec5e4ed957839da1abb107ed1ccd788633ea50c3..853e6d9267a6c9ffd4466c75fb703b58b6e16af0 100644
--- a/src/libpmemobj/list.h
+++ b/src/libpmemobj/list.h
@@ -44,22 +44,23 @@ struct list_head {
PMEMmutex lock;
};
-PMEMoid list_insert_new(PMEMobjpool *pop, struct list_head *oob_head,
+int list_insert_new(PMEMobjpool *pop, struct list_head *oob_head,
size_t pe_offset, struct list_head *head, PMEMoid dest, int before,
- size_t size, void (*constructor)(void *ptr, void *arg), void *arg);
+ size_t size, void (*constructor)(void *ptr, void *arg), void *arg,
+ PMEMoid *oidp);
int list_realloc(PMEMobjpool *pop, struct list_head *oob_head,
size_t pe_offset, struct list_head *head,
size_t size, void (*constructor)(void *ptr, void *arg), void *arg,
uint64_t field_offset, uint64_t field_value,
- PMEMoid *oid);
+ PMEMoid *oidp);
int list_realloc_move(PMEMobjpool *pop, struct list_head *oob_head_old,
struct list_head *oob_head_new, size_t pe_offset,
struct list_head *head, size_t size,
void (*constructor)(void *ptr, void *arg), void *arg,
uint64_t field_offset, uint64_t field_value,
- PMEMoid *oid);
+ PMEMoid *oidp);
int list_insert(PMEMobjpool *pop,
size_t pe_offset, struct list_head *head, PMEMoid dest, int before,
@@ -67,7 +68,7 @@ int list_insert(PMEMobjpool *pop,
int list_remove_free(PMEMobjpool *pop, struct list_head *oob_head,
size_t pe_offset, struct list_head *head,
- PMEMoid oid);
+ PMEMoid *oidp);
int list_remove(PMEMobjpool *pop,
size_t pe_offset, struct list_head *head,
diff --git a/src/libpmemobj/obj.c b/src/libpmemobj/obj.c
index d7e031f9ddd1a1191e8ae81389334e9812a63b26..cc584e4a318ff1eada8072e8c6e65d87f5af8bb0 100644
--- a/src/libpmemobj/obj.c
+++ b/src/libpmemobj/obj.c
@@ -548,15 +548,16 @@ constructor_alloc_bytype(void *ptr, void *arg)
/*
* obj_alloc_construct -- (internal) allocates a new object with constructor
*/
-static PMEMoid
-obj_alloc_construct(PMEMobjpool *pop, size_t size, unsigned int type_num,
- void (*constructor)(void *ptr, void *arg), void *arg)
+static int
+obj_alloc_construct(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
+ unsigned int type_num, void (*constructor)(void *ptr, void *arg),
+ void *arg)
{
if (type_num >= PMEMOBJ_NUM_OID_TYPES) {
LOG(2, "type_num has to be in range [0, %i]",
PMEMOBJ_NUM_OID_TYPES - 1);
errno = EINVAL;
- return OID_NULL;
+ return -1;
}
struct list_head *lhead = &pop->store->bytype[type_num].head;
@@ -568,21 +569,24 @@ obj_alloc_construct(PMEMobjpool *pop, size_t size, unsigned int type_num,
carg.arg = arg;
return list_insert_new(pop, lhead, 0, NULL, OID_NULL, 0, size,
- constructor_alloc_bytype, &carg);
+ constructor_alloc_bytype, &carg, oidp);
}
/*
* pmemobj_alloc -- allocates a new object
*/
-PMEMoid
-pmemobj_alloc(PMEMobjpool *pop, size_t size, unsigned int type_num)
+int
+pmemobj_alloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
+ unsigned int type_num, void (*constructor)(void *ptr, void *arg),
+ void *arg)
{
- LOG(3, "pop %p size %zu type_num %u", pop, size, type_num);
+ LOG(3, "pop %p oidp %p size %zu type_num %u constructor %p arg %p",
+ pop, oidp, size, type_num, constructor, arg);
/* log notice message if used inside a transaction */
_POBJ_DEBUG_NOTICE_IN_TX();
- return obj_alloc_construct(pop, size, type_num, NULL, NULL);
+ return obj_alloc_construct(pop, oidp, size, type_num, constructor, arg);
}
/* arguments for constructor_zalloc */
@@ -610,10 +614,12 @@ constructor_zalloc(void *ptr, void *arg)
/*
* pmemobj_zalloc -- allocates a new zeroed object
*/
-PMEMoid
-pmemobj_zalloc(PMEMobjpool *pop, size_t size, unsigned int type_num)
+int
+pmemobj_zalloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
+ unsigned int type_num)
{
- LOG(3, "pop %p size %zu type_num %u", pop, size, type_num);
+ LOG(3, "pop %p oidp %p size %zu type_num %u",
+ pop, oidp, size, type_num);
/* log notice message if used inside a transaction */
_POBJ_DEBUG_NOTICE_IN_TX();
@@ -622,36 +628,20 @@ pmemobj_zalloc(PMEMobjpool *pop, size_t size, unsigned int type_num)
carg.pop = pop;
carg.size = size;
- return obj_alloc_construct(pop, size, type_num,
+ return obj_alloc_construct(pop, oidp, size, type_num,
constructor_zalloc, &carg);
}
-/*
- * pmemobj_alloc_construct -- allocates a new object with constructor
- */
-PMEMoid
-pmemobj_alloc_construct(PMEMobjpool *pop, size_t size, unsigned int type_num,
- void (*constructor)(void *ptr, void *arg), void *arg)
-{
- LOG(3, "pop %p size %zu type_num %u constructor %p arg %p",
- pop, size, type_num, constructor, arg);
-
- /* log notice message if used inside a transaction */
- _POBJ_DEBUG_NOTICE_IN_TX();
-
- return obj_alloc_construct(pop, size, type_num, constructor, arg);
-}
-
/*
* obj_realloc_construct -- (internal) common routine for resizing
* existing objects
*/
-static PMEMoid
+static int
obj_realloc_construct(PMEMobjpool *pop, struct object_store *store,
- PMEMoid oid, size_t size, unsigned int type_num,
+ PMEMoid *oidp, size_t size, unsigned int type_num,
void (*constructor)(void *ptr, void *arg), void *arg)
{
- struct oob_header *pobj = OOB_HEADER_FROM_OID(pop, oid);
+ struct oob_header *pobj = OOB_HEADER_FROM_OID(pop, *oidp);
uint16_t user_type_old = pobj->user_type;
ASSERT(user_type_old < PMEMOBJ_NUM_OID_TYPES);
@@ -660,29 +650,27 @@ obj_realloc_construct(PMEMobjpool *pop, struct object_store *store,
LOG(2, "type_num has to be in range [0, %u]",
PMEMOBJ_NUM_OID_TYPES - 1);
errno = EINVAL;
- return OID_NULL;
+ return -1;
}
struct list_head *lhead_old = &store->bytype[user_type_old].head;
-
if (type_num == user_type_old) {
- if (list_realloc(pop, lhead_old, 0, NULL, size,
- constructor, arg, 0, 0, &oid)) {
+ int ret = list_realloc(pop, lhead_old, 0, NULL, size,
+ constructor, arg, 0, 0, oidp);
+ if (ret)
LOG(2, "list_realloc failed");
- return OID_NULL;
- } else
- return oid;
+
+ return ret;
} else {
struct list_head *lhead_new = &store->bytype[type_num].head;
- uint64_t user_type_offset = OOB_OFFSET_OF(oid, user_type);
-
- if (list_realloc_move(pop, lhead_old, lhead_new, 0, NULL, size,
- constructor, arg, user_type_offset,
- type_num, &oid)) {
+ uint64_t user_type_offset = OOB_OFFSET_OF(*oidp, user_type);
+ int ret = list_realloc_move(pop, lhead_old, lhead_new, 0, NULL,
+ size, constructor, arg, user_type_offset,
+ type_num, oidp);
+ if (ret)
LOG(2, "list_realloc_move failed");
- return OID_NULL;
- } else
- return oid;
+
+ return ret;
}
}
@@ -717,29 +705,29 @@ constructor_zrealloc(void *ptr, void *arg)
/*
* pmemobj_realloc -- resizes an existing object
*/
-PMEMoid
-pmemobj_realloc(PMEMobjpool *pop, PMEMoid oid, size_t size,
+int
+pmemobj_realloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
unsigned int type_num)
{
LOG(3, "pop %p oid.off 0x%016jx size %zu type_num %u",
- pop, oid.off, size, type_num);
+ pop, oidp->off, size, type_num);
/* log notice message if used inside a transaction */
_POBJ_DEBUG_NOTICE_IN_TX();
- return obj_realloc_construct(pop, pop->store, oid, size, type_num,
+ return obj_realloc_construct(pop, pop->store, oidp, size, type_num,
NULL, NULL);
}
/*
* pmemobj_zrealloc -- resizes an existing object, any new space is zeroed.
*/
-PMEMoid
-pmemobj_zrealloc(PMEMobjpool *pop, PMEMoid oid, size_t size,
- unsigned int type_num)
+int
+pmemobj_zrealloc(PMEMobjpool *pop, PMEMoid *oidp, size_t size,
+ unsigned int type_num)
{
LOG(3, "pop %p oid.off 0x%016jx size %zu type_num %u",
- pop, oid.off, size, type_num);
+ pop, oidp->off, size, type_num);
/* log notice message if used inside a transaction */
_POBJ_DEBUG_NOTICE_IN_TX();
@@ -748,13 +736,13 @@ pmemobj_zrealloc(PMEMobjpool *pop, PMEMoid oid, size_t size,
carg.pop = pop;
carg.new_size = size;
- carg.old_size = pmemobj_alloc_usable_size(oid);
+ carg.old_size = pmemobj_alloc_usable_size(*oidp);
if (carg.new_size > carg.old_size)
- return obj_realloc_construct(pop, pop->store, oid, size,
+ return obj_realloc_construct(pop, pop->store, oidp, size,
type_num, constructor_zrealloc, &carg);
else
- return obj_realloc_construct(pop, pop->store, oid, size,
+ return obj_realloc_construct(pop, pop->store, oidp, size,
type_num, NULL, NULL);
}
@@ -785,10 +773,11 @@ constructor_strdup(void *ptr, void *arg)
/*
* pmemobj_strndup -- allocates a new object with duplicate of the string s.
*/
-PMEMoid
-pmemobj_strdup(PMEMobjpool *pop, const char *s, unsigned int type_num)
+int
+pmemobj_strdup(PMEMobjpool *pop, PMEMoid *oidp, const char *s,
+ unsigned int type_num)
{
- LOG(3, "pop %p string %s type_num %u", pop, s, type_num);
+ LOG(3, "pop %p oidp %p string %s type_num %u", pop, oidp, s, type_num);
/* log notice message if used inside a transaction */
_POBJ_DEBUG_NOTICE_IN_TX();
@@ -797,12 +786,12 @@ pmemobj_strdup(PMEMobjpool *pop, const char *s, unsigned int type_num)
LOG(2, "type_num has to be in range [0, %i]",
PMEMOBJ_NUM_OID_TYPES - 1);
errno = EINVAL;
- return OID_NULL;
+ return -1;
}
if (NULL == s) {
errno = EINVAL;
- return OID_NULL;
+ return -1;
}
struct carg_strdup carg;
@@ -810,7 +799,7 @@ pmemobj_strdup(PMEMobjpool *pop, const char *s, unsigned int type_num)
carg.size = (strlen(s) + 1) * sizeof (char);
carg.s = s;
- return obj_alloc_construct(pop, carg.size, type_num,
+ return obj_alloc_construct(pop, oidp, carg.size, type_num,
constructor_strdup, &carg);
}
@@ -818,28 +807,27 @@ pmemobj_strdup(PMEMobjpool *pop, const char *s, unsigned int type_num)
* pmemobj_free -- frees an existing object
*/
void
-pmemobj_free(PMEMoid oid)
+pmemobj_free(PMEMoid *oidp)
{
- LOG(3, "oid.off 0x%016jx", oid.off);
+ LOG(3, "oid.off 0x%016jx", oidp->off);
/* log notice message if used inside a transaction */
_POBJ_DEBUG_NOTICE_IN_TX();
- if (oid.off == 0)
+ if (oidp->off == 0)
return;
- PMEMobjpool *pop = cuckoo_get(pools, oid.pool_uuid_lo);
+ PMEMobjpool *pop = cuckoo_get(pools, oidp->pool_uuid_lo);
ASSERTne(pop, NULL);
- struct oob_header *pobj = OOB_HEADER_FROM_OID(pop, oid);
+ struct oob_header *pobj = OOB_HEADER_FROM_OID(pop, *oidp);
ASSERT(pobj->user_type < PMEMOBJ_NUM_OID_TYPES);
void *lhead = &pop->store->bytype[pobj->user_type].head;
- if (list_remove_free(pop, lhead, 0, NULL, oid)) {
+ if (list_remove_free(pop, lhead, 0, NULL, oidp))
LOG(2, "list_remove_free failed");
- }
}
/*
@@ -907,6 +895,24 @@ pmemobj_drain(PMEMobjpool *pop)
pop->drain();
}
+/*
+ * pmemobj_type_num -- returns type number of object
+ */
+unsigned int
+pmemobj_type_num(PMEMoid oid)
+{
+ LOG(3, "oid.off 0x%016jx", oid.off);
+
+ if (OBJ_OID_IS_NULL(oid))
+ return -1;
+
+ PMEMobjpool *pop = cuckoo_get(pools, oid.pool_uuid_lo);
+ ASSERTne(pop, NULL);
+
+ struct oob_header *oobh = OOB_HEADER_FROM_OID(pop, oid);
+ return oobh->user_type;
+}
+
/* arguments for constructor_alloc_root */
struct carg_root {
PMEMobjpool *pop; /* saved to call pop->persist */
@@ -928,7 +934,7 @@ constructor_alloc_root(void *ptr, void *arg)
struct carg_root *carg = arg;
ro->internal_type = TYPE_ALLOCATED;
- ro->user_type = UINT16_MAX;
+ ro->user_type = POBJ_ROOT_TYPE_NUM;
ro->size = carg->size;
carg->pop->persist(ro, OBJ_OOB_OFFSET);
}
@@ -936,7 +942,7 @@ constructor_alloc_root(void *ptr, void *arg)
/*
* obj_alloc_root -- (internal) allocate root object
*/
-static PMEMoid
+static int
obj_alloc_root(PMEMobjpool *pop, struct object_store *store, size_t size)
{
LOG(3, "pop %p store %p size %zu", pop, store, size);
@@ -948,7 +954,7 @@ obj_alloc_root(PMEMobjpool *pop, struct object_store *store, size_t size)
carg.size = size;
return list_insert_new(pop, lhead, 0, NULL, OID_NULL, 0,
- size, constructor_alloc_root, &carg);
+ size, constructor_alloc_root, &carg, NULL);
}
/*
@@ -1103,9 +1109,11 @@ pmemobj_list_insert_new(PMEMobjpool *pop, size_t pe_offset, void *head,
carg.constructor = constructor;
carg.arg = arg;
- return list_insert_new(pop, lhead,
- pe_offset, head, dest, before,
- size, constructor_alloc_bytype, &carg);
+ PMEMoid retoid = OID_NULL;
+ list_insert_new(pop, lhead,
+ pe_offset, head, dest, before,
+ size, constructor_alloc_bytype, &carg, &retoid);
+ return retoid;
}
/*
@@ -1127,7 +1135,7 @@ pmemobj_list_remove(PMEMobjpool *pop, size_t pe_offset, void *head,
ASSERT(pobj->user_type < PMEMOBJ_NUM_OID_TYPES);
void *lhead = &pop->store->bytype[pobj->user_type].head;
- return list_remove_free(pop, lhead, pe_offset, head, oid);
+ return list_remove_free(pop, lhead, pe_offset, head, &oid);
} else
return list_remove(pop, pe_offset, head, oid);
}
diff --git a/src/libpmemobj/obj.h b/src/libpmemobj/obj.h
index b7987b78994a2770dd86535bd476aa5229d01f4e..a95bbc242d6a7859f2e5d6840baf15ec16172619 100644
--- a/src/libpmemobj/obj.h
+++ b/src/libpmemobj/obj.h
@@ -60,6 +60,10 @@
#define OBJ_PTR_TO_OFF(pop, ptr) ((uintptr_t)(ptr) - (uintptr_t)(pop))
#define OBJ_OID_IS_NULL(oid) ((oid).off == 0)
#define OBJ_LIST_EMPTY(head) OBJ_OID_IS_NULL((head)->pe_first)
+#define OBJ_PTR_IS_VALID(pop, ptr)\
+ (OBJ_PTR_TO_OFF(pop, ptr) >= (pop)->heap_offset &&\
+ OBJ_PTR_TO_OFF(pop, ptr) < (pop)->heap_offset + (pop)->heap_size)
+
#define OOB_HEADER_FROM_OID(pop, oid)\
((struct oob_header *)((uintptr_t)(pop) + (oid).off - OBJ_OOB_OFFSET))
diff --git a/src/libpmemobj/tx.c b/src/libpmemobj/tx.c
index 194b1bebc4d8a34aef96f872b84e14af695a11bc..dcbe7be21f1eb5d2a004d5d1ff6a1042eeaba333 100644
--- a/src/libpmemobj/tx.c
+++ b/src/libpmemobj/tx.c
@@ -275,7 +275,7 @@ tx_clear_undo_log(PMEMobjpool *pop, struct list_head *head)
/* remove and free all elements from undo log */
ret = list_remove_free(pop, head,
- 0, NULL, obj);
+ 0, NULL, &obj);
ASSERTeq(ret, 0);
if (ret) {
@@ -350,7 +350,7 @@ tx_abort_set(PMEMobjpool *pop, struct lane_tx_layout *layout)
pop->memcpy_persist(dst_ptr, range->data, range->size);
/* remove snapshot from undo log */
- ret = list_remove_free(pop, &layout->undo_set, 0, NULL, obj);
+ ret = list_remove_free(pop, &layout->undo_set, 0, NULL, &obj);
ASSERTeq(ret, 0);
if (ret) {
@@ -663,17 +663,15 @@ tx_alloc_common(size_t size, unsigned int type_num,
};
/* allocate object to undo log */
- PMEMoid ret = list_insert_new(lane->pop, &layout->undo_alloc,
+ PMEMoid retoid = OID_NULL;
+ list_insert_new(lane->pop, &layout->undo_alloc,
0, NULL, OID_NULL, 0,
- size, constructor, &args);
+ size, constructor, &args, &retoid);
- if (OBJ_OID_IS_NULL(ret)) {
- LOG(1, "out of memory");
- errno = ENOMEM;
+ if (OBJ_OID_IS_NULL(retoid))
pmemobj_tx_abort(ENOMEM);
- }
- return ret;
+ return retoid;
}
/*
@@ -707,17 +705,15 @@ tx_alloc_copy_common(size_t size, unsigned int type_num, const void *ptr,
};
/* allocate object to undo log */
- PMEMoid ret = list_insert_new(lane->pop, &layout->undo_alloc,
+ PMEMoid retoid;
+ int ret = list_insert_new(lane->pop, &layout->undo_alloc,
0, NULL, OID_NULL, 0,
- size, constructor, &args);
+ size, constructor, &args, &retoid);
- if (OBJ_OID_IS_NULL(ret)) {
- LOG(1, "out of memory");
- errno = ENOMEM;
+ if (ret || OBJ_OID_IS_NULL(retoid))
pmemobj_tx_abort(ENOMEM);
- }
- return ret;
+ return retoid;
}
/*
@@ -770,7 +766,7 @@ tx_realloc_common(PMEMoid oid, size_t size, unsigned int type_num,
(struct lane_tx_layout *)tx.section->layout;
int ret = list_remove_free(lane->pop,
&layout->undo_alloc,
- 0, NULL, new_obj);
+ 0, NULL, &new_obj);
/* XXX fatal error */
ASSERTeq(ret, 0);
if (ret)
@@ -1064,14 +1060,15 @@ pmemobj_tx_add_common(struct tx_add_range_args *args)
#endif /* DEBUG */
/* insert snapshot to undo log */
- PMEMoid snapshot = list_insert_new(args->pop, &layout->undo_set, 0,
+ PMEMoid snapshot;
+ int ret = list_insert_new(args->pop, &layout->undo_set, 0,
NULL, OID_NULL, 0,
args->size + sizeof (struct tx_range),
- constructor_tx_add_range, args);
+ constructor_tx_add_range, args, &snapshot);
- ASSERT(!OBJ_OID_IS_NULL(snapshot));
+ ASSERTeq(ret, 0);
- return OBJ_OID_IS_NULL(snapshot);
+ return ret;
}
/*
@@ -1274,7 +1271,7 @@ pmemobj_tx_free(PMEMoid oid)
* so we can just remove and free the object from undo log.
*/
return list_remove_free(lane->pop, &layout->undo_alloc,
- 0, NULL, oid);
+ 0, NULL, &oid);
}
}
diff --git a/src/test/obj_basic_integration/TEST0 b/src/test/obj_basic_integration/TEST0
index 167011952047b0e1a6b4c5fb8e299b705a6a550e..921b23b50dad65a4c83d4ded804acc508a142539 100755
--- a/src/test/obj_basic_integration/TEST0
+++ b/src/test/obj_basic_integration/TEST0
@@ -39,8 +39,10 @@ export UNITTEST_NUM=0
setup
+rm -rf $DIR/testfile1
+
expect_normal_exit\
- ./obj_basic_integration$EXESUFFIX $DIR/testfile1 2> /dev/null
+ ./obj_basic_integration$EXESUFFIX $DIR/testfile1
rm -rf $DIR/testfile1
diff --git a/src/test/obj_basic_integration/obj_basic_integration.c b/src/test/obj_basic_integration/obj_basic_integration.c
index 78108ea4d7f4b2aa3ee9419e8bea81eb05e8b3b9..aa5391ed9e51260d73d3bacea70d6ba8e6a023f4 100644
--- a/src/test/obj_basic_integration/obj_basic_integration.c
+++ b/src/test/obj_basic_integration/obj_basic_integration.c
@@ -39,12 +39,19 @@
#include "unittest.h"
-#define LAYOUT_NAME "basic"
-
#define TEST_STR "abcdefgh"
#define TEST_STR_LEN 8
#define TEST_VALUE 5
+/*
+ * Layout definition
+ */
+POBJ_LAYOUT_BEGIN(basic);
+POBJ_LAYOUT_ROOT(basic, struct dummy_root);
+POBJ_LAYOUT_TOID(basic, struct dummy_node);
+POBJ_LAYOUT_TOID(basic, struct dummy_node_c);
+POBJ_LAYOUT_END(basic);
+
struct dummy_node {
int value;
char teststr[TEST_STR_LEN];
@@ -52,10 +59,17 @@ struct dummy_node {
PLIST_ENTRY(struct dummy_node) plist_m;
};
+struct dummy_node_c {
+ int value;
+ char teststr[TEST_STR_LEN];
+ PLIST_ENTRY(struct dummy_node) plist;
+ PLIST_ENTRY(struct dummy_node) plist_m;
+};
+
struct dummy_root {
int value;
PMEMmutex lock;
- OID_TYPE(struct dummy_node) node;
+ TOID(struct dummy_node) node;
PLIST_HEAD(dummy_list, struct dummy_node) dummies;
PLIST_HEAD(moved_list, struct dummy_node) moved;
};
@@ -68,47 +82,41 @@ dummy_node_constructor(void *ptr, void *arg)
n->value = *test_val;
}
-#define NODE_ZEROED_TYPE 0
-#define NODE_CONSTRUCTED_TYPE 1
-
void
test_alloc_api(PMEMobjpool *pop)
{
- OID_TYPE(struct dummy_node) node_zeroed;
- OID_TYPE(struct dummy_node) node_constructed;
+ TOID(struct dummy_node) node_zeroed;
+ TOID(struct dummy_node_c) node_constructed;
- OID_ASSIGN(node_zeroed,
- pmemobj_zalloc(pop, sizeof (struct dummy_root),
- NODE_ZEROED_TYPE));
+ POBJ_ZNEW(pop, &node_zeroed, struct dummy_node);
int *test_val = MALLOC(sizeof (*test_val));
*test_val = TEST_VALUE;
-
- OID_ASSIGN(node_constructed,
- pmemobj_alloc_construct(pop, sizeof (struct dummy_root),
- NODE_CONSTRUCTED_TYPE, dummy_node_constructor, test_val));
+ POBJ_NEW(pop, &node_constructed, struct dummy_node_c,
+ dummy_node_constructor, test_val);
FREE(test_val);
- OID_TYPE(struct dummy_node) iter;
+ TOID(struct dummy_node) iter;
- POBJ_FOREACH_TYPE(pop, iter, NODE_ZEROED_TYPE) {
+ POBJ_FOREACH_TYPE(pop, iter) {
ASSERTeq(D_RO(iter)->value, 0);
}
- POBJ_FOREACH_TYPE(pop, iter, NODE_CONSTRUCTED_TYPE) {
- ASSERTeq(D_RO(iter)->value, TEST_VALUE);
+ TOID(struct dummy_node_c) iter_c;
+ POBJ_FOREACH_TYPE(pop, iter_c) {
+ ASSERTeq(D_RO(iter_c)->value, TEST_VALUE);
}
PMEMoid oid_iter;
int type_iter;
POBJ_FOREACH(pop, oid_iter, type_iter) {
- ASSERT(type_iter == NODE_ZEROED_TYPE ||
- type_iter == NODE_CONSTRUCTED_TYPE);
+ ASSERT(type_iter == TOID_TYPE_NUM(struct dummy_node) ||
+ type_iter == TOID_TYPE_NUM(struct dummy_node_c));
}
- pmemobj_free(node_zeroed.oid);
- pmemobj_free(node_constructed.oid);
+ POBJ_FREE(&node_zeroed);
+ POBJ_FREE(&node_constructed);
int nodes_count = 0;
POBJ_FOREACH(pop, oid_iter, type_iter) {
@@ -120,11 +128,11 @@ test_alloc_api(PMEMobjpool *pop)
void
test_list_api(PMEMobjpool *pop)
{
- OID_TYPE(struct dummy_root) root;
- OID_ASSIGN(root, pmemobj_root(pop, sizeof (struct dummy_root)));
+ TOID(struct dummy_root) root;
+ root = POBJ_ROOT(pop, struct dummy_root);
int nodes_count = 0;
- OID_TYPE(struct dummy_node) iter;
+ TOID(struct dummy_node) iter;
POBJ_LIST_FOREACH_REVERSE(iter, &D_RO(root)->dummies, plist) {
OUT("dummy_node %d", D_RO(iter)->value);
nodes_count++;
@@ -135,15 +143,17 @@ test_list_api(PMEMobjpool *pop)
int *test_val = MALLOC(sizeof (*test_val));
*test_val = TEST_VALUE;
- POBJ_LIST_INSERT_NEW_HEAD(pop, &D_RW(root)->dummies, 0, plist,
- dummy_node_constructor, test_val);
- POBJ_LIST_INSERT_NEW_TAIL(pop, &D_RW(root)->dummies, 0, plist,
- dummy_node_constructor, test_val);
+ POBJ_LIST_INSERT_NEW_HEAD(pop, &D_RW(root)->dummies, plist,
+ sizeof (struct dummy_node), dummy_node_constructor,
+ test_val);
+ POBJ_LIST_INSERT_NEW_TAIL(pop, &D_RW(root)->dummies, plist,
+ sizeof (struct dummy_node), dummy_node_constructor,
+ test_val);
FREE(test_val);
- OID_TYPE(struct dummy_node) node;
- OID_ASSIGN(node, pmemobj_zalloc(pop, sizeof (struct dummy_root), 0));
+ TOID(struct dummy_node) node;
+ POBJ_ZNEW(pop, &node, struct dummy_node);
POBJ_LIST_INSERT_HEAD(pop, &D_RW(root)->dummies, node, plist);
@@ -179,8 +189,8 @@ test_list_api(PMEMobjpool *pop)
void
test_tx_api(PMEMobjpool *pop)
{
- OID_TYPE(struct dummy_root) root;
- OID_ASSIGN(root, pmemobj_root(pop, sizeof (struct dummy_root)));
+ TOID(struct dummy_root) root;
+ TOID_ASSIGN(root, pmemobj_root(pop, sizeof (struct dummy_root)));
int *vstate = NULL; /* volatile state */
@@ -189,7 +199,7 @@ test_tx_api(PMEMobjpool *pop)
*vstate = TEST_VALUE;
TX_ADD(root);
D_RW(root)->value = *vstate;
- OID_ASSIGN(D_RW(root)->node, TX_ZALLOC(struct dummy_node, 0));
+ D_RW(root)->node = TX_ZNEW(struct dummy_node);
TX_MEMSET(D_RW(root)->node, teststr, 'a', TEST_STR_LEN);
TX_MEMCPY(D_RW(root)->node, teststr, TEST_STR, TEST_STR_LEN);
TX_SET(D_RW(root)->node, value, TEST_VALUE);
@@ -202,9 +212,9 @@ test_tx_api(PMEMobjpool *pop)
ASSERTeq(D_RW(root)->value, TEST_VALUE);
TX_BEGIN_LOCK(pop, TX_LOCK_MUTEX, &D_RW(root)->lock) {
- ASSERT(!OID_IS_NULL(D_RW(root)->node));
+ ASSERT(!TOID_IS_NULL(D_RW(root)->node));
TX_FREE(D_RW(root)->node);
- OID_ASSIGN(D_RW(root)->node, OID_NULL);
+ TOID_ASSIGN(D_RW(root)->node, OID_NULL);
} TX_END
}
@@ -220,8 +230,8 @@ main(int argc, char *argv[])
PMEMobjpool *pop = NULL;
- if ((pop = pmemobj_create(path, LAYOUT_NAME, PMEMOBJ_MIN_POOL,
- S_IRWXU)) == NULL)
+ if ((pop = pmemobj_create(path, POBJ_LAYOUT_NAME(basic),
+ PMEMOBJ_MIN_POOL, S_IRWXU)) == NULL)
FATAL("!pmemobj_create: %s", path);
test_alloc_api(pop);
diff --git a/src/test/obj_debug/obj_debug.c b/src/test/obj_debug/obj_debug.c
index 19d146490e7c2c5b37ea328aa7288c6fac19682d..2b534597240ae6d2ad4f16ca5670dd3c6abbee53 100644
--- a/src/test/obj_debug/obj_debug.c
+++ b/src/test/obj_debug/obj_debug.c
@@ -45,7 +45,10 @@
#include "libpmemobj.h"
#define LAYOUT_NAME "layout_obj_debug"
-#define TYPE 0
+
+TOID_DECLARE_ROOT(struct root);
+TOID_DECLARE(struct tobj, 0);
+TOID_DECLARE(struct int3_s, 1);
struct root {
PLIST_HEAD(listhead, struct tobj) lhead, lhead2;
@@ -67,16 +70,16 @@ test_FOREACH(const char *path)
{
PMEMobjpool *pop = NULL;
PMEMoid varoid, nvaroid;
- OID_TYPE(struct root) root;
- OID_TYPE(struct tobj) var, nvar;
+ TOID(struct root) root;
+ TOID(struct tobj) var, nvar;
int type = 0;
#define COMMANDS_FOREACH()\
do {\
POBJ_FOREACH(pop, varoid, type) {}\
POBJ_FOREACH_SAFE(pop, varoid, nvaroid, type) {}\
- POBJ_FOREACH_TYPE(pop, var, type) {}\
- POBJ_FOREACH_SAFE_TYPE(pop, var, nvar, type) {}\
+ POBJ_FOREACH_TYPE(pop, var) {}\
+ POBJ_FOREACH_SAFE_TYPE(pop, var, nvar) {}\
POBJ_LIST_FOREACH(var, &D_RW(root)->lhead, next) {}\
POBJ_LIST_FOREACH_REVERSE(var, &D_RW(root)->lhead, next) {}\
} while (0)
@@ -86,8 +89,9 @@ test_FOREACH(const char *path)
S_IRWXU)) == NULL)
FATAL("!pmemobj_create: %s", path);
- OID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
- POBJ_LIST_INSERT_NEW_HEAD(pop, &D_RW(root)->lhead, 0, next, NULL, NULL);
+ TOID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
+ POBJ_LIST_INSERT_NEW_HEAD(pop, &D_RW(root)->lhead, next,
+ sizeof (struct tobj), NULL, NULL);
COMMANDS_FOREACH();
TX_BEGIN(pop) {
@@ -104,20 +108,20 @@ void
test_lists(const char *path)
{
PMEMobjpool *pop = NULL;
- OID_TYPE(struct root) root;
- OID_TYPE(struct tobj) elm;
+ TOID(struct root) root;
+ TOID(struct tobj) elm;
#define COMMANDS_LISTS()\
do {\
- POBJ_LIST_INSERT_NEW_HEAD(pop, &D_RW(root)->lhead, TYPE, next,\
- NULL, NULL);\
- OID_ASSIGN(elm, pmemobj_alloc(pop, sizeof (struct tobj), TYPE));\
+ POBJ_LIST_INSERT_NEW_HEAD(pop, &D_RW(root)->lhead, next,\
+ sizeof (struct tobj), NULL, NULL);\
+ POBJ_NEW(pop, &elm, struct tobj, NULL, NULL);\
POBJ_LIST_INSERT_AFTER(pop, &D_RW(root)->lhead,\
POBJ_LIST_FIRST(&D_RW(root)->lhead), elm, next);\
POBJ_LIST_MOVE_ELEMENT_HEAD(pop, &D_RW(root)->lhead,\
&D_RW(root)->lhead2, elm, next, next);\
POBJ_LIST_REMOVE(pop, &D_RW(root)->lhead2, elm, next);\
- pmemobj_free(elm.oid);\
+ POBJ_FREE(&elm);\
} while (0)
if ((pop = pmemobj_create(path, LAYOUT_NAME,
@@ -125,7 +129,7 @@ test_lists(const char *path)
S_IRWXU)) == NULL)
FATAL("!pmemobj_create: %s", path);
- OID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
+ TOID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
COMMANDS_LISTS();
TX_BEGIN(pop) {
@@ -142,8 +146,8 @@ void
test_add_range(const char *path)
{
PMEMobjpool *pop = NULL;
- OID_TYPE(struct root) root;
- OID_TYPE(struct int3_s) obj;
+ TOID(struct root) root;
+ TOID(struct int3_s) obj;
#define ANY_VALUE 0
#define COMMANDS_ADD_RANGE()\
@@ -159,8 +163,8 @@ test_add_range(const char *path)
S_IRWXU)) == NULL)
FATAL("!pmemobj_create: %s", path);
- OID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
- OID_ASSIGN(obj, pmemobj_alloc(pop, sizeof (struct int3_s), TYPE));
+ root = POBJ_ROOT(pop, struct root);
+ POBJ_NEW(pop, &obj, struct int3_s, NULL, NULL);
COMMANDS_ADD_RANGE();
TX_BEGIN(pop) {
diff --git a/src/test/obj_list/obj_list.c b/src/test/obj_list/obj_list.c
index 68891e7586dca389c3a37a6622066a0af68c24fc..78161424a40e9141fec45d8e8cc73c8a4d1a336f 100644
--- a/src/test/obj_list/obj_list.c
+++ b/src/test/obj_list/obj_list.c
@@ -50,6 +50,11 @@
/* pmemobj initial heap offset */
#define HEAP_OFFSET 8192
+TOID_DECLARE(struct item, 0);
+TOID_DECLARE(struct list, 1);
+TOID_DECLARE(struct oob_list, 2);
+TOID_DECLARE(struct oob_item, 3);
+
struct item {
int id;
PLIST_ENTRY(struct item) next;
@@ -82,6 +87,8 @@ enum redo_fail
/* global handle to pmemobj pool */
PMEMobjpool *Pop;
+/* pointer to heap offset */
+uint64_t *Heap_offset;
/* list lane section */
struct lane_section Lane_section;
/* actual item id */
@@ -91,12 +98,14 @@ int *Id;
enum redo_fail Redo_fail = NO_FAIL;
/* global "in band" lists */
-OID_TYPE(struct list) List;
-OID_TYPE(struct list) List_sec;
+TOID(struct list) List;
+TOID(struct list) List_sec;
/* global "out of band" lists */
-OID_TYPE(struct oob_list) List_oob;
-OID_TYPE(struct oob_list) List_oob_sec;
+TOID(struct oob_list) List_oob;
+TOID(struct oob_list) List_oob_sec;
+
+TOID(struct oob_item) *Item;
#define IS_NULL(oid) (oid.off == 0)
@@ -181,8 +190,13 @@ FUNC_MOCK_RUN_DEFAULT {
Pop->drain = pmem_drain_nop;
}
+ Pop->heap_offset = HEAP_OFFSET;
+ Pop->heap_size = Pop->size - Pop->heap_offset;
uint64_t heap_offset = HEAP_OFFSET;
+ Heap_offset = (uint64_t *)((uintptr_t)Pop + heap_offset);
+ heap_offset += sizeof (*Heap_offset);
+
Id = (int *)((uintptr_t)Pop + heap_offset);
heap_offset += sizeof (*Id);
@@ -208,8 +222,18 @@ FUNC_MOCK_RUN_DEFAULT {
List_oob_sec.oid.off = heap_offset;
heap_offset += sizeof (struct oob_list);
- if (Pop->heap_offset == 0)
- Pop->heap_offset = heap_offset;
+ Item = (void *)((uintptr_t)Pop + heap_offset);
+ heap_offset += sizeof (*Item);
+ Item->oid.pool_uuid_lo = Pop->uuid_lo;
+ Item->oid.off = heap_offset;
+ Pop->persist(Item, sizeof (*Item));
+ heap_offset += sizeof (struct oob_item);
+
+ if (*Heap_offset == 0) {
+ *Heap_offset = heap_offset;
+ Pop->persist(Heap_offset, sizeof (*Heap_offset));
+ }
+
Pop->persist(Pop, HEAP_OFFSET);
@@ -270,12 +294,18 @@ FUNC_MOCK_RET_ALWAYS(lane_release, int, 0);
*
* Allocates an object using pmalloc and return PMEMoid.
*/
-FUNC_MOCK(pmemobj_alloc, PMEMoid, PMEMobjpool *pop, size_t size, int type_num)
+FUNC_MOCK(pmemobj_alloc, PMEMoid, PMEMobjpool *pop, PMEMoid *oidp,
+ size_t size, int type_num,
+ void (*constructor)(void *ptr, void *arg), void *arg)
FUNC_MOCK_RUN_DEFAULT {
PMEMoid oid = {0, 0};
oid.pool_uuid_lo = 0;
pmalloc(NULL, &oid.off, size);
oid.off += OOB_OFF;
+ if (oidp) {
+ *oidp = oid;
+ Pop->persist(oidp, sizeof (*oidp));
+ }
return oid; }
FUNC_MOCK_END
@@ -289,11 +319,11 @@ FUNC_MOCK(pmalloc, int, PMEMobjpool *pop, uint64_t *ptr, size_t size)
FUNC_MOCK_RUN_DEFAULT {
size = 2 * (size - OOB_OFF) + OOB_OFF;
uint64_t *alloc_size = (uint64_t *)((uintptr_t)Pop
- + Pop->heap_offset);
+ + *Heap_offset);
*alloc_size = size;
Pop->persist(alloc_size, sizeof (*alloc_size));
- *ptr = Pop->heap_offset + sizeof (uint64_t);
+ *ptr = *Heap_offset + sizeof (uint64_t);
Pop->persist(ptr, sizeof (*ptr));
struct oob_item *item =
@@ -305,8 +335,8 @@ FUNC_MOCK(pmalloc, int, PMEMobjpool *pop, uint64_t *ptr, size_t size)
(*Id)++;
Pop->persist(Id, sizeof (*Id));
- Pop->heap_offset = Pop->heap_offset + sizeof (uint64_t) + size;
- Pop->persist(&Pop->heap_offset, sizeof (Pop->heap_offset));
+ *Heap_offset = *Heap_offset + sizeof (uint64_t) + size;
+ Pop->persist(Heap_offset, sizeof (*Heap_offset));
OUT("pmalloc(id = %d)", item->item.id);
return 0;
@@ -342,15 +372,15 @@ FUNC_MOCK(pmalloc_construct, int, PMEMobjpool *pop, uint64_t *off,
FUNC_MOCK_RUN_DEFAULT {
size = 2 * (size - OOB_OFF) + OOB_OFF;
uint64_t *alloc_size = (uint64_t *)((uintptr_t)Pop +
- Pop->heap_offset);
+ *Heap_offset);
*alloc_size = size;
Pop->persist(alloc_size, sizeof (*alloc_size));
- *off = Pop->heap_offset + sizeof (uint64_t);
+ *off = *Heap_offset + sizeof (uint64_t);
Pop->persist(off, sizeof (*off));
- Pop->heap_offset = Pop->heap_offset + sizeof (uint64_t) + size;
- Pop->persist(&Pop->heap_offset, sizeof (Pop->heap_offset));
+ *Heap_offset = *Heap_offset + sizeof (uint64_t) + size;
+ Pop->persist(Heap_offset, sizeof (*Heap_offset));
void *ptr = (void *)((uintptr_t)Pop + *off + data_off);
constructor(ptr, arg);
@@ -546,11 +576,11 @@ oob_get_next(PMEMoid oid)
* for each element on list in normal order
*/
#define LIST_FOREACH(item, list, head, field)\
-for (OID_ASSIGN_TYPED((item),\
- D_RW((list))->head.pe_first);\
- !OID_IS_NULL((item));\
- OID_ASSIGN((item),\
- OID_EQUALS((item),\
+for ((item) = \
+ D_RW((list))->head.pe_first;\
+ !TOID_IS_NULL((item));\
+ TOID_ASSIGN((item),\
+ TOID_EQUALS((item),\
D_RW(D_RW((list))->head.pe_first)->field.pe_prev) ?\
OID_NULL : \
D_RW(item)->field.pe_next.oid))
@@ -559,11 +589,11 @@ for (OID_ASSIGN_TYPED((item),\
* for each element on list in reverse order
*/
#define LIST_FOREACH_REVERSE(item, list, head, field)\
-for (OID_ASSIGN_TYPED((item),\
- D_RW(D_RW((list))->head.pe_first)->field.pe_prev);\
- !OID_IS_NULL((item));\
- OID_ASSIGN((item),\
- OID_EQUALS((item),\
+for ((item) = \
+ D_RW(D_RW((list))->head.pe_first)->field.pe_prev;\
+ !TOID_IS_NULL((item));\
+ TOID_ASSIGN((item),\
+ TOID_EQUALS((item),\
D_RW((list))->head.pe_first) ?\
OID_NULL :\
D_RW(item)->field.pe_prev.oid))
@@ -572,9 +602,9 @@ for (OID_ASSIGN_TYPED((item),\
* for each element on oob list in normal order
*/
#define LIST_FOREACH_OOB(item, list, head)\
-for (OID_ASSIGN((item), oob_get_first((list).oid));\
- !OID_IS_NULL((item));\
- OID_ASSIGN((item),\
+for (TOID_ASSIGN((item), oob_get_first((list).oid));\
+ !TOID_IS_NULL((item));\
+ TOID_ASSIGN((item),\
((item).oid.off ==\
oob_get_prev(oob_get_first((list).oid)).off)\
? OID_NULL :\
@@ -584,12 +614,12 @@ for (OID_ASSIGN((item), oob_get_first((list).oid));\
* for each element on oob list in reverse order
*/
#define LIST_FOREACH_REVERSE_OOB(item, list, head)\
-for (OID_ASSIGN((item),\
+for (TOID_ASSIGN((item),\
(oob_get_first((list).oid).off ?\
oob_get_prev(oob_get_first((list).oid)):\
OID_NULL));\
- !OID_IS_NULL((item));\
- OID_ASSIGN((item),\
+ !TOID_IS_NULL((item));\
+ TOID_ASSIGN((item),\
((item).oid.off ==\
oob_get_first((list).oid).off) ? OID_NULL :\
oob_get_prev((item).oid)))
@@ -600,9 +630,9 @@ for (OID_ASSIGN((item),\
static PMEMoid
get_item_list(PMEMoid head, int n)
{
- OID_TYPE(struct list) list;
- OID_ASSIGN(list, head);
- OID_TYPE(struct item) item;
+ TOID(struct list) list;
+ TOID_ASSIGN(list, head);
+ TOID(struct item) item;
if (n >= 0) {
LIST_FOREACH(item, list, head, next) {
if (n == 0)
@@ -625,9 +655,9 @@ get_item_list(PMEMoid head, int n)
static PMEMoid
get_item_oob_list(PMEMoid head, int n)
{
- OID_TYPE(struct oob_list) list;
- OID_ASSIGN(list, head);
- OID_TYPE(struct oob_item) item;
+ TOID(struct oob_list) list;
+ TOID_ASSIGN(list, head);
+ TOID(struct oob_item) item;
if (n >= 0) {
LIST_FOREACH_OOB(item, list, head) {
if (n == 0) {
@@ -660,25 +690,25 @@ do_print(PMEMobjpool *pop, const char *arg)
FATAL_USAGE_PRINT();
if (L == 1) {
- OID_TYPE(struct oob_item) oob_item;
+ TOID(struct oob_item) oob_item;
OUT("oob list:");
LIST_FOREACH_OOB(oob_item, List_oob, head) {
OUT("id = %d", D_RO(oob_item)->item.id);
}
} else if (L == 2) {
- OID_TYPE(struct item) item;
+ TOID(struct item) item;
OUT("list:");
LIST_FOREACH(item, List, head, next) {
OUT("id = %d", D_RO(item)->id);
}
} else if (L == 3) {
- OID_TYPE(struct oob_item) oob_item;
+ TOID(struct oob_item) oob_item;
OUT("oob list sec:");
LIST_FOREACH_OOB(oob_item, List_oob_sec, head) {
OUT("id = %d", D_RO(oob_item)->item.id);
}
} else if (L == 4) {
- OID_TYPE(struct item) item;
+ TOID(struct item) item;
OUT("list sec:");
LIST_FOREACH(item, List_sec, head, next) {
OUT("id = %d", D_RO(item)->id);
@@ -698,27 +728,27 @@ do_print_reverse(PMEMobjpool *pop, const char *arg)
if (sscanf(arg, "R:%d", &L) != 1)
FATAL_USAGE_PRINT_REVERSE();
if (L == 1) {
- OID_TYPE(struct oob_item) oob_item;
+ TOID(struct oob_item) oob_item;
OUT("oob list reverse:");
LIST_FOREACH_REVERSE_OOB(oob_item,
List_oob, head) {
OUT("id = %d", D_RO(oob_item)->item.id);
}
} else if (L == 2) {
- OID_TYPE(struct item) item;
+ TOID(struct item) item;
OUT("list reverse:");
LIST_FOREACH_REVERSE(item, List, head, next) {
OUT("id = %d", D_RO(item)->id);
}
} else if (L == 3) {
- OID_TYPE(struct oob_item) oob_item;
+ TOID(struct oob_item) oob_item;
OUT("oob list sec reverse:");
LIST_FOREACH_REVERSE_OOB(oob_item,
List_oob_sec, head) {
OUT("id = %d", D_RO(oob_item)->item.id);
}
} else if (L == 4) {
- OID_TYPE(struct item) item;
+ TOID(struct item) item;
OUT("list sec reverse:");
LIST_FOREACH_REVERSE(item, List_sec, head, next) {
OUT("id = %d", D_RO(item)->id);
@@ -765,7 +795,7 @@ do_insert_new(PMEMobjpool *pop, const char *arg)
int id;
int ret = sscanf(arg, "n:%d:%d:%d", &before, &n, &id);
if (ret == 3) {
- PMEMoid retoid = list_insert_new(pop,
+ ret = list_insert_new(pop,
(struct list_head *)&D_RW(List_oob)->head,
offsetof(struct item, next),
(struct list_head *)&D_RW(List)->head,
@@ -773,30 +803,30 @@ do_insert_new(PMEMobjpool *pop, const char *arg)
before,
sizeof (struct item),
item_constructor,
- &id);
+ &id, (PMEMoid *)Item);
- if (IS_NULL(retoid))
+ if (ret)
FATAL("list_insert_new(List, List_oob) failed");
} else if (ret == 2) {
- PMEMoid retoid = list_insert_new(pop,
+ ret = list_insert_new(pop,
(struct list_head *)&D_RW(List_oob)->head,
offsetof(struct item, next),
(struct list_head *)&D_RW(List)->head,
get_item_list(List.oid, n),
before,
sizeof (struct item),
- NULL, NULL);
+ NULL, NULL, (PMEMoid *)Item);
- if (IS_NULL(retoid))
+ if (ret)
FATAL("list_insert_new(List, List_oob) failed");
} else {
- PMEMoid retoid = list_insert_new(pop,
+ ret = list_insert_new(pop,
(struct list_head *)&D_RW(List_oob)->head,
0, NULL, OID_NULL, 0,
sizeof (struct item),
- NULL, NULL);
+ NULL, NULL, (PMEMoid *)Item);
- if (IS_NULL(retoid))
+ if (ret)
FATAL("list_insert_new(List_oob) failed");
}
}
@@ -814,14 +844,15 @@ do_insert(PMEMobjpool *pop, const char *arg)
&before, &n) != 2)
FATAL_USAGE_INSERT();
- PMEMoid item = pmemobj_alloc(pop, sizeof (struct oob_item), 0);
+ pmemobj_alloc(pop, (PMEMoid *)Item,
+ sizeof (struct oob_item), 0, NULL, NULL);
if (list_insert(pop,
offsetof(struct item, next),
(struct list_head *)&D_RW(List)->head,
get_item_list(List.oid, n),
before,
- item)) {
+ Item->oid)) {
FATAL("list_insert(List) failed");
}
}
@@ -852,7 +883,7 @@ do_remove_free(PMEMobjpool *pop, const char *arg)
(struct list_head *)&D_RW(List_oob)->head,
0,
NULL,
- oid)) {
+ &oid)) {
FATAL("list_remove_free(List_oob) failed");
}
} else if (N == 2) {
@@ -860,7 +891,7 @@ do_remove_free(PMEMobjpool *pop, const char *arg)
(struct list_head *)&D_RW(List_oob)->head,
offsetof(struct item, next),
(struct list_head *)&D_RW(List)->head,
- oid)) {
+ &oid)) {
FATAL("list_remove_free(List_oob, List) failed");
}
} else {
@@ -981,8 +1012,8 @@ do_realloc(PMEMobjpool *pop, const char *arg)
} else {
FATAL_USAGE_REALLOC();
}
- OID_TYPE(struct item) item;
- OID_ASSIGN(item, oid);
+ TOID(struct item) item;
+ TOID_ASSIGN(item, oid);
OUT("realloc(id = %d)", D_RO(item)->id);
}
@@ -1020,8 +1051,8 @@ do_realloc_move(PMEMobjpool *pop, const char *arg)
&oid)) {
FATAL("list_realloc_move(List_oob, List_oob_sec) failed");
}
- OID_TYPE(struct item) item;
- OID_ASSIGN(item, oid);
+ TOID(struct item) item;
+ TOID_ASSIGN(item, oid);
OUT("realloc_move(id = %d)", D_RO(item)->id);
}
@@ -1055,8 +1086,8 @@ main(int argc, char *argv[])
PMEMobjpool *pop = pmemobj_open(path, NULL);
ASSERTne(pop, NULL);
- ASSERT(!OID_IS_NULL(List));
- ASSERT(!OID_IS_NULL(List_oob));
+ ASSERT(!TOID_IS_NULL(List));
+ ASSERT(!TOID_IS_NULL(List_oob));
int i;
for (i = 2; i < argc; i++) {
diff --git a/src/test/obj_store/obj_store.c b/src/test/obj_store/obj_store.c
index e6f08a3cdc2df2b272c9aa71eb5a3dee0bd24f02..6007b53d3235d97fa6c717587c493836f92a5207 100644
--- a/src/test/obj_store/obj_store.c
+++ b/src/test/obj_store/obj_store.c
@@ -53,6 +53,10 @@
#define ROOT_NAME "root object name"
#define ROOT_VALUE 77
+TOID_DECLARE_ROOT(struct root);
+TOID_DECLARE(struct tobject, 0);
+TOID_DECLARE(struct root_grown, 1);
+
PLIST_HEAD(listhead, struct tobject);
struct root {
@@ -68,6 +72,7 @@ struct root_grown {
char name2[MAX_ROOT_NAME];
};
+
struct tobject {
uint8_t value;
PLIST_ENTRY(struct tobject) next;
@@ -87,8 +92,8 @@ void
test_root_object(const char *path)
{
PMEMobjpool *pop = NULL;
- OID_TYPE(struct root) root;
- OID_TYPE(struct root_grown) rootg;
+ TOID(struct root) root;
+ TOID(struct root_grown) rootg;
/* create a pool */
if ((pop = pmemobj_create(path, LAYOUT_NAME,
@@ -100,8 +105,8 @@ test_root_object(const char *path)
ASSERTeq(pmemobj_root_size(pop), 0);
/* create root object */
- OID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
- ASSERT(OID_IS_NULL(root) == 0);
+ TOID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
+ ASSERT(TOID_IS_NULL(root) == 0);
ASSERTeq(pmemobj_root_size(pop), sizeof (struct root));
/* fill in root object */
@@ -116,8 +121,8 @@ test_root_object(const char *path)
/* check size and offset of root object */
ASSERTeq(pmemobj_root_size(pop), sizeof (struct root));
- OID_ASSIGN(root, pmemobj_root(pop, 0));
- ASSERT(OID_IS_NULL(root) == 0);
+ TOID_ASSIGN(root, pmemobj_root(pop, 0));
+ ASSERT(TOID_IS_NULL(root) == 0);
ASSERTeq(pmemobj_root_size(pop), sizeof (struct root));
/* verify content of root object */
@@ -125,10 +130,10 @@ test_root_object(const char *path)
ASSERTeq(D_RO(root)->value, ROOT_VALUE);
/* resize root object */
- OID_ASSIGN(rootg, pmemobj_root(pop, sizeof (struct root_grown)));
+ TOID_ASSIGN(rootg, pmemobj_root(pop, sizeof (struct root_grown)));
/* check offset and size of resized root object */
- ASSERT(OID_IS_NULL(rootg) == 0);
+ ASSERT(TOID_IS_NULL(rootg) == 0);
ASSERTeq(pmemobj_root_size(pop), sizeof (struct root_grown));
/* verify old content of resized root object */
@@ -145,8 +150,8 @@ test_root_object(const char *path)
FATAL("!pmemobj_open: %s", path);
/* check size and offset of resized root object */
- OID_ASSIGN(rootg, pmemobj_root(pop, 0));
- ASSERT(OID_IS_NULL(rootg) == 0);
+ TOID_ASSIGN(rootg, pmemobj_root(pop, 0));
+ ASSERT(TOID_IS_NULL(rootg) == 0);
ASSERTeq(pmemobj_root_size(pop), sizeof (struct root_grown));
/* verify content of resized root object */
@@ -163,7 +168,7 @@ test_alloc_free(const char *path)
#define _N_TEST_TYPES 3 /* number of types to test */
PMEMobjpool *pop = NULL;
- OID_TYPE(struct tobject) tobj;
+ TOID(struct tobject) tobj;
uint64_t offsets[_N_TEST_TYPES];
PMEMoid poid;
int type_num;
@@ -182,9 +187,10 @@ test_alloc_free(const char *path)
/* write to object store */
for (type_num = 0; type_num < _N_TEST_TYPES; type_num++) {
- OID_ASSIGN(tobj, pmemobj_alloc(pop,
- sizeof (struct tobject), type_num));
- ASSERT(OID_IS_NULL(tobj) == 0);
+ pmemobj_alloc(pop, &tobj.oid,
+ sizeof (struct tobject),
+ type_num, NULL, NULL);
+ ASSERT(TOID_IS_NULL(tobj) == 0);
/* save offset to check it later */
offsets[type_num] = tobj.oid.off;
@@ -200,7 +206,7 @@ test_alloc_free(const char *path)
/* verify object store */
for (type_num = 0; type_num < _N_TEST_TYPES; type_num++) {
- OID_ASSIGN(tobj, pmemobj_first(pop, type_num));
+ TOID_ASSIGN(tobj, pmemobj_first(pop, type_num));
ASSERTeq(tobj.oid.off, offsets[type_num]);
ASSERTeq(D_RO(tobj)->value, type_num);
@@ -212,7 +218,7 @@ test_alloc_free(const char *path)
for (type_num = 0; type_num < _N_TEST_TYPES; type_num++) {
poid = pmemobj_first(pop, type_num);
ASSERTne(poid.off, 0);
- pmemobj_free(poid);
+ pmemobj_free(&poid);
}
/* re-open the pool */
@@ -239,7 +245,7 @@ test_FOREACH(const char *path)
char bitmap[32]; /* bitmap of values of type uint8_t (32 = 256/8) */
PMEMobjpool *pop = NULL;
- OID_TYPE(struct tobject) tobj;
+ TOID(struct tobject) tobj;
uint8_t value;
int i, type;
@@ -254,9 +260,10 @@ test_FOREACH(const char *path)
/* write to object store */
for (type = 0; type < _MAX_TYPES; type++)
for (i = 0; i < _MAX_ELEMENTS; i++) {
- OID_ASSIGN(tobj, pmemobj_alloc(pop,
- sizeof (struct tobject), type));
- ASSERT(OID_IS_NULL(tobj) == 0);
+ pmemobj_alloc(pop, &tobj.oid,
+ sizeof (struct tobject), type, NULL,
+ NULL);
+ ASSERT(TOID_IS_NULL(tobj) == 0);
value = _MAX_ELEMENTS * type + i;
ASSERT(isclr(bitmap, value));
setbit(bitmap, value);
@@ -274,8 +281,8 @@ test_FOREACH(const char *path)
PMEMoid varoid;
POBJ_FOREACH(pop, varoid, type) {
ASSERT(i < _MAX_TYPES * _MAX_ELEMENTS);
- OID_ASSIGN(tobj, varoid);
- ASSERT(OID_IS_NULL(tobj) == 0);
+ TOID_ASSIGN(tobj, varoid);
+ ASSERT(TOID_IS_NULL(tobj) == 0);
ASSERT(isset(bitmap, D_RO(tobj)->value));
i++;
}
@@ -284,9 +291,9 @@ test_FOREACH(const char *path)
/* test POBJ_FOREACH_TYPE */
i = 0;
for (type = 0; type < _MAX_TYPES; type++) {
- POBJ_FOREACH_TYPE(pop, tobj, type) {
+ POBJ_FOREACH_TYPE(pop, tobj) {
ASSERT(i < (type + 1) * _MAX_ELEMENTS);
- ASSERT(OID_IS_NULL(tobj) == 0);
+ ASSERT(TOID_IS_NULL(tobj) == 0);
ASSERT(isset(bitmap, D_RO(tobj)->value));
i++;
}
@@ -299,7 +306,7 @@ test_FOREACH(const char *path)
i = 0;
POBJ_FOREACH_SAFE(pop, varoid, nvaroid, type) {
ASSERTne(varoid.off, 0);
- pmemobj_free(varoid);
+ pmemobj_free(&varoid);
i++;
}
ASSERTeq(i, _MAX_TYPES * _MAX_ELEMENTS);
@@ -313,13 +320,12 @@ test_FOREACH(const char *path)
void
test_user_lists(const char *path)
{
-#define _USER_TYPE 7
#define _N_OBJECTS 5
char bitmap[32]; /* bitmap of values of type uint8_t (32 = 256/8) */
PMEMobjpool *pop = NULL;
- OID_TYPE(struct root) root;
- OID_TYPE(struct tobject) tobj;
+ TOID(struct root) root;
+ TOID(struct tobject) tobj;
uint8_t value;
int i;
@@ -332,8 +338,8 @@ test_user_lists(const char *path)
FATAL("!pmemobj_create: %s", path);
/* create root object */
- OID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
- ASSERT(OID_IS_NULL(root) == 0);
+ TOID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
+ ASSERT(TOID_IS_NULL(root) == 0);
ASSERTeq(pmemobj_root_size(pop), sizeof (struct root));
/* fill in root object */
@@ -346,10 +352,11 @@ test_user_lists(const char *path)
value = i + 1;
ASSERT(isclr(bitmap, value));
setbit(bitmap, value);
- OID_ASSIGN(tobj, POBJ_LIST_INSERT_NEW_HEAD(pop,
- &D_RW(root)->lhead, _USER_TYPE, next,
+ TOID_ASSIGN(tobj, POBJ_LIST_INSERT_NEW_HEAD(pop,
+ &D_RW(root)->lhead, next,
+ sizeof (struct tobject),
tobject_construct, &value));
- ASSERT(OID_IS_NULL(tobj) == 0);
+ ASSERT(TOID_IS_NULL(tobj) == 0);
}
/* re-open the pool */
@@ -359,24 +366,24 @@ test_user_lists(const char *path)
/* test POBJ_FOREACH_TYPE */
i = 0;
- POBJ_FOREACH_TYPE(pop, tobj, _USER_TYPE) {
+ POBJ_FOREACH_TYPE(pop, tobj) {
ASSERT(i <= _N_OBJECTS);
- ASSERT(OID_IS_NULL(tobj) == 0);
+ ASSERT(TOID_IS_NULL(tobj) == 0);
ASSERT(isset(bitmap, D_RO(tobj)->value));
i++;
}
ASSERTeq(i, _N_OBJECTS);
/* get root object */
- OID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
- ASSERT(OID_IS_NULL(root) == 0);
+ TOID_ASSIGN(root, pmemobj_root(pop, sizeof (struct root)));
+ ASSERT(TOID_IS_NULL(root) == 0);
ASSERTeq(pmemobj_root_size(pop), sizeof (struct root));
/* test POBJ_LIST_FOREACH_REVERSE */
i = 0;
POBJ_LIST_FOREACH_REVERSE(tobj, &D_RW(root)->lhead, next) {
ASSERT(i <= _N_OBJECTS);
- ASSERT(OID_IS_NULL(tobj) == 0);
+ ASSERT(TOID_IS_NULL(tobj) == 0);
ASSERT(isset(bitmap, D_RO(tobj)->value));
i++;
}
@@ -386,7 +393,7 @@ test_user_lists(const char *path)
i = _N_OBJECTS - 1;
POBJ_LIST_FOREACH(tobj, &D_RW(root)->lhead, next) {
ASSERT(i <= _N_OBJECTS);
- ASSERT(OID_IS_NULL(tobj) == 0);
+ ASSERT(TOID_IS_NULL(tobj) == 0);
ASSERT(isset(bitmap, D_RO(tobj)->value));
i--;
}
@@ -398,7 +405,8 @@ test_user_lists(const char *path)
void
test_null_oids(void)
{
- pmemobj_free(OID_NULL);
+ PMEMoid nulloid = OID_NULL;
+ pmemobj_free(&nulloid);
ASSERTeq(pmemobj_alloc_usable_size(OID_NULL), 0);
@@ -414,7 +422,7 @@ test_strdup(const char *path)
#define TEST_STRING(str)\
do {\
- stroid = pmemobj_strdup(pop, str, 0);\
+ pmemobj_strdup(pop, &stroid, str, 0);\
ASSERTne(stroid.off, 0);\
ASSERTeq(memcmp(pmemobj_direct(stroid), str, strlen(str) + 1), 0);\
} while (0)
@@ -425,8 +433,8 @@ test_strdup(const char *path)
FATAL("!pmemobj_create: %s", path);
/* test NULL argument */
- stroid = pmemobj_strdup(pop, NULL, 0);
- ASSERTeq(stroid.off, 0);
+ int ret = pmemobj_strdup(pop, &stroid, NULL, 0);
+ ASSERTne(ret, 0);
TEST_STRING("");
TEST_STRING("Test non-empty string");
diff --git a/src/test/obj_tx_add_range/obj_tx_add_range.c b/src/test/obj_tx_add_range/obj_tx_add_range.c
index 28f4c3a08eeb9ba9483981a74e2b33ac74d44bf0..d595fed3f6fbdfb208e4957b937fc117b3389b19 100644
--- a/src/test/obj_tx_add_range/obj_tx_add_range.c
+++ b/src/test/obj_tx_add_range/obj_tx_add_range.c
@@ -50,6 +50,8 @@ enum type_number {
TYPE_OBJ_ABORT,
};
+TOID_DECLARE(struct object, 0);
+
struct object {
size_t value;
char data[OBJ_SIZE - sizeof (size_t)];
@@ -85,10 +87,10 @@ static void
do_tx_add_range_alloc_commit(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ ASSERT(!TOID_IS_NULL(obj));
ret = pmemobj_tx_add_range(obj.oid, VALUE_OFF, VALUE_SIZE);
ASSERTeq(ret, 0);
@@ -119,10 +121,10 @@ static void
do_tx_add_range_alloc_abort(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ_ABORT));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ_ABORT));
+ ASSERT(!TOID_IS_NULL(obj));
ret = pmemobj_tx_add_range(obj.oid, VALUE_OFF, VALUE_SIZE);
ASSERTeq(ret, 0);
@@ -140,8 +142,8 @@ do_tx_add_range_alloc_abort(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_OBJ_ABORT));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_OBJ_ABORT));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -152,10 +154,10 @@ static void
do_tx_add_range_twice_commit(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ ASSERT(!TOID_IS_NULL(obj));
TX_BEGIN(pop) {
ret = pmemobj_tx_add_range(obj.oid, VALUE_OFF, VALUE_SIZE);
@@ -182,10 +184,10 @@ static void
do_tx_add_range_twice_abort(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ ASSERT(!TOID_IS_NULL(obj));
TX_BEGIN(pop) {
ret = pmemobj_tx_add_range(obj.oid, VALUE_OFF, VALUE_SIZE);
@@ -214,10 +216,10 @@ static void
do_tx_add_range_abort_after_nested(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj1;
- OID_TYPE(struct object) obj2;
- OID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
- OID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj1;
+ TOID(struct object) obj2;
+ TOID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
TX_BEGIN(pop) {
ret = pmemobj_tx_add_range(obj1.oid, VALUE_OFF, VALUE_SIZE);
@@ -256,10 +258,10 @@ static void
do_tx_add_range_abort_nested(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj1;
- OID_TYPE(struct object) obj2;
- OID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
- OID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj1;
+ TOID(struct object) obj2;
+ TOID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
TX_BEGIN(pop) {
ret = pmemobj_tx_add_range(obj1.oid, VALUE_OFF, VALUE_SIZE);
@@ -297,10 +299,10 @@ static void
do_tx_add_range_commit_nested(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj1;
- OID_TYPE(struct object) obj2;
- OID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
- OID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj1;
+ TOID(struct object) obj2;
+ TOID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
TX_BEGIN(pop) {
ret = pmemobj_tx_add_range(obj1.oid, VALUE_OFF, VALUE_SIZE);
@@ -336,8 +338,8 @@ static void
do_tx_add_range_abort(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
TX_BEGIN(pop) {
ret = pmemobj_tx_add_range(obj.oid, VALUE_OFF, VALUE_SIZE);
@@ -360,8 +362,8 @@ static void
do_tx_add_range_commit(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
TX_BEGIN(pop) {
ret = pmemobj_tx_add_range(obj.oid, VALUE_OFF, VALUE_SIZE);
@@ -382,8 +384,8 @@ static void
do_tx_add_range_no_tx(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
ret = pmemobj_tx_add_range(obj.oid, VALUE_OFF, VALUE_SIZE);
ASSERTne(ret, 0);
diff --git a/src/test/obj_tx_add_range_direct/obj_tx_add_range_direct.c b/src/test/obj_tx_add_range_direct/obj_tx_add_range_direct.c
index 2709c4efc9fc2a936beb024a7b85bd6726885265..e2134ba3b1dce501ce9ccb14ac68b9e24a9b4655 100644
--- a/src/test/obj_tx_add_range_direct/obj_tx_add_range_direct.c
+++ b/src/test/obj_tx_add_range_direct/obj_tx_add_range_direct.c
@@ -50,6 +50,8 @@ enum type_number {
TYPE_OBJ_ABORT,
};
+TOID_DECLARE(struct object, 0);
+
struct object {
size_t value;
char data[OBJ_SIZE - sizeof (size_t)];
@@ -85,10 +87,10 @@ static void
do_tx_add_range_alloc_commit(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ ASSERT(!TOID_IS_NULL(obj));
void *ptr = pmemobj_direct(obj.oid);
ret = pmemobj_tx_add_range_direct(ptr + VALUE_OFF,
@@ -122,10 +124,10 @@ static void
do_tx_add_range_alloc_abort(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ_ABORT));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ_ABORT));
+ ASSERT(!TOID_IS_NULL(obj));
void *ptr = pmemobj_direct(obj.oid);
ret = pmemobj_tx_add_range_direct(ptr + VALUE_OFF,
@@ -146,8 +148,8 @@ do_tx_add_range_alloc_abort(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_OBJ_ABORT));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_OBJ_ABORT));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -158,10 +160,10 @@ static void
do_tx_add_range_twice_commit(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ ASSERT(!TOID_IS_NULL(obj));
TX_BEGIN(pop) {
void *ptr = pmemobj_direct(obj.oid);
@@ -191,10 +193,10 @@ static void
do_tx_add_range_twice_abort(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ ASSERT(!TOID_IS_NULL(obj));
TX_BEGIN(pop) {
void *ptr = pmemobj_direct(obj.oid);
@@ -226,10 +228,10 @@ static void
do_tx_add_range_abort_after_nested(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj1;
- OID_TYPE(struct object) obj2;
- OID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
- OID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj1;
+ TOID(struct object) obj2;
+ TOID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
TX_BEGIN(pop) {
void *ptr1 = pmemobj_direct(obj1.oid);
@@ -271,10 +273,10 @@ static void
do_tx_add_range_abort_nested(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj1;
- OID_TYPE(struct object) obj2;
- OID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
- OID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj1;
+ TOID(struct object) obj2;
+ TOID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
TX_BEGIN(pop) {
void *ptr1 = pmemobj_direct(obj1.oid);
@@ -315,10 +317,10 @@ static void
do_tx_add_range_commit_nested(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj1;
- OID_TYPE(struct object) obj2;
- OID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
- OID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj1;
+ TOID(struct object) obj2;
+ TOID_ASSIGN(obj1, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID_ASSIGN(obj2, do_tx_zalloc(pop, TYPE_OBJ));
TX_BEGIN(pop) {
void *ptr1 = pmemobj_direct(obj1.oid);
@@ -357,8 +359,8 @@ static void
do_tx_add_range_abort(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
TX_BEGIN(pop) {
void *ptr = pmemobj_direct(obj.oid);
@@ -383,8 +385,8 @@ static void
do_tx_add_range_commit(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
TX_BEGIN(pop) {
void *ptr = pmemobj_direct(obj.oid);
@@ -407,8 +409,8 @@ static void
do_tx_add_range_no_tx(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_zalloc(pop, TYPE_OBJ));
void *ptr = pmemobj_direct(obj.oid);
ret = pmemobj_tx_add_range_direct(ptr + VALUE_OFF, VALUE_SIZE);
diff --git a/src/test/obj_tx_alloc/obj_tx_alloc.c b/src/test/obj_tx_alloc/obj_tx_alloc.c
index 579f3938cccfeab010adf24619257d841a6bc9c5..33d7f7d378803a732af177e48e42e89b3d29655b 100644
--- a/src/test/obj_tx_alloc/obj_tx_alloc.c
+++ b/src/test/obj_tx_alloc/obj_tx_alloc.c
@@ -61,6 +61,8 @@ enum type_number {
TYPE_OOM,
};
+TOID_DECLARE(struct object, TYPE_OOM);
+
struct object {
size_t value;
char data[OBJ_SIZE - sizeof (size_t)];
@@ -76,10 +78,8 @@ do_tx_alloc_oom(PMEMobjpool *pop)
size_t alloc_cnt = 0;
do {
TX_BEGIN(pop) {
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, pmemobj_tx_alloc(sizeof (struct object),
- TYPE_OOM));
- if (OID_IS_NULL(obj)) {
+ TOID(struct object) obj = TX_NEW(struct object);
+ if (TOID_IS_NULL(obj)) {
pmemobj_tx_abort(-ENOMEM);
} else {
D_RW(obj)->value = alloc_cnt;
@@ -96,8 +96,8 @@ do_tx_alloc_oom(PMEMobjpool *pop)
pmemobj_memset_persist(pop, bitmap, 0, bitmap_size);
size_t obj_cnt = 0;
- OID_TYPE(struct object) i;
- POBJ_FOREACH_TYPE(pop, i, TYPE_OOM) {
+ TOID(struct object) i;
+ POBJ_FOREACH_TYPE(pop, i) {
ASSERT(D_RO(i)->value < alloc_cnt);
ASSERT(!isset(bitmap, D_RO(i)->value));
setbit(bitmap, D_RO(i)->value);
@@ -116,21 +116,21 @@ do_tx_alloc_oom(PMEMobjpool *pop)
static void
do_tx_alloc_abort_after_nested(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj1;
- OID_TYPE(struct object) obj2;
+ TOID(struct object) obj1;
+ TOID(struct object) obj2;
TX_BEGIN(pop) {
- OID_ASSIGN(obj1, pmemobj_tx_alloc(sizeof (struct object),
+ TOID_ASSIGN(obj1, pmemobj_tx_alloc(sizeof (struct object),
TYPE_ABORT_AFTER_NESTED1));
- ASSERT(!OID_IS_NULL(obj1));
+ ASSERT(!TOID_IS_NULL(obj1));
D_RW(obj1)->value = TEST_VALUE_1;
TX_BEGIN(pop) {
- OID_ASSIGN(obj2, pmemobj_tx_zalloc(
+ TOID_ASSIGN(obj2, pmemobj_tx_zalloc(
sizeof (struct object),
TYPE_ABORT_AFTER_NESTED2));
- ASSERT(!OID_IS_NULL(obj2));
+ ASSERT(!TOID_IS_NULL(obj2));
ASSERT(util_is_zeroed(D_RO(obj2),
sizeof (struct object)));
@@ -147,23 +147,23 @@ do_tx_alloc_abort_after_nested(PMEMobjpool *pop)
} TX_ONCOMMIT {
ASSERT(0);
} TX_ONABORT {
- OID_ASSIGN(obj1, OID_NULL);
- OID_ASSIGN(obj2, OID_NULL);
+ TOID_ASSIGN(obj1, OID_NULL);
+ TOID_ASSIGN(obj2, OID_NULL);
} TX_END
- OID_TYPE(struct object) first;
+ TOID(struct object) first;
/* check the obj1 object */
- ASSERT(OID_IS_NULL(obj1));
+ ASSERT(TOID_IS_NULL(obj1));
first.oid = pmemobj_first(pop, TYPE_ABORT_AFTER_NESTED1);
- ASSERT(OID_IS_NULL(first));
+ ASSERT(TOID_IS_NULL(first));
/* check the obj2 object */
- ASSERT(OID_IS_NULL(obj2));
+ ASSERT(TOID_IS_NULL(obj2));
first.oid = pmemobj_first(pop, TYPE_ABORT_AFTER_NESTED2);
- ASSERT(OID_IS_NULL(first));
+ ASSERT(TOID_IS_NULL(first));
}
/*
@@ -172,21 +172,21 @@ do_tx_alloc_abort_after_nested(PMEMobjpool *pop)
static void
do_tx_alloc_abort_nested(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj1;
- OID_TYPE(struct object) obj2;
+ TOID(struct object) obj1;
+ TOID(struct object) obj2;
TX_BEGIN(pop) {
- OID_ASSIGN(obj1, pmemobj_tx_alloc(sizeof (struct object),
+ TOID_ASSIGN(obj1, pmemobj_tx_alloc(sizeof (struct object),
TYPE_ABORT_NESTED1));
- ASSERT(!OID_IS_NULL(obj1));
+ ASSERT(!TOID_IS_NULL(obj1));
D_RW(obj1)->value = TEST_VALUE_1;
TX_BEGIN(pop) {
- OID_ASSIGN(obj2, pmemobj_tx_zalloc(
+ TOID_ASSIGN(obj2, pmemobj_tx_zalloc(
sizeof (struct object),
TYPE_ABORT_NESTED2));
- ASSERT(!OID_IS_NULL(obj2));
+ ASSERT(!TOID_IS_NULL(obj2));
ASSERT(util_is_zeroed(D_RO(obj2),
sizeof (struct object)));
@@ -196,28 +196,28 @@ do_tx_alloc_abort_nested(PMEMobjpool *pop)
} TX_ONCOMMIT {
ASSERT(0);
} TX_ONABORT {
- OID_ASSIGN(obj2, OID_NULL);
+ TOID_ASSIGN(obj2, OID_NULL);
} TX_END
} TX_ONCOMMIT {
ASSERT(0);
} TX_ONABORT {
- OID_ASSIGN(obj1, OID_NULL);
+ TOID_ASSIGN(obj1, OID_NULL);
} TX_END
- OID_TYPE(struct object) first;
+ TOID(struct object) first;
/* check the obj1 object */
- ASSERT(OID_IS_NULL(obj1));
+ ASSERT(TOID_IS_NULL(obj1));
first.oid = pmemobj_first(pop, TYPE_ABORT_NESTED1);
- ASSERT(OID_IS_NULL(first));
+ ASSERT(TOID_IS_NULL(first));
/* check the obj2 object */
- ASSERT(OID_IS_NULL(obj2));
+ ASSERT(TOID_IS_NULL(obj2));
first.oid = pmemobj_first(pop, TYPE_ABORT_NESTED2);
- ASSERT(OID_IS_NULL(first));
+ ASSERT(TOID_IS_NULL(first));
}
/*
@@ -226,21 +226,21 @@ do_tx_alloc_abort_nested(PMEMobjpool *pop)
static void
do_tx_alloc_commit_nested(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj1;
- OID_TYPE(struct object) obj2;
+ TOID(struct object) obj1;
+ TOID(struct object) obj2;
TX_BEGIN(pop) {
- OID_ASSIGN(obj1, pmemobj_tx_alloc(sizeof (struct object),
+ TOID_ASSIGN(obj1, pmemobj_tx_alloc(sizeof (struct object),
TYPE_COMMIT_NESTED1));
- ASSERT(!OID_IS_NULL(obj1));
+ ASSERT(!TOID_IS_NULL(obj1));
D_RW(obj1)->value = TEST_VALUE_1;
TX_BEGIN(pop) {
- OID_ASSIGN(obj2, pmemobj_tx_zalloc(
+ TOID_ASSIGN(obj2, pmemobj_tx_zalloc(
sizeof (struct object),
TYPE_COMMIT_NESTED2));
- ASSERT(!OID_IS_NULL(obj2));
+ ASSERT(!TOID_IS_NULL(obj2));
ASSERT(util_is_zeroed(D_RO(obj2),
sizeof (struct object)));
@@ -259,24 +259,24 @@ do_tx_alloc_commit_nested(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_TYPE(struct object) first;
- OID_TYPE(struct object) next;
+ TOID(struct object) first;
+ TOID(struct object) next;
/* check the obj1 object */
- OID_ASSIGN(first, pmemobj_first(pop, TYPE_COMMIT_NESTED1));
- ASSERT(OID_EQUALS(first, obj1));
+ TOID_ASSIGN(first, pmemobj_first(pop, TYPE_COMMIT_NESTED1));
+ ASSERT(TOID_EQUALS(first, obj1));
ASSERTeq(D_RO(first)->value, TEST_VALUE_1);
- OID_ASSIGN(next, pmemobj_next(first.oid));
- ASSERT(OID_IS_NULL(next));
+ TOID_ASSIGN(next, pmemobj_next(first.oid));
+ ASSERT(TOID_IS_NULL(next));
/* check the obj2 object */
- OID_ASSIGN(first, pmemobj_first(pop, TYPE_COMMIT_NESTED2));
- ASSERT(OID_EQUALS(first, obj2));
+ TOID_ASSIGN(first, pmemobj_first(pop, TYPE_COMMIT_NESTED2));
+ ASSERT(TOID_EQUALS(first, obj2));
ASSERTeq(D_RO(first)->value, TEST_VALUE_2);
- OID_ASSIGN(next, pmemobj_next(first.oid));
- ASSERT(OID_IS_NULL(next));
+ TOID_ASSIGN(next, pmemobj_next(first.oid));
+ ASSERT(TOID_IS_NULL(next));
}
/*
@@ -285,25 +285,25 @@ do_tx_alloc_commit_nested(PMEMobjpool *pop)
static void
do_tx_alloc_abort(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, pmemobj_tx_alloc(sizeof (struct object),
+ TOID_ASSIGN(obj, pmemobj_tx_alloc(sizeof (struct object),
TYPE_ABORT));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
D_RW(obj)->value = TEST_VALUE_1;
pmemobj_tx_abort(-1);
} TX_ONCOMMIT {
ASSERT(0);
} TX_ONABORT {
- OID_ASSIGN(obj, OID_NULL);
+ TOID_ASSIGN(obj, OID_NULL);
} TX_END
- ASSERT(OID_IS_NULL(obj));
+ ASSERT(TOID_IS_NULL(obj));
- OID_TYPE(struct object) first;
- OID_ASSIGN(first, pmemobj_first(pop, TYPE_ABORT));
- ASSERT(OID_IS_NULL(first));
+ TOID(struct object) first;
+ TOID_ASSIGN(first, pmemobj_first(pop, TYPE_ABORT));
+ ASSERT(TOID_IS_NULL(first));
}
/*
@@ -312,11 +312,11 @@ do_tx_alloc_abort(PMEMobjpool *pop)
static void
do_tx_alloc_commit(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, pmemobj_tx_alloc(sizeof (struct object),
+ TOID_ASSIGN(obj, pmemobj_tx_alloc(sizeof (struct object),
TYPE_COMMIT));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
D_RW(obj)->value = TEST_VALUE_1;
} TX_ONCOMMIT {
@@ -325,14 +325,14 @@ do_tx_alloc_commit(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_TYPE(struct object) first;
- OID_ASSIGN(first, pmemobj_first(pop, TYPE_COMMIT));
- ASSERT(OID_EQUALS(first, obj));
+ TOID(struct object) first;
+ TOID_ASSIGN(first, pmemobj_first(pop, TYPE_COMMIT));
+ ASSERT(TOID_EQUALS(first, obj));
ASSERTeq(D_RO(first)->value, D_RO(obj)->value);
- OID_TYPE(struct object) next;
- OID_ASSIGN(next, pmemobj_next(first.oid));
- ASSERT(OID_IS_NULL(next));
+ TOID(struct object) next;
+ TOID_ASSIGN(next, pmemobj_next(first.oid));
+ ASSERT(TOID_IS_NULL(next));
}
/*
@@ -341,9 +341,9 @@ do_tx_alloc_commit(PMEMobjpool *pop)
static void
do_tx_alloc_no_tx(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, pmemobj_tx_alloc(sizeof (struct object), TYPE_NO_TX));
- ASSERT(OID_IS_NULL(obj));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, pmemobj_tx_alloc(sizeof (struct object), TYPE_NO_TX));
+ ASSERT(TOID_IS_NULL(obj));
}
int
diff --git a/src/test/obj_tx_free/obj_tx_free.c b/src/test/obj_tx_free/obj_tx_free.c
index 7dd3a437e8cdb79c374625b26d84bbdc3cc38667..f4ec07825de5a7990546524930209cc03cb6b9b6 100644
--- a/src/test/obj_tx_free/obj_tx_free.c
+++ b/src/test/obj_tx_free/obj_tx_free.c
@@ -61,6 +61,7 @@ enum type_number {
TYPE_FREE_ALLOC,
};
+TOID_DECLARE(struct object, 0);
struct object {
size_t value;
@@ -94,9 +95,9 @@ do_tx_free_no_tx(PMEMobjpool *pop)
ret = pmemobj_tx_free(oid);
ASSERTne(ret, 0);
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_NO_TX));
- ASSERT(!OID_IS_NULL(obj));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_NO_TX));
+ ASSERT(!TOID_IS_NULL(obj));
}
/*
@@ -118,9 +119,9 @@ do_tx_free_wrong_uuid(PMEMobjpool *pop)
ASSERTeq(ret, -1);
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_WRONG_UUID));
- ASSERT(!OID_IS_NULL(obj));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_WRONG_UUID));
+ ASSERT(!TOID_IS_NULL(obj));
}
/*
@@ -157,9 +158,9 @@ do_tx_free_commit(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_COMMIT));
- ASSERT(OID_IS_NULL(obj));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_COMMIT));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -180,9 +181,9 @@ do_tx_free_abort(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ABORT));
- ASSERT(!OID_IS_NULL(obj));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ABORT));
+ ASSERT(!TOID_IS_NULL(obj));
}
/*
@@ -210,13 +211,13 @@ do_tx_free_commit_nested(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_COMMIT_NESTED1));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_COMMIT_NESTED1));
+ ASSERT(TOID_IS_NULL(obj));
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_COMMIT_NESTED2));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_COMMIT_NESTED2));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -245,13 +246,13 @@ do_tx_free_abort_nested(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ABORT_NESTED1));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ABORT_NESTED1));
+ ASSERT(!TOID_IS_NULL(obj));
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ABORT_NESTED2));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ABORT_NESTED2));
+ ASSERT(!TOID_IS_NULL(obj));
}
/*
@@ -279,13 +280,13 @@ do_tx_free_abort_after_nested(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ABORT_AFTER_NESTED1));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ABORT_AFTER_NESTED1));
+ ASSERT(!TOID_IS_NULL(obj));
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ABORT_AFTER_NESTED2));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ABORT_AFTER_NESTED2));
+ ASSERT(!TOID_IS_NULL(obj));
}
/*
@@ -314,9 +315,9 @@ do_tx_free_oom(PMEMobjpool *pop)
ASSERTeq(alloc_cnt, free_cnt);
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_OOM));
- ASSERT(OID_IS_NULL(obj));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_OOM));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -327,12 +328,12 @@ static void
do_tx_free_alloc_abort(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, pmemobj_tx_alloc(
+ TOID_ASSIGN(obj, pmemobj_tx_alloc(
sizeof (struct object), TYPE_FREE_ALLOC));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
ret = pmemobj_tx_free(obj.oid);
ASSERTeq(ret, 0);
pmemobj_tx_abort(-1);
@@ -340,8 +341,8 @@ do_tx_free_alloc_abort(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ALLOC));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ALLOC));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -352,20 +353,20 @@ static void
do_tx_free_alloc_commit(PMEMobjpool *pop)
{
int ret;
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, pmemobj_tx_alloc(
+ TOID_ASSIGN(obj, pmemobj_tx_alloc(
sizeof (struct object), TYPE_FREE_ALLOC));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
ret = pmemobj_tx_free(obj.oid);
ASSERTeq(ret, 0);
} TX_ONABORT {
ASSERT(0);
} TX_END
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ALLOC));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_FREE_ALLOC));
+ ASSERT(TOID_IS_NULL(obj));
}
int
diff --git a/src/test/obj_tx_realloc/obj_tx_realloc.c b/src/test/obj_tx_realloc/obj_tx_realloc.c
index 9a4836c95212f1e6878a7bdfff829c0da4ab6c44..b9361b44062f6c6fa8edaf7c0f56a603275ea62f 100644
--- a/src/test/obj_tx_realloc/obj_tx_realloc.c
+++ b/src/test/obj_tx_realloc/obj_tx_realloc.c
@@ -61,19 +61,21 @@ struct object {
char data[OBJ_SIZE - sizeof (size_t)];
};
+TOID_DECLARE(struct object, 0);
+
/*
* do_tx_alloc -- do tx allocation with specified type number
*/
static PMEMoid
do_tx_alloc(PMEMobjpool *pop, int type_num, size_t value)
{
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, OID_NULL);
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, OID_NULL);
TX_BEGIN(pop) {
- OID_ASSIGN(obj, pmemobj_tx_alloc(
+ TOID_ASSIGN(obj, pmemobj_tx_alloc(
sizeof (struct object), type_num));
- if (!OID_IS_NULL(obj)) {
+ if (!TOID_IS_NULL(obj)) {
D_RW(obj)->value = value;
}
} TX_END
@@ -87,14 +89,14 @@ do_tx_alloc(PMEMobjpool *pop, int type_num, size_t value)
static void
do_tx_realloc_no_tx(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_alloc(pop, TYPE_NO_TX, TEST_VALUE_1));
- ASSERT(!OID_IS_NULL(obj));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_alloc(pop, TYPE_NO_TX, TEST_VALUE_1));
+ ASSERT(!TOID_IS_NULL(obj));
- OID_TYPE(struct object) obj_r;
- OID_ASSIGN(obj_r, pmemobj_tx_realloc(obj.oid,
+ TOID(struct object) obj_r;
+ TOID_ASSIGN(obj_r, pmemobj_tx_realloc(obj.oid,
2 * sizeof (struct object), TYPE_NO_TX));
- ASSERT(OID_IS_NULL(obj_r));
+ ASSERT(TOID_IS_NULL(obj_r));
}
/*
@@ -103,26 +105,26 @@ do_tx_realloc_no_tx(PMEMobjpool *pop)
static void
do_tx_realloc_commit(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_alloc(pop, TYPE_COMMIT, TEST_VALUE_1));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_alloc(pop, TYPE_COMMIT, TEST_VALUE_1));
size_t new_size = 2 * pmemobj_alloc_usable_size(obj.oid);
TX_BEGIN(pop) {
- OID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
+ TOID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
new_size, TYPE_COMMIT));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERT(pmemobj_alloc_usable_size(obj.oid) >= new_size);
} TX_ONABORT {
ASSERT(0);
} TX_END
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_COMMIT));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_COMMIT));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERTeq(D_RO(obj)->value, TEST_VALUE_1);
ASSERT(pmemobj_alloc_usable_size(obj.oid) >= new_size);
- OID_ASSIGN(obj, pmemobj_next(obj.oid));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_next(obj.oid));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -131,14 +133,14 @@ do_tx_realloc_commit(PMEMobjpool *pop)
static void
do_tx_realloc_abort(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_alloc(pop, TYPE_ABORT, TEST_VALUE_1));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_alloc(pop, TYPE_ABORT, TEST_VALUE_1));
size_t new_size = 2 * pmemobj_alloc_usable_size(obj.oid);
TX_BEGIN(pop) {
- OID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
+ TOID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
new_size, TYPE_ABORT));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERT(pmemobj_alloc_usable_size(obj.oid) >= new_size);
pmemobj_tx_abort(-1);
@@ -146,13 +148,13 @@ do_tx_realloc_abort(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_ABORT));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_ABORT));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERTeq(D_RO(obj)->value, TEST_VALUE_1);
ASSERT(pmemobj_alloc_usable_size(obj.oid) < new_size);
- OID_ASSIGN(obj, pmemobj_next(obj.oid));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_next(obj.oid));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -161,15 +163,15 @@ do_tx_realloc_abort(PMEMobjpool *pop)
static void
do_tx_zrealloc_commit(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_alloc(pop, TYPE_COMMIT_ZERO, TEST_VALUE_1));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_alloc(pop, TYPE_COMMIT_ZERO, TEST_VALUE_1));
size_t old_size = pmemobj_alloc_usable_size(obj.oid);
size_t new_size = 2 * old_size;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
+ TOID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
new_size, TYPE_COMMIT_ZERO));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERT(pmemobj_alloc_usable_size(obj.oid) >= new_size);
void *new_ptr = (void *)((uintptr_t)D_RW(obj) + old_size);
ASSERT(util_is_zeroed(new_ptr, new_size - old_size));
@@ -177,16 +179,16 @@ do_tx_zrealloc_commit(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_COMMIT_ZERO));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_COMMIT_ZERO));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERTeq(D_RO(obj)->value, TEST_VALUE_1);
ASSERT(pmemobj_alloc_usable_size(obj.oid) >= new_size);
void *new_ptr = (void *)((uintptr_t)D_RW(obj) + old_size);
ASSERT(util_is_zeroed(new_ptr, new_size - old_size));
- OID_ASSIGN(obj, pmemobj_next(obj.oid));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_next(obj.oid));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -195,15 +197,15 @@ do_tx_zrealloc_commit(PMEMobjpool *pop)
static void
do_tx_zrealloc_abort(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj;
- OID_ASSIGN(obj, do_tx_alloc(pop, TYPE_ABORT_ZERO, TEST_VALUE_1));
+ TOID(struct object) obj;
+ TOID_ASSIGN(obj, do_tx_alloc(pop, TYPE_ABORT_ZERO, TEST_VALUE_1));
size_t old_size = pmemobj_alloc_usable_size(obj.oid);
size_t new_size = 2 * old_size;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
+ TOID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
new_size, TYPE_ABORT_ZERO));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERT(pmemobj_alloc_usable_size(obj.oid) >= new_size);
void *new_ptr = (void *)((uintptr_t)D_RW(obj) + old_size);
ASSERT(util_is_zeroed(new_ptr, new_size - old_size));
@@ -213,13 +215,13 @@ do_tx_zrealloc_abort(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_ABORT_ZERO));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_ABORT_ZERO));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERTeq(D_RO(obj)->value, TEST_VALUE_1);
ASSERT(pmemobj_alloc_usable_size(obj.oid) < new_size);
- OID_ASSIGN(obj, pmemobj_next(obj.oid));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_next(obj.oid));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -229,29 +231,29 @@ do_tx_zrealloc_abort(PMEMobjpool *pop)
static void
do_tx_realloc_alloc_commit(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
size_t new_size = 0;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, do_tx_alloc(pop, TYPE_COMMIT_ALLOC,
+ TOID_ASSIGN(obj, do_tx_alloc(pop, TYPE_COMMIT_ALLOC,
TEST_VALUE_1));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
new_size = 2 * pmemobj_alloc_usable_size(obj.oid);
- OID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
+ TOID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
new_size, TYPE_COMMIT_ALLOC));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERT(pmemobj_alloc_usable_size(obj.oid) >= new_size);
} TX_ONABORT {
ASSERT(0);
} TX_END
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_COMMIT_ALLOC));
- ASSERT(!OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_COMMIT_ALLOC));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERTeq(D_RO(obj)->value, TEST_VALUE_1);
ASSERT(pmemobj_alloc_usable_size(obj.oid) >= new_size);
- OID_ASSIGN(obj, pmemobj_next(obj.oid));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_next(obj.oid));
+ ASSERT(TOID_IS_NULL(obj));
}
/*
@@ -261,17 +263,17 @@ do_tx_realloc_alloc_commit(PMEMobjpool *pop)
static void
do_tx_realloc_alloc_abort(PMEMobjpool *pop)
{
- OID_TYPE(struct object) obj;
+ TOID(struct object) obj;
size_t new_size = 0;
TX_BEGIN(pop) {
- OID_ASSIGN(obj, do_tx_alloc(pop, TYPE_ABORT_ALLOC,
+ TOID_ASSIGN(obj, do_tx_alloc(pop, TYPE_ABORT_ALLOC,
TEST_VALUE_1));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
new_size = 2 * pmemobj_alloc_usable_size(obj.oid);
- OID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
+ TOID_ASSIGN(obj, pmemobj_tx_realloc(obj.oid,
new_size, TYPE_ABORT_ALLOC));
- ASSERT(!OID_IS_NULL(obj));
+ ASSERT(!TOID_IS_NULL(obj));
ASSERT(pmemobj_alloc_usable_size(obj.oid) >= new_size);
pmemobj_tx_abort(-1);
@@ -279,8 +281,8 @@ do_tx_realloc_alloc_abort(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(obj, pmemobj_first(pop, TYPE_ABORT_ALLOC));
- ASSERT(OID_IS_NULL(obj));
+ TOID_ASSIGN(obj, pmemobj_first(pop, TYPE_ABORT_ALLOC));
+ ASSERT(TOID_IS_NULL(obj));
}
int
diff --git a/src/test/obj_tx_strdup/obj_tx_strdup.c b/src/test/obj_tx_strdup/obj_tx_strdup.c
index b7ea9a072045e625734ef0544ed5f417f23f2159..c4feaa0d2eca1b036710069552757f39e95fe418 100644
--- a/src/test/obj_tx_strdup/obj_tx_strdup.c
+++ b/src/test/obj_tx_strdup/obj_tx_strdup.c
@@ -42,6 +42,8 @@
#define LAYOUT_NAME "tx_strdup"
+TOID_DECLARE(char, 0);
+
enum type_number {
TYPE_NO_TX,
TYPE_COMMIT,
@@ -65,12 +67,12 @@ enum type_number {
static void
do_tx_strdup_no_tx(PMEMobjpool *pop)
{
- OID_TYPE(char) str;
- OID_ASSIGN(str, pmemobj_tx_strdup(TEST_STR_1, TYPE_NO_TX));
- ASSERT(OID_IS_NULL(str));
+ TOID(char) str;
+ TOID_ASSIGN(str, pmemobj_tx_strdup(TEST_STR_1, TYPE_NO_TX));
+ ASSERT(TOID_IS_NULL(str));
- OID_ASSIGN(str, pmemobj_first(pop, TYPE_NO_TX));
- ASSERT(OID_IS_NULL(str));
+ TOID_ASSIGN(str, pmemobj_first(pop, TYPE_NO_TX));
+ ASSERT(TOID_IS_NULL(str));
}
/*
@@ -79,16 +81,16 @@ do_tx_strdup_no_tx(PMEMobjpool *pop)
static void
do_tx_strdup_commit(PMEMobjpool *pop)
{
- OID_TYPE(char) str;
+ TOID(char) str;
TX_BEGIN(pop) {
- OID_ASSIGN(str, pmemobj_tx_strdup(TEST_STR_1, TYPE_COMMIT));
- ASSERT(!OID_IS_NULL(str));
+ TOID_ASSIGN(str, pmemobj_tx_strdup(TEST_STR_1, TYPE_COMMIT));
+ ASSERT(!TOID_IS_NULL(str));
} TX_ONABORT {
ASSERT(0);
} TX_END
- OID_ASSIGN(str, pmemobj_first(pop, TYPE_COMMIT));
- ASSERT(!OID_IS_NULL(str));
+ TOID_ASSIGN(str, pmemobj_first(pop, TYPE_COMMIT));
+ ASSERT(!TOID_IS_NULL(str));
ASSERTeq(strcmp(TEST_STR_1, D_RO(str)), 0);
}
@@ -98,17 +100,17 @@ do_tx_strdup_commit(PMEMobjpool *pop)
static void
do_tx_strdup_abort(PMEMobjpool *pop)
{
- OID_TYPE(char) str;
+ TOID(char) str;
TX_BEGIN(pop) {
- OID_ASSIGN(str, pmemobj_tx_strdup(TEST_STR_1, TYPE_ABORT));
- ASSERT(!OID_IS_NULL(str));
+ TOID_ASSIGN(str, pmemobj_tx_strdup(TEST_STR_1, TYPE_ABORT));
+ ASSERT(!TOID_IS_NULL(str));
pmemobj_tx_abort(-1);
} TX_ONCOMMIT {
ASSERT(0);
} TX_END
- OID_ASSIGN(str, pmemobj_first(pop, TYPE_ABORT));
- ASSERT(OID_IS_NULL(str));
+ TOID_ASSIGN(str, pmemobj_first(pop, TYPE_ABORT));
+ ASSERT(TOID_IS_NULL(str));
}
/*
@@ -118,19 +120,19 @@ do_tx_strdup_abort(PMEMobjpool *pop)
static void
do_tx_strdup_free_commit(PMEMobjpool *pop)
{
- OID_TYPE(char) str;
+ TOID(char) str;
TX_BEGIN(pop) {
- OID_ASSIGN(str, pmemobj_tx_strdup(TEST_STR_1,
+ TOID_ASSIGN(str, pmemobj_tx_strdup(TEST_STR_1,
TYPE_FREE_COMMIT));
- ASSERT(!OID_IS_NULL(str));
+ ASSERT(!TOID_IS_NULL(str));
int ret = pmemobj_tx_free(str.oid);
ASSERTeq(ret, 0);
} TX_ONABORT {
ASSERT(0);
} TX_END
- OID_ASSIGN(str, pmemobj_first(pop, TYPE_FREE_COMMIT));
- ASSERT(OID_IS_NULL(str));
+ TOID_ASSIGN(str, pmemobj_first(pop, TYPE_FREE_COMMIT));
+ ASSERT(TOID_IS_NULL(str));
}
/*
@@ -140,10 +142,11 @@ do_tx_strdup_free_commit(PMEMobjpool *pop)
static void
do_tx_strdup_free_abort(PMEMobjpool *pop)
{
- OID_TYPE(char) str;
+ TOID(char) str;
TX_BEGIN(pop) {
- OID_ASSIGN(str, pmemobj_tx_strdup(TEST_STR_1, TYPE_FREE_ABORT));
- ASSERT(!OID_IS_NULL(str));
+ TOID_ASSIGN(str,
+ pmemobj_tx_strdup(TEST_STR_1, TYPE_FREE_ABORT));
+ ASSERT(!TOID_IS_NULL(str));
int ret = pmemobj_tx_free(str.oid);
ASSERTeq(ret, 0);
pmemobj_tx_abort(-1);
@@ -151,8 +154,8 @@ do_tx_strdup_free_abort(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(str, pmemobj_first(pop, TYPE_FREE_ABORT));
- ASSERT(OID_IS_NULL(str));
+ TOID_ASSIGN(str, pmemobj_first(pop, TYPE_FREE_ABORT));
+ ASSERT(TOID_IS_NULL(str));
}
/*
@@ -162,17 +165,17 @@ do_tx_strdup_free_abort(PMEMobjpool *pop)
static void
do_tx_strdup_commit_nested(PMEMobjpool *pop)
{
- OID_TYPE(char) str1;
- OID_TYPE(char) str2;
+ TOID(char) str1;
+ TOID(char) str2;
TX_BEGIN(pop) {
- OID_ASSIGN(str1, pmemobj_tx_strdup(TEST_STR_1,
+ TOID_ASSIGN(str1, pmemobj_tx_strdup(TEST_STR_1,
TYPE_COMMIT_NESTED1));
- ASSERT(!OID_IS_NULL(str1));
+ ASSERT(!TOID_IS_NULL(str1));
TX_BEGIN(pop) {
- OID_ASSIGN(str2, pmemobj_tx_strdup(TEST_STR_2,
+ TOID_ASSIGN(str2, pmemobj_tx_strdup(TEST_STR_2,
TYPE_COMMIT_NESTED2));
- ASSERT(!OID_IS_NULL(str2));
+ ASSERT(!TOID_IS_NULL(str2));
} TX_ONABORT {
ASSERT(0);
} TX_END
@@ -180,12 +183,12 @@ do_tx_strdup_commit_nested(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(str1, pmemobj_first(pop, TYPE_COMMIT_NESTED1));
- ASSERT(!OID_IS_NULL(str1));
+ TOID_ASSIGN(str1, pmemobj_first(pop, TYPE_COMMIT_NESTED1));
+ ASSERT(!TOID_IS_NULL(str1));
ASSERTeq(strcmp(TEST_STR_1, D_RO(str1)), 0);
- OID_ASSIGN(str2, pmemobj_first(pop, TYPE_COMMIT_NESTED2));
- ASSERT(!OID_IS_NULL(str2));
+ TOID_ASSIGN(str2, pmemobj_first(pop, TYPE_COMMIT_NESTED2));
+ ASSERT(!TOID_IS_NULL(str2));
ASSERTeq(strcmp(TEST_STR_2, D_RO(str2)), 0);
}
@@ -196,17 +199,17 @@ do_tx_strdup_commit_nested(PMEMobjpool *pop)
static void
do_tx_strdup_abort_nested(PMEMobjpool *pop)
{
- OID_TYPE(char) str1;
- OID_TYPE(char) str2;
+ TOID(char) str1;
+ TOID(char) str2;
TX_BEGIN(pop) {
- OID_ASSIGN(str1, pmemobj_tx_strdup(TEST_STR_1,
+ TOID_ASSIGN(str1, pmemobj_tx_strdup(TEST_STR_1,
TYPE_ABORT_NESTED1));
- ASSERT(!OID_IS_NULL(str1));
+ ASSERT(!TOID_IS_NULL(str1));
TX_BEGIN(pop) {
- OID_ASSIGN(str2, pmemobj_tx_strdup(TEST_STR_2,
+ TOID_ASSIGN(str2, pmemobj_tx_strdup(TEST_STR_2,
TYPE_ABORT_NESTED2));
- ASSERT(!OID_IS_NULL(str2));
+ ASSERT(!TOID_IS_NULL(str2));
pmemobj_tx_abort(-1);
} TX_ONCOMMIT {
ASSERT(0);
@@ -215,11 +218,11 @@ do_tx_strdup_abort_nested(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(str1, pmemobj_first(pop, TYPE_ABORT_NESTED1));
- ASSERT(OID_IS_NULL(str1));
+ TOID_ASSIGN(str1, pmemobj_first(pop, TYPE_ABORT_NESTED1));
+ ASSERT(TOID_IS_NULL(str1));
- OID_ASSIGN(str2, pmemobj_first(pop, TYPE_ABORT_NESTED2));
- ASSERT(OID_IS_NULL(str2));
+ TOID_ASSIGN(str2, pmemobj_first(pop, TYPE_ABORT_NESTED2));
+ ASSERT(TOID_IS_NULL(str2));
}
/*
@@ -229,17 +232,17 @@ do_tx_strdup_abort_nested(PMEMobjpool *pop)
static void
do_tx_strdup_abort_after_nested(PMEMobjpool *pop)
{
- OID_TYPE(char) str1;
- OID_TYPE(char) str2;
+ TOID(char) str1;
+ TOID(char) str2;
TX_BEGIN(pop) {
- OID_ASSIGN(str1, pmemobj_tx_strdup(TEST_STR_1,
+ TOID_ASSIGN(str1, pmemobj_tx_strdup(TEST_STR_1,
TYPE_ABORT_AFTER_NESTED1));
- ASSERT(!OID_IS_NULL(str1));
+ ASSERT(!TOID_IS_NULL(str1));
TX_BEGIN(pop) {
- OID_ASSIGN(str2, pmemobj_tx_strdup(TEST_STR_2,
+ TOID_ASSIGN(str2, pmemobj_tx_strdup(TEST_STR_2,
TYPE_ABORT_AFTER_NESTED2));
- ASSERT(!OID_IS_NULL(str2));
+ ASSERT(!TOID_IS_NULL(str2));
} TX_ONABORT {
ASSERT(0);
} TX_END
@@ -249,11 +252,11 @@ do_tx_strdup_abort_after_nested(PMEMobjpool *pop)
ASSERT(0);
} TX_END
- OID_ASSIGN(str1, pmemobj_first(pop, TYPE_ABORT_AFTER_NESTED1));
- ASSERT(OID_IS_NULL(str1));
+ TOID_ASSIGN(str1, pmemobj_first(pop, TYPE_ABORT_AFTER_NESTED1));
+ ASSERT(TOID_IS_NULL(str1));
- OID_ASSIGN(str2, pmemobj_first(pop, TYPE_ABORT_AFTER_NESTED2));
- ASSERT(OID_IS_NULL(str2));
+ TOID_ASSIGN(str2, pmemobj_first(pop, TYPE_ABORT_AFTER_NESTED2));
+ ASSERT(TOID_IS_NULL(str2));
}
int
diff --git a/src/test/scope/out4.log.match b/src/test/scope/out4.log.match
index ec8c4e2a01fdce83c112073c9c97ed5550a4c46d..ec5550b9475aacddd29d1b497c7c05bdd81f47af 100644
--- a/src/test/scope/out4.log.match
+++ b/src/test/scope/out4.log.match
@@ -2,7 +2,6 @@ scope/TEST4:
$(*)debug/libpmemobj.so:
_pobj_debug_notice
pmemobj_alloc
-pmemobj_alloc_construct
pmemobj_alloc_usable_size
pmemobj_check
pmemobj_check_version
@@ -58,12 +57,12 @@ pmemobj_tx_stage
pmemobj_tx_strdup
pmemobj_tx_zalloc
pmemobj_tx_zrealloc
+pmemobj_type_num
pmemobj_zalloc
pmemobj_zrealloc
$(*)nondebug/libpmemobj.so:
_pobj_debug_notice
pmemobj_alloc
-pmemobj_alloc_construct
pmemobj_alloc_usable_size
pmemobj_check
pmemobj_check_version
@@ -119,12 +118,12 @@ pmemobj_tx_stage
pmemobj_tx_strdup
pmemobj_tx_zalloc
pmemobj_tx_zrealloc
+pmemobj_type_num
pmemobj_zalloc
pmemobj_zrealloc
$(*)debug/libpmemobj.a:
_pobj_debug_notice
pmemobj_alloc
-pmemobj_alloc_construct
pmemobj_alloc_usable_size
pmemobj_check
pmemobj_check_version
@@ -180,12 +179,12 @@ pmemobj_tx_stage
pmemobj_tx_strdup
pmemobj_tx_zalloc
pmemobj_tx_zrealloc
+pmemobj_type_num
pmemobj_zalloc
pmemobj_zrealloc
$(*)nondebug/libpmemobj.a:
_pobj_debug_notice
pmemobj_alloc
-pmemobj_alloc_construct
pmemobj_alloc_usable_size
pmemobj_check
pmemobj_check_version
@@ -241,5 +240,6 @@ pmemobj_tx_stage
pmemobj_tx_strdup
pmemobj_tx_zalloc
pmemobj_tx_zrealloc
+pmemobj_type_num
pmemobj_zalloc
pmemobj_zrealloc