Advertisement
Guest User

016.cpp

a guest
Oct 16th, 2018
63
0
Never
Not a member of Pastebin yet? Sign Up, it unlocks many cool features!
C++ 3.05 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_016";
  8.  
  9. template <typename T>
  10. class linkedlist {
  11.     struct element {
  12.         element(const T& v) : value(v){}
  13.         pmem::obj::p<T> value;
  14.         pmem::obj::persistent_ptr<element> next = nullptr;
  15.     };
  16.     pmem::obj::persistent_ptr<element> head = nullptr;
  17.     struct iterator {
  18.         iterator(pmem::obj::persistent_ptr<element> start) : current(start){}
  19.         pmem::obj::persistent_ptr<element> current;
  20.         const pmem::obj::p<T> & operator *(){return current->value;}
  21.         iterator & operator ++(){current = current->next; return *this;}
  22.         bool operator!=(const iterator & o) const {return o.current!=current;}
  23.     };
  24. public:
  25.     linkedlist() = default;
  26.     void add(const T & v){
  27.         assert(pmemobj_tx_stage() == TX_STAGE_WORK);
  28.         if(head == nullptr)
  29.             head = pmem::obj::make_persistent<element>(v);
  30.         else {
  31.             auto curr = head;
  32.             while(curr->next != nullptr)
  33.                 curr = curr->next;
  34.             curr->next = pmem::obj::make_persistent<element>(v);
  35.         }
  36.     }
  37.     iterator begin() {return iterator(head);}
  38.     iterator end() {return iterator(nullptr);}
  39. };
  40.  
  41. struct root {
  42.     pmem::obj::persistent_ptr<linkedlist<int>> ll;
  43. };
  44.  
  45. int main(int argc, char ** argv) {
  46.    
  47.     if(argc == 1) {
  48.         remove(poolPath);
  49.         pmem::obj::pool<root> pop = pmem::obj::pool<root>::create(poolPath, std::string(), 8*1024*1024 /*PMEMOBJ_MIN_POOL*/);
  50.         pmem::obj::transaction::exec_tx(pop, [&] {
  51.             pop.get_root()->ll = pmem::obj::make_persistent<linkedlist<int>>();
  52.         });
  53.         return 0;
  54.     }
  55.    
  56.     pmem::obj::pool<root> pop = pmem::obj::pool<root>::open(poolPath, std::string());
  57.    
  58.     switch(argc) {
  59.         case 2: {
  60.             //       ./016; let i=0; while ./016 $i; do let i++; done
  61.             int v = atoi(argv[1]);
  62.             try {
  63.                 pmem::obj::transaction::exec_tx(pop, [&] {
  64.                     pop.get_root()->ll->add(v);
  65.                 });
  66.             } catch(const pmem::transaction_error & e) {
  67.                 printf("Last: %5d (err: %s)\n", v, e.what());
  68.                 return 1;
  69.             }
  70.             break;
  71.         }
  72.         //       ./016; ./016 x x
  73.         case 3: {
  74.             int c = 0;
  75.             try {
  76.                 while(1) {
  77.                     pmem::obj::transaction::exec_tx(pop, [&] {
  78.                         pop.get_root()->ll->add(c);
  79.                     });
  80.                     c++;
  81.                 }
  82.             } catch(const pmem::transaction_error & e) {
  83.                 printf("Last: %5d (err: %s)\n", c, e.what());
  84.             }
  85.             break;
  86.         }
  87.         case 4: {
  88.             for(const auto v: *(pop.get_root()->ll))
  89.                 printf("%d, ", v.get_ro());
  90.             printf("\n");
  91.         }
  92.     }
  93.     return 0;
  94. }
Advertisement
Add Comment
Please, Sign In to add comment
Advertisement