add attach/detach for shm

This commit is contained in:
zhangyi 2019-03-28 16:30:26 +08:00
parent 755bea8112
commit 89c4b1ce2a
3 changed files with 3 additions and 9 deletions

View File

@ -134,9 +134,8 @@ void release(id_t id) {
auto ii = static_cast<id_info_t*>(id); auto ii = static_cast<id_info_t*>(id);
if (ii->mem_ == nullptr || ii->size_ == 0) { if (ii->mem_ == nullptr || ii->size_ == 0) {
ipc::error("fail release: invalid id (mem = %p, size = %zd)\n", ii->mem_, ii->size_); ipc::error("fail release: invalid id (mem = %p, size = %zd)\n", ii->mem_, ii->size_);
return;
} }
if (acc_of(ii->mem_, ii->size_).fetch_sub(1, std::memory_order_acquire) == 1) { else if (acc_of(ii->mem_, ii->size_).fetch_sub(1, std::memory_order_acquire) == 1) {
::munmap(ii->mem_, ii->size_); ::munmap(ii->mem_, ii->size_);
::shm_unlink(ii->name_.c_str()); ::shm_unlink(ii->name_.c_str());
} }

View File

@ -94,14 +94,12 @@ void release(id_t id) {
auto ii = static_cast<id_info_t*>(id); auto ii = static_cast<id_info_t*>(id);
if (ii->mem_ == nullptr || ii->size_ == 0) { if (ii->mem_ == nullptr || ii->size_ == 0) {
ipc::error("fail release: invalid id (mem = %p, size = %zd)\n", ii->mem_, ii->size_); ipc::error("fail release: invalid id (mem = %p, size = %zd)\n", ii->mem_, ii->size_);
return;
} }
else ::UnmapViewOfFile(static_cast<LPCVOID>(ii->mem_));
if (ii->h_ == NULL) { if (ii->h_ == NULL) {
ipc::error("fail release: invalid id (h = null)\n"); ipc::error("fail release: invalid id (h = null)\n");
return;
} }
::UnmapViewOfFile(static_cast<LPCVOID>(ii->mem_)); else ::CloseHandle(ii->h_);
::CloseHandle(ii->h_);
mem::free(ii); mem::free(ii);
} }

View File

@ -65,12 +65,10 @@ bool handle::acquire(char const * name, std::size_t size, unsigned mode) {
} }
void handle::release() { void handle::release() {
if (!valid()) return;
shm::release(detach()); shm::release(detach());
} }
void* handle::get() const { void* handle::get() const {
if (!valid()) return nullptr;
return impl(p_)->m_; return impl(p_)->m_;
} }
@ -82,7 +80,6 @@ void handle::attach(id_t id) {
} }
id_t handle::detach() { id_t handle::detach() {
if (!valid()) return nullptr;
auto old = impl(p_)->id_; auto old = impl(p_)->id_;
impl(p_)->id_ = nullptr; impl(p_)->id_ = nullptr;
impl(p_)->m_ = nullptr; impl(p_)->m_ = nullptr;