天天看點

PMDK libpmemobj 例程3 宏定義操作

前兩篇文章說了如何操作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                    |................|
------------------------------------------------------------------------------