Advertisement
Guest User

017.cpp

a guest
Oct 16th, 2018
72
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 2.46 KB | None | 0 0
  1. #include <cstdio>
  2. #include <libpmemobj++/pool.hpp>
  3. #include <libpmemobj++/transaction.hpp>
  4. #include <libpmemobj++/persistent_ptr.hpp>
  5. #include <libpmemobj++/make_persistent.hpp>
  6.  
  7. const char * const poolPath = "/mnt/pmem/pool_for_017";
  8.  
  9. class linkedlist {
  10.     struct element {
  11.         element(const int& v) : value(v){}
  12.         pmem::obj::p<int> value;
  13.         pmem::obj::persistent_ptr<element> next = nullptr;
  14.     };
  15.     pmem::obj::persistent_ptr<element> head = nullptr;
  16. public:
  17.     void add(const int & v){
  18.         if(head == nullptr)
  19.             head = pmem::obj::make_persistent<element>(v);
  20.         else {
  21.             auto curr = head;
  22.             while(curr->next != nullptr)
  23.                 curr = curr->next;
  24.             curr->next = pmem::obj::make_persistent<element>(v);
  25.         }
  26.     }
  27. };
  28.  
  29. struct root {
  30.     pmem::obj::persistent_ptr<linkedlist> list;
  31. };
  32.  
  33. int main(int argc, char ** argv) {
  34.    
  35.     if(argc == 1) {
  36.         remove(poolPath);
  37.         pmem::obj::pool<root> pop = pmem::obj::pool<root>::create(poolPath, std::string(), 8*1024*1024);
  38.         pmem::obj::transaction::exec_tx(pop, [&] {
  39.             pop.get_root()->list = pmem::obj::make_persistent<linkedlist>();
  40.         });
  41.         return 0;
  42.     }
  43.    
  44.     pmem::obj::pool<root> pop = pmem::obj::pool<root>::open(poolPath, std::string());
  45.    
  46.     switch(argc) {
  47.         //       ./017; let i=0; while ./017 $i; do let i++; done
  48.         //       Last:     4 (err: Could not add an object to the transaction.)
  49.         case 2: {
  50.             int v = atoi(argv[1]);
  51.             try {
  52.                 pmem::obj::transaction::exec_tx(pop, [&] {
  53.                     pop.get_root()->list->add(v);
  54.                 });
  55.             } catch(const pmem::transaction_error & e) {
  56.                 printf("Last: %5d (err: %s)\n", v, e.what());
  57.                 return 1;
  58.             }
  59.             break;
  60.         }
  61.         //       $ ./017; ./017 x x
  62.         //       Last: 10223 (err: failed to allocate persistent memory object)
  63.         case 3: {
  64.             int v = 0;
  65.             try {
  66.                 while(1) {
  67.                     pmem::obj::transaction::exec_tx(pop, [&] {
  68.                         pop.get_root()->list->add(v);
  69.                     });
  70.                     v++;
  71.                 }
  72.             } catch(const pmem::transaction_error & e) {
  73.                 printf("Last: %5d (err: %s)\n", v, e.what());
  74.             }
  75.             break;
  76.         }
  77.     }
  78.     return 0;
  79. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement