#ifndef PMEMOBJ_MAKE_PERSISTENT_ARRAY_ATOMIC_HPP
#define PMEMOBJ_MAKE_PERSISTENT_ARRAY_ATOMIC_HPP
#include "libpmemobj++/detail/array_traits.hpp"
#include "libpmemobj++/detail/check_persistent_ptr_array.hpp"
#include "libpmemobj++/detail/common.hpp"
#include "libpmemobj++/detail/make_atomic_impl.hpp"
#include "libpmemobj++/detail/pexceptions.hpp"
#include "libpmemobj/atomic_base.h"
namespace pmem
{
namespace obj
{
template <typename T>
void
make_persistent_atomic(pool_base &pool,
typename detail::pp_if_array<T>::type &ptr,
std::size_t N)
{
typedef typename detail::pp_array_type<T>::type I;
auto ret = pmemobj_alloc(pool.get_handle(), ptr.raw_ptr(),
sizeof(I) * N, detail::type_num<I>(),
&detail::array_constructor<I>,
static_cast<void *>(&N));
if (ret != 0)
throw std::bad_alloc();
}
template <typename T>
void
make_persistent_atomic(pool_base &pool,
typename detail::pp_if_size_array<T>::type &ptr)
{
typedef typename detail::pp_array_type<T>::type I;
std::size_t N = detail::pp_array_elems<T>::elems;
auto ret = pmemobj_alloc(pool.get_handle(), ptr.raw_ptr(),
sizeof(I) * N, detail::type_num<I>(),
&detail::array_constructor<I>,
static_cast<void *>(&N));
if (ret != 0)
throw std::bad_alloc();
}
template <typename T>
void
delete_persistent_atomic(typename detail::pp_if_array<T>::type &ptr,
std::size_t)
{
if (ptr == nullptr)
return;
pmemobj_free(ptr.raw_ptr());
}
template <typename T>
void
delete_persistent_atomic(typename detail::pp_if_size_array<T>::type &ptr)
{
if (ptr == nullptr)
return;
pmemobj_free(ptr.raw_ptr());
}
}
}
#endif