前两篇文章说了如何操作persist memory的读写和事务操作,但在函数调用方面,并不方便,需要考虑偏移量和内存大小等问题。所以本节介绍一些简化函数调用的宏定义:
(1)定义PMEMobjpool持久性内存池的名称,通过POBJ_LAYOUT_BEGIN、POBJ_LAYOUT_ROOT、POBJ_LAYOUT_END进行定义,然后通过POBJ_LAYOUT_NAME调用该名称;
POBJ_LAYOUT_BEGIN(string_store);
POBJ_LAYOUT_ROOT(string_store, struct my_root);
POBJ_LAYOUT_END(string_store);
POBJ_LAYOUT_NAME(string_store)
(2)POBJ_ROOT() 宏替代了 pmemobj_root() 函数,应用等于内存池的根节点;
(3)TOID 宏替代 PMEMoids 的指针操作;
(4)TX_MEMCPY 宏替代 pmemobj_tx_add_range_direct() 函数进行事务操作
(5)D_RW 和 D_RO 更直接写入或读取 TOID 定义的根节点。
writer.c
#include <stdio.h>
#include <string.h>
#include <libpmemobj.h>
#define MAX_BUF_LEN 10
POBJ_LAYOUT_BEGIN(string_store);
POBJ_LAYOUT_ROOT(string_store, struct my_root);
POBJ_LAYOUT_END(string_store);
struct my_root {
char buf[MAX_BUF_LEN];
};
int main(int argc, char *argv[])
{
if (argc != 2) {
printf("usage: %s file-name\n", argv[0]);
return 1;
}
PMEMobjpool *pop = pmemobj_create(argv[1], POBJ_LAYOUT_NAME(string_store), PMEMOBJ_MIN_POOL, 0666);
if (pop == NULL) {
perror("pmemobj_create");
return 1;
}