#include #include #include #include #include const char * const poolPath = "/mnt/pmem/pool_for_017"; class pointless { struct element { element(pmem::obj::persistent_ptr & n) : next(n) {} pmem::obj::persistent_ptr next; }; pmem::obj::persistent_ptr head = nullptr; public: pmem::obj::p count = 0; void add(){ head = pmem::obj::make_persistent(head); count.get_rw()++; } }; int main(int argc, char ** argv) { switch (argc){ case 1: { remove(poolPath); pmem::obj::pool pop = pmem::obj::pool::create(poolPath, std::string(), 16*1024*1024); pmem::obj::transaction::exec_tx(pop, [&] { new (pop.get_root().get()) pointless(); }); return 0; } case 2: { pmem::obj::pool pop = pmem::obj::pool::open(poolPath, std::string()); int count = atoi(argv[1]); try { while(count--) { pmem::obj::transaction::exec_tx(pop, [&] { pop.get_root()->add(); }); } } catch(const pmem::transaction_error & e) { printf("Count: %5d (err: %s)\n", pop.get_root()->count.get_ro(), e.what()); return 1; } return 0; } default: throw; } }