From d1822e9fc958171ef308be0301d642a48a1187a5 Mon Sep 17 00:00:00 2001 From: mutouyun Date: Wed, 16 Jan 2019 14:01:12 +0800 Subject: [PATCH] shm would fail with multi-thread accessing --- build/test.pro | 3 +-- src/platform/shm_win.cpp | 22 +++++++++++++++------- 2 files changed, 16 insertions(+), 9 deletions(-) diff --git a/build/test.pro b/build/test.pro index 111e347..9a1b632 100644 --- a/build/test.pro +++ b/build/test.pro @@ -14,8 +14,7 @@ INCLUDEPATH += \ ../test \ ../test/capo \ ../include \ - ../src \ - ../src/platform + ../src HEADERS += \ ../test/test.h diff --git a/src/platform/shm_win.cpp b/src/platform/shm_win.cpp index 956d127..86fe7b3 100644 --- a/src/platform/shm_win.cpp +++ b/src/platform/shm_win.cpp @@ -4,17 +4,21 @@ #include #include +#include #include "def.h" -#include "tls_pointer.h" -#include "platform/to_tchar.h" + #include "memory/resource.hpp" +#include "platform/to_tchar.h" namespace { -inline auto& m2h() { - static ipc::tls::pointer> cache; - return *cache.create(); +inline auto* m2h() { + static struct { + std::mutex lc_; + ipc::mem::unordered_map cache_; + } m2h_; + return &m2h_; } } // internal-linkage @@ -38,7 +42,10 @@ void* acquire(char const * name, std::size_t size) { ::CloseHandle(h); return nullptr; } - m2h().emplace(mem, h); + { + [[maybe_unused]] auto guard = std::unique_lock { m2h()->lc_ }; + m2h()->cache_.emplace(mem, h); + } return mem; } @@ -46,7 +53,8 @@ void release(void* mem, std::size_t /*size*/) { if (mem == nullptr) { return; } - auto& cc = m2h(); + [[maybe_unused]] auto guard = std::unique_lock { m2h()->lc_ }; + auto& cc = m2h()->cache_; auto it = cc.find(mem); if (it == cc.end()) { return;