PMDK libpmemobj 例程3 宏定义操作

本文介绍了PMDK库中libpmemobj的宏定义,如POBJ_LAYOUT_BEGIN/END/ROOT用于定义内存池名称和根节点,POBJ_ROOT替代pmemobj_root,TOID简化PMEMoids操作,TX_MEMCPY替代事务操作,D_RW和D_RO用于直接读写。示例代码包括writer.c和reader.c,展示了如何在事务中使用这些宏。
摘要由CSDN通过智能技术生成

前两篇文章说了如何操作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_RWD_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;
    }
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值