前兩篇文章說了如何操作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 != ) {
printf("usage: %s file-name\n", argv[]);
return ;
}
PMEMobjpool *pop = pmemobj_create(argv[], POBJ_LAYOUT_NAME(string_store), PMEMOBJ_MIN_POOL, );
if (pop == NULL) {
perror("pmemobj_create");
return ;
}
char buf[MAX_BUF_LEN] = {};
int num = scanf("%9s", buf);
if (num == EOF) {
fprintf(stderr, "EOF\n");
return ;
}
TOID(struct my_root) root = POBJ_ROOT(pop, struct my_root);
TX_BEGIN(pop) {
TX_MEMCPY(D_RW(root)->buf, buf, strlen(buf));
//pmemobj_tx_abort(EINVAL);
} TX_END
pmemobj_close(pop);
return ;
}
reader.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 != ) {
printf("usage: %s file-name\n", argv[]);
return ;
}
PMEMobjpool *pop = pmemobj_open(argv[], POBJ_LAYOUT_NAME(string_store));
if (pop == NULL) {
perror("pmemobj_open");
return ;
}
TOID(struct my_root) root = POBJ_ROOT(pop, struct my_root);
printf("%s\n", D_RO(root)->buf);
pmemobj_close(pop);
return ;
}
先将pmemobj_tx_abort()函數登出,是以拷貝操作會成功,如果不登出,則事務操作會復原,意思就是說沒有資料會寫入記憶體池,運作結果如下:
$ ./writer pmem.
$ ./reader pmem.
$ ./writer pmem.
$ ./reader pmem.
通過pmempool工具檢視如下:
$ ./pmempool info -d /home/hostname/pmem. -o
Part file:
path : /home/hostname/pmem.
type : regular file
size :
POOL Header:
Signature : PMEMOBJ
Major :
Mandatory features : x0
Not mandatory features : x0
Forced RO : x0
Pool set UUID : a3642b53-d3e-fd-a0f4-d4b9fd163676
UUID : b5903a59-c03d-a68-a75-d5fb22058a2
Previous part UUID : b5903a59-c03d-a68-a75-d5fb22058a2
Next part UUID : b5903a59-c03d-a68-a75-d5fb22058a2
Previous replica UUID : b5903a59-c03d-a68-a75-d5fb22058a2
Next replica UUID : b5903a59-c03d-a68-a75-d5fb22058a2
Creation Time : Tue Aug ::
Alignment Descriptor : x000007f737777310[OK]
Class : ELF64
Data : 's complement, little endian
Machine : AMD X86-64
Checksum : 0x36af8ef0feaf4fe5 [OK]
PMEM OBJ Header:
Layout : string_store
Lanes offset : 0x2000
Number of lanes : 1024
Heap offset : 0x302000
Heap size : 5234688
Checksum : 0xc7d69baa42c46f55 [OK]
Root offset : 0x3c0550
Root object:
Offset : 0x00000000003c0550
Size : 10
003c0550 31 32 33 34 35 36 00 00 00 00 00 00 00 00 00 00 |123456..........|
003c0560 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
*
003c05c0 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 00 |................|
------------------------------------------------------------------------------
$ ./pmempool info -d /home/hostname/pmem.002 -o
Part file:
path : /home/hostname/pmem.002
type : regular file
size : 8388608
POOL Header:
Signature : PMEMOBJ
Major : 4
Mandatory features : 0x0
Not mandatory features : 0x0
Forced RO : 0x0
Pool set UUID : e88d6514-2a97-42d3-b60a-f51e96e19d34
UUID : 580ee76f-7398-448e-9aa4-24d61cc2e862
Previous part UUID : 580ee76f-7398-448e-9aa4-24d61cc2e862
Next part UUID : 580ee76f-7398-448e-9aa4-24d61cc2e862
Previous replica UUID : 580ee76f-7398-448e-9aa4-24d61cc2e862
Next replica UUID : 580ee76f-7398-448e-9aa4-24d61cc2e862
Creation Time : Tue Aug 28 2018 08:49:21
Alignment Descriptor : 0x000007f737777310[OK]
Class : ELF64
Data : 2's complement, little endian
Machine : AMD X86-
Checksum : xe44583ef8c12ec65 [OK]
PMEM OBJ Header:
Layout : string_store
Lanes offset : x2000
Number of lanes :
Heap offset : x302000
Heap size :
Checksum : xc7d69baa42c46f55 [OK]
Root offset : x3c0550
Root object:
Offset : x00000000003c0550
Size :
c0550 |................|
*
c05c0 |................|
------------------------------------------------------------------------------