#include "unittest.h"
#include <libpmemobj++/allocator.hpp>
#include <libpmemobj++/make_persistent.hpp>
#include <libpmemobj++/p.hpp>
#include <libpmemobj++/persistent_ptr.hpp>
#include <libpmemobj++/pool.hpp>
#include <libpmemobj++/transaction.hpp>
#include "obj_cpp_containers/cont_test_common.hpp"
#include <deque>
#include <queue>
#define LAYOUT "cpp"
namespace
{
struct containers {
explicit containers(nvobj::pool_base &pop)
{
try {
nvobj::transaction::exec_tx(pop, [&] {
fooq.push(foo(rand()));
fooq.push(foo(rand()));
fooq.emplace(Last_val);
});
} catch (...) {
UT_ASSERT(0);
}
}
std::queue<foo, std::deque<foo, nvobj::allocator<foo>>> fooq;
};
struct root {
nvobj::persistent_ptr<containers> cons;
};
void
test_queue(nvobj::pool<root> &pop, bool open)
{
auto conp = pop.get_root()->cons;
UT_ASSERT(conp != nullptr);
UT_ASSERTeq(conp->fooq.size(), 3);
conp->fooq.back().test_foo(Last_val);
if (open) {
{
pmem::obj::transaction::exec_tx(pop, [&conp] {
for (int i = 0; i < 42; ++i)
conp->fooq.emplace(rand());
});
pmem::obj::transaction::exec_tx(pop, [&conp] {
for (int i = 0; i < 42; ++i)
conp->fooq.pop();
});
}
}
}
}
int
main(int argc, char *argv[])
{
START(argc, argv, "obj_cpp_queue");
if (argc != 3 || strchr("co", argv[1][0]) == nullptr)
UT_FATAL("usage: %s <c,o> file-name", argv[0]);
const char *path = argv[2];
nvobj::pool<root> pop;
bool open = (argv[1][0] == 'o');
try {
if (open) {
pop = nvobj::pool<root>::open(path, LAYOUT);
} else {
pop = nvobj::pool<root>::create(path, LAYOUT,
PMEMOBJ_MIN_POOL * 2,
S_IWUSR | S_IRUSR);
nvobj::transaction::manual tx(pop);
pop.get_root()->cons =
nvobj::make_persistent<containers>(pop);
nvobj::transaction::commit();
}
} catch (pmem::pool_error &pe) {
UT_FATAL("!pool::create: %s %s", pe.what(), path);
}
test_queue(pop, open);
pop.close();
DONE(nullptr);
}