Advertisement
Not a member of Pastebin yet?
Sign Up,
it unlocks many cool features!
- #include <cstdio>
- #include <libpmemobj++/pool.hpp>
- #include <libpmemobj++/transaction.hpp>
- #include <libpmemobj++/persistent_ptr.hpp>
- #include <libpmemobj++/make_persistent.hpp>
- const char * const poolPath = "/mnt/pmem/pool_for_017";
- class linkedlist {
- struct element {
- element(const int& v) : value(v){}
- pmem::obj::p<int> value;
- pmem::obj::persistent_ptr<element> next = nullptr;
- };
- pmem::obj::persistent_ptr<element> head = nullptr;
- public:
- void add(const int & v){
- if(head == nullptr)
- head = pmem::obj::make_persistent<element>(v);
- else {
- auto curr = head;
- while(curr->next != nullptr)
- curr = curr->next;
- curr->next = pmem::obj::make_persistent<element>(v);
- }
- }
- };
- struct root {
- pmem::obj::persistent_ptr<linkedlist> list;
- };
- int main(int argc, char ** argv) {
- if(argc == 1) {
- remove(poolPath);
- pmem::obj::pool<root> pop = pmem::obj::pool<root>::create(poolPath, std::string(), 8*1024*1024);
- pmem::obj::transaction::exec_tx(pop, [&] {
- pop.get_root()->list = pmem::obj::make_persistent<linkedlist>();
- });
- return 0;
- }
- pmem::obj::pool<root> pop = pmem::obj::pool<root>::open(poolPath, std::string());
- switch(argc) {
- // ./017; let i=0; while ./017 $i; do let i++; done
- // Last: 4 (err: Could not add an object to the transaction.)
- case 2: {
- int v = atoi(argv[1]);
- try {
- pmem::obj::transaction::exec_tx(pop, [&] {
- pop.get_root()->list->add(v);
- });
- } catch(const pmem::transaction_error & e) {
- printf("Last: %5d (err: %s)\n", v, e.what());
- return 1;
- }
- break;
- }
- // $ ./017; ./017 x x
- // Last: 10223 (err: failed to allocate persistent memory object)
- case 3: {
- int v = 0;
- try {
- while(1) {
- pmem::obj::transaction::exec_tx(pop, [&] {
- pop.get_root()->list->add(v);
- });
- v++;
- }
- } catch(const pmem::transaction_error & e) {
- printf("Last: %5d (err: %s)\n", v, e.what());
- }
- break;
- }
- }
- return 0;
- }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement