Spaces:
Running
Running
namespace ipc { | |
namespace shm { | |
class handle::handle_ : public pimpl<handle_> { | |
public: | |
shm::id_t id_ = nullptr; | |
void* m_ = nullptr; | |
ipc::string n_; | |
std::size_t s_ = 0; | |
}; | |
handle::handle() | |
: p_(p_->make()) { | |
} | |
handle::handle(char const * name, std::size_t size, unsigned mode) | |
: handle() { | |
acquire(name, size, mode); | |
} | |
handle::handle(handle&& rhs) | |
: handle() { | |
swap(rhs); | |
} | |
handle::~handle() { | |
release(); | |
p_->clear(); | |
} | |
void handle::swap(handle& rhs) { | |
std::swap(p_, rhs.p_); | |
} | |
handle& handle::operator=(handle rhs) { | |
swap(rhs); | |
return *this; | |
} | |
bool handle::valid() const noexcept { | |
return impl(p_)->m_ != nullptr; | |
} | |
std::size_t handle::size() const noexcept { | |
return impl(p_)->s_; | |
} | |
char const * handle::name() const noexcept { | |
return impl(p_)->n_.c_str(); | |
} | |
std::int32_t handle::ref() const noexcept { | |
return shm::get_ref(impl(p_)->id_); | |
} | |
void handle::sub_ref() noexcept { | |
shm::sub_ref(impl(p_)->id_); | |
} | |
bool handle::acquire(char const * name, std::size_t size, unsigned mode) { | |
release(); | |
impl(p_)->id_ = shm::acquire((impl(p_)->n_ = name).c_str(), size, mode); | |
impl(p_)->m_ = shm::get_mem(impl(p_)->id_, &(impl(p_)->s_)); | |
return valid(); | |
} | |
std::int32_t handle::release() { | |
if (impl(p_)->id_ == nullptr) return -1; | |
return shm::release(detach()); | |
} | |
void* handle::get() const { | |
return impl(p_)->m_; | |
} | |
void handle::attach(id_t id) { | |
if (id == nullptr) return; | |
release(); | |
impl(p_)->id_ = id; | |
impl(p_)->m_ = shm::get_mem(impl(p_)->id_, &(impl(p_)->s_)); | |
} | |
id_t handle::detach() { | |
auto old = impl(p_)->id_; | |
impl(p_)->id_ = nullptr; | |
impl(p_)->m_ = nullptr; | |
impl(p_)->s_ = 0; | |
impl(p_)->n_.clear(); | |
return old; | |
} | |
} // namespace shm | |
} // namespace ipc | |