From 523d38d247683c0c52d401d80aa4b14c3e7cbc2e Mon Sep 17 00:00:00 2001 From: mutouyun Date: Sun, 13 Sep 2020 17:29:14 +0800 Subject: [PATCH] =?UTF-8?q?=E8=B0=83=E6=95=B4=E7=9B=AE=E5=BD=95=E7=BB=93?= =?UTF-8?q?=E6=9E=84=EF=BC=8C=E9=9A=94=E7=A6=BBinclude=E8=B7=AF=E5=BE=84?= =?UTF-8?q?=EF=BC=8C=E4=BF=AE=E6=AD=A3tls=E5=9C=A8win=E4=B8=8B=E7=9A=84?= =?UTF-8?q?=E9=97=AE=E9=A2=98?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit --- LICENSE | 2 +- README.md | 2 +- demo/chat/main.cpp | 2 +- include/{ => libipc}/buffer.h | 4 +- include/{ => libipc}/def.h | 0 include/{ => libipc}/export.h | 0 include/{ => libipc}/ipc.h | 10 +-- include/{ => libipc}/pool_alloc.h | 4 +- include/{ => libipc}/rw_lock.h | 0 include/{ => libipc}/shm.h | 2 +- include/{ => libipc}/tls_pointer.h | 7 +- include/{ => libipc}/waiter.h | 4 +- src/CMakeLists.txt | 13 +++- src/buffer.cpp | 4 +- src/ipc.cpp | 29 +++---- src/{ => libipc}/circ/elem_array.h | 6 +- src/{ => libipc}/circ/elem_def.h | 4 +- src/{ => libipc}/memory/alloc.h | 10 +-- src/{ => libipc}/memory/allocator_wrapper.h | 7 +- src/{ => libipc}/memory/resource.h | 8 +- src/{ => libipc}/memory/wrapper.h | 26 ++++--- src/{ => libipc}/platform/detail.h | 0 src/{ => libipc}/platform/get_sa.h | 0 src/{ => libipc}/platform/shm_linux.cpp | 10 +-- src/{ => libipc}/platform/shm_win.cpp | 14 ++-- src/libipc/platform/tls_detail_win.h | 41 ++++++++++ src/{ => libipc}/platform/tls_pointer_linux.h | 7 +- src/{ => libipc}/platform/tls_pointer_win.cpp | 6 +- src/libipc/platform/tls_pointer_win.h | 46 +++++++++++ src/{ => libipc}/platform/to_tchar.h | 7 +- src/{ => libipc}/platform/waiter_linux.h | 8 +- src/{ => libipc}/platform/waiter_win.h | 16 ++-- src/{ => libipc}/platform/waiter_wrapper.h | 10 +-- src/{ => libipc}/policy.h | 6 +- src/{ => libipc}/prod_cons.h | 11 +-- src/{ => libipc}/queue.h | 12 +-- src/{ => libipc/utility}/concept.h | 0 src/{ => libipc/utility}/id_pool.h | 4 +- src/{ => libipc/utility}/log.h | 0 src/{ => libipc/utility}/pimpl.h | 4 +- src/{ => libipc/utility}/utility.h | 2 +- src/{ => libipc}/waiter_template.inc | 0 src/platform/tls_pointer_win.h | 76 ------------------- src/pool_alloc.cpp | 4 +- src/shm.cpp | 7 +- src/tls_pointer.cpp | 5 +- src/waiter.cpp | 13 ++-- test/test_ipc.cpp | 6 +- test/test_mem.cpp | 4 +- test/test_queue.cpp | 8 +- test/test_shm.cpp | 2 +- test/test_thread_utility.cpp | 4 +- test/test_waiter.cpp | 2 +- 53 files changed, 251 insertions(+), 228 deletions(-) mode change 100644 => 100755 LICENSE mode change 100644 => 100755 README.md mode change 100644 => 100755 demo/chat/main.cpp rename include/{ => libipc}/buffer.h (96%) mode change 100644 => 100755 rename include/{ => libipc}/def.h (100%) mode change 100644 => 100755 rename include/{ => libipc}/export.h (100%) mode change 100644 => 100755 rename include/{ => libipc}/ipc.h (94%) rename include/{ => libipc}/pool_alloc.h (93%) rename include/{ => libipc}/rw_lock.h (100%) rename include/{ => libipc}/shm.h (92%) mode change 100644 => 100755 rename include/{ => libipc}/tls_pointer.h (88%) rename include/{ => libipc}/waiter.h (91%) mode change 100644 => 100755 mode change 100644 => 100755 src/buffer.cpp rename src/{ => libipc}/circ/elem_array.h (90%) mode change 100644 => 100755 rename src/{ => libipc}/circ/elem_def.h (93%) mode change 100644 => 100755 rename src/{ => libipc}/memory/alloc.h (94%) rename src/{ => libipc}/memory/allocator_wrapper.h (93%) rename src/{ => libipc}/memory/resource.h (90%) rename src/{ => libipc}/memory/wrapper.h (90%) rename src/{ => libipc}/platform/detail.h (100%) rename src/{ => libipc}/platform/get_sa.h (100%) rename src/{ => libipc}/platform/shm_linux.cpp (93%) mode change 100644 => 100755 rename src/{ => libipc}/platform/shm_win.cpp (90%) mode change 100644 => 100755 create mode 100755 src/libipc/platform/tls_detail_win.h rename src/{ => libipc}/platform/tls_pointer_linux.h (90%) rename src/{ => libipc}/platform/tls_pointer_win.cpp (94%) create mode 100755 src/libipc/platform/tls_pointer_win.h rename src/{ => libipc}/platform/to_tchar.h (91%) mode change 100644 => 100755 rename src/{ => libipc}/platform/waiter_linux.h (95%) mode change 100644 => 100755 rename src/{ => libipc}/platform/waiter_win.h (91%) mode change 100644 => 100755 rename src/{ => libipc}/platform/waiter_wrapper.h (93%) mode change 100644 => 100755 rename src/{ => libipc}/policy.h (78%) mode change 100644 => 100755 rename src/{ => libipc}/prod_cons.h (96%) rename src/{ => libipc}/queue.h (92%) rename src/{ => libipc/utility}/concept.h (100%) rename src/{ => libipc/utility}/id_pool.h (97%) mode change 100644 => 100755 rename src/{ => libipc/utility}/log.h (100%) mode change 100644 => 100755 rename src/{ => libipc/utility}/pimpl.h (92%) mode change 100644 => 100755 rename src/{ => libipc/utility}/utility.h (95%) rename src/{ => libipc}/waiter_template.inc (100%) mode change 100644 => 100755 delete mode 100755 src/platform/tls_pointer_win.h mode change 100644 => 100755 src/shm.cpp mode change 100644 => 100755 src/waiter.cpp diff --git a/LICENSE b/LICENSE old mode 100644 new mode 100755 index 6ae0f8c..cf01f90 --- a/LICENSE +++ b/LICENSE @@ -1,4 +1,4 @@ -cpp-ipc - A high-performance inter-process communication using shared memory on Linux/Windows. +cpp-ipc(libipc) - A high-performance inter-process communication using shared memory on Linux/Windows. Copyright (c) 2018 mutouyun (http://orzz.org) diff --git a/README.md b/README.md old mode 100644 new mode 100755 index c02f186..0202103 --- a/README.md +++ b/README.md @@ -1,4 +1,4 @@ -# cpp-ipc - C++ IPC Library +# cpp-ipc(libipc) - C++ IPC Library [![MIT licensed](https://img.shields.io/badge/license-MIT-blue.svg)](https://github.com/mutouyun/cpp-ipc/blob/master/LICENSE) [![Build Status](https://travis-ci.org/mutouyun/cpp-ipc.svg?branch=master)](https://travis-ci.org/mutouyun/cpp-ipc) [![Build status](https://ci.appveyor.com/api/projects/status/github/mutouyun/cpp-ipc?branch=master&svg=true)](https://ci.appveyor.com/project/mutouyun/cpp-ipc) diff --git a/demo/chat/main.cpp b/demo/chat/main.cpp old mode 100644 new mode 100755 index 89ac956..53e1cbc --- a/demo/chat/main.cpp +++ b/demo/chat/main.cpp @@ -4,7 +4,7 @@ #include #include -#include "ipc.h" +#include "libipc/ipc.h" namespace { diff --git a/include/buffer.h b/include/libipc/buffer.h old mode 100644 new mode 100755 similarity index 96% rename from include/buffer.h rename to include/libipc/buffer.h index 363efb6..3f8c229 --- a/include/buffer.h +++ b/include/libipc/buffer.h @@ -5,8 +5,8 @@ #include #include -#include "export.h" -#include "def.h" +#include "libipc/export.h" +#include "libipc/def.h" namespace ipc { diff --git a/include/def.h b/include/libipc/def.h old mode 100644 new mode 100755 similarity index 100% rename from include/def.h rename to include/libipc/def.h diff --git a/include/export.h b/include/libipc/export.h old mode 100644 new mode 100755 similarity index 100% rename from include/export.h rename to include/libipc/export.h diff --git a/include/ipc.h b/include/libipc/ipc.h similarity index 94% rename from include/ipc.h rename to include/libipc/ipc.h index f72acef..44a7135 100755 --- a/include/ipc.h +++ b/include/libipc/ipc.h @@ -1,12 +1,12 @@ #pragma once -#include "export.h" -#include "def.h" -#include "buffer.h" -#include "shm.h" - #include +#include "libipc/export.h" +#include "libipc/def.h" +#include "libipc/buffer.h" +#include "libipc/shm.h" + namespace ipc { using handle_t = void*; diff --git a/include/pool_alloc.h b/include/libipc/pool_alloc.h similarity index 93% rename from include/pool_alloc.h rename to include/libipc/pool_alloc.h index 8097441..c6042c4 100755 --- a/include/pool_alloc.h +++ b/include/libipc/pool_alloc.h @@ -3,8 +3,8 @@ #include #include -#include "export.h" -#include "def.h" +#include "libipc/export.h" +#include "libipc/def.h" namespace ipc { namespace mem { diff --git a/include/rw_lock.h b/include/libipc/rw_lock.h similarity index 100% rename from include/rw_lock.h rename to include/libipc/rw_lock.h diff --git a/include/shm.h b/include/libipc/shm.h old mode 100644 new mode 100755 similarity index 92% rename from include/shm.h rename to include/libipc/shm.h index 8b73837..91a68e4 --- a/include/shm.h +++ b/include/libipc/shm.h @@ -2,7 +2,7 @@ #include -#include "export.h" +#include "libipc/export.h" namespace ipc { namespace shm { diff --git a/include/tls_pointer.h b/include/libipc/tls_pointer.h similarity index 88% rename from include/tls_pointer.h rename to include/libipc/tls_pointer.h index 41b0b6b..b6fd4e1 100755 --- a/include/tls_pointer.h +++ b/include/libipc/tls_pointer.h @@ -4,8 +4,7 @@ #include // std::forward #include // std::size_t -#include "export.h" -#include "platform/detail.h" +#include "libipc/export.h" namespace ipc { namespace tls { @@ -69,7 +68,7 @@ public: template T* create(P&&... params) { destruct(); - auto ptr = detail::unique_ptr(new T(std::forward

(params)...)); + std::unique_ptr ptr { new T(std::forward

(params)...) }; if (!tls::set(this, ptr.get())) { return nullptr; } @@ -80,7 +79,7 @@ public: T* create_once(P&&... params) { auto p = static_cast(tls::get(this)); if (p == nullptr) { - auto ptr = detail::unique_ptr(new T(std::forward

(params)...)); + std::unique_ptr ptr { new T(std::forward

(params)...) }; if (!tls::set(this, ptr.get())) { return nullptr; } diff --git a/include/waiter.h b/include/libipc/waiter.h old mode 100644 new mode 100755 similarity index 91% rename from include/waiter.h rename to include/libipc/waiter.h index 7627373..a4c3c09 --- a/include/waiter.h +++ b/include/libipc/waiter.h @@ -1,7 +1,7 @@ #pragma once -#include "export.h" -#include "def.h" +#include "libipc/export.h" +#include "libipc/def.h" namespace ipc { diff --git a/src/CMakeLists.txt b/src/CMakeLists.txt index 904dd94..2dccff1 100755 --- a/src/CMakeLists.txt +++ b/src/CMakeLists.txt @@ -11,12 +11,19 @@ include_directories( ${CMAKE_SOURCE_DIR}/src) if(UNIX) - file(GLOB SRC_FILES ${CMAKE_SOURCE_DIR}/src/platform/*_linux.cpp) + file(GLOB SRC_FILES ${CMAKE_SOURCE_DIR}/src/libipc/platform/*_linux.cpp) else() - file(GLOB SRC_FILES ${CMAKE_SOURCE_DIR}/src/platform/*_win.cpp) + file(GLOB SRC_FILES ${CMAKE_SOURCE_DIR}/src/libipc/platform/*_win.cpp) endif() aux_source_directory(${CMAKE_SOURCE_DIR}/src SRC_FILES) -file(GLOB HEAD_FILES ${CMAKE_SOURCE_DIR}/include/*.h ${CMAKE_SOURCE_DIR}/src/*.inc ${CMAKE_SOURCE_DIR}/src/memory/*.hpp) + +file(GLOB HEAD_FILES + ${CMAKE_SOURCE_DIR}/include/libipc/*.h + ${CMAKE_SOURCE_DIR}/src/libipc/*.inc + ${CMAKE_SOURCE_DIR}/src/libipc/circ/*.h + ${CMAKE_SOURCE_DIR}/src/libipc/memory/*.h + ${CMAKE_SOURCE_DIR}/src/libipc/platform/*.h + ${CMAKE_SOURCE_DIR}/src/libipc/utility/*.h) add_library(${PROJECT_NAME} SHARED ${SRC_FILES} ${HEAD_FILES}) if(NOT MSVC) diff --git a/src/buffer.cpp b/src/buffer.cpp old mode 100644 new mode 100755 index ce56bce..084b815 --- a/src/buffer.cpp +++ b/src/buffer.cpp @@ -1,5 +1,5 @@ -#include "buffer.h" -#include "pimpl.h" +#include "libipc/buffer.h" +#include "libipc/utility/pimpl.h" #include diff --git a/src/ipc.cpp b/src/ipc.cpp index 516c850..e24cf6a 100755 --- a/src/ipc.cpp +++ b/src/ipc.cpp @@ -1,4 +1,3 @@ -#include "ipc.h" #include #include @@ -10,22 +9,24 @@ #include #include -#include "def.h" -#include "shm.h" -#include "tls_pointer.h" -#include "pool_alloc.h" -#include "queue.h" -#include "policy.h" -#include "rw_lock.h" -#include "log.h" -#include "id_pool.h" +#include "libipc/ipc.h" +#include "libipc/def.h" +#include "libipc/shm.h" +#include "libipc/tls_pointer.h" +#include "libipc/pool_alloc.h" +#include "libipc/queue.h" +#include "libipc/policy.h" +#include "libipc/rw_lock.h" -#include "memory/resource.h" +#include "libipc/utility/log.h" +#include "libipc/utility/id_pool.h" -#include "platform/detail.h" -#include "platform/waiter_wrapper.h" +#include "libipc/memory/resource.h" -#include "circ/elem_array.h" +#include "libipc/platform/detail.h" +#include "libipc/platform/waiter_wrapper.h" + +#include "libipc/circ/elem_array.h" namespace { diff --git a/src/circ/elem_array.h b/src/libipc/circ/elem_array.h old mode 100644 new mode 100755 similarity index 90% rename from src/circ/elem_array.h rename to src/libipc/circ/elem_array.h index cbbf4da..43be3e4 --- a/src/circ/elem_array.h +++ b/src/libipc/circ/elem_array.h @@ -4,10 +4,10 @@ #include #include -#include "def.h" +#include "libipc/def.h" -#include "circ/elem_def.h" -#include "platform/detail.h" +#include "libipc/circ/elem_def.h" +#include "libipc/platform/detail.h" namespace ipc { namespace circ { diff --git a/src/circ/elem_def.h b/src/libipc/circ/elem_def.h old mode 100644 new mode 100755 similarity index 93% rename from src/circ/elem_def.h rename to src/libipc/circ/elem_def.h index 11e7afd..4b9feb8 --- a/src/circ/elem_def.h +++ b/src/libipc/circ/elem_def.h @@ -5,9 +5,9 @@ #include #include -#include "rw_lock.h" +#include "libipc/rw_lock.h" -#include "platform/detail.h" +#include "libipc/platform/detail.h" namespace ipc { namespace circ { diff --git a/src/memory/alloc.h b/src/libipc/memory/alloc.h similarity index 94% rename from src/memory/alloc.h rename to src/libipc/memory/alloc.h index f640b11..16bebc9 100755 --- a/src/memory/alloc.h +++ b/src/libipc/memory/alloc.h @@ -7,12 +7,12 @@ #include #include // assert -#include "def.h" -#include "rw_lock.h" -#include "concept.h" +#include "libipc/def.h" +#include "libipc/rw_lock.h" -#include "memory/allocator_wrapper.h" -#include "platform/detail.h" +#include "libipc/utility/concept.h" +#include "libipc/memory/allocator_wrapper.h" +#include "libipc/platform/detail.h" namespace ipc { namespace mem { diff --git a/src/memory/allocator_wrapper.h b/src/libipc/memory/allocator_wrapper.h similarity index 93% rename from src/memory/allocator_wrapper.h rename to src/libipc/memory/allocator_wrapper.h index 1635a21..d1c3ea3 100755 --- a/src/memory/allocator_wrapper.h +++ b/src/libipc/memory/allocator_wrapper.h @@ -3,7 +3,8 @@ #include // std::numeric_limits #include // std::forward #include -#include // ::new + +#include "libipc/pool_alloc.h" namespace ipc { namespace mem { @@ -86,11 +87,11 @@ public: template static void construct(pointer p, P && ... params) { - ::new (static_cast(p)) value_type(std::forward

(params) ...); + ipc::mem::construct(p, std::forward

(params)...); } static void destroy(pointer p) { - p->~value_type(); + ipc::mem::destruct(p); } }; diff --git a/src/memory/resource.h b/src/libipc/memory/resource.h similarity index 90% rename from src/memory/resource.h rename to src/libipc/memory/resource.h index 3efc285..e08d367 100755 --- a/src/memory/resource.h +++ b/src/libipc/memory/resource.h @@ -8,11 +8,11 @@ #include #include -#include "def.h" +#include "libipc/def.h" -#include "memory/alloc.h" -#include "memory/wrapper.h" -#include "platform/detail.h" +#include "libipc/memory/alloc.h" +#include "libipc/memory/wrapper.h" +#include "libipc/platform/detail.h" namespace ipc { namespace mem { diff --git a/src/memory/wrapper.h b/src/libipc/memory/wrapper.h similarity index 90% rename from src/memory/wrapper.h rename to src/libipc/memory/wrapper.h index 05f130d..5e76f88 100755 --- a/src/memory/wrapper.h +++ b/src/libipc/memory/wrapper.h @@ -8,15 +8,15 @@ #include #include // assert #include // std::aligned_storage_t -#include // ::new -#include "def.h" -#include "rw_lock.h" -#include "tls_pointer.h" -#include "concept.h" +#include "libipc/def.h" +#include "libipc/rw_lock.h" +#include "libipc/tls_pointer.h" +#include "libipc/pool_alloc.h" -#include "memory/alloc.h" -#include "platform/detail.h" +#include "libipc/utility/concept.h" +#include "libipc/memory/alloc.h" +#include "libipc/platform/detail.h" namespace ipc { namespace mem { @@ -230,7 +230,9 @@ struct default_mapping_policy { template IPC_CONSTEXPR_ static void foreach(F && f, P && ... params) { - for (std::size_t i = 0; i < classes_size; ++i) f(i, std::forward

(params)...); + for (std::size_t i = 0; i < classes_size; ++i) { + f(i, std::forward

(params)...); + } } IPC_CONSTEXPR_ static std::size_t block_size(std::size_t id) noexcept { @@ -240,7 +242,9 @@ struct default_mapping_policy { template IPC_CONSTEXPR_ static auto classify(F && f, D && d, std::size_t size, P && ... params) { std::size_t id = (size - base_size - 1) / iter_size; - return (id < classes_size) ? f(id, size, std::forward

(params)...) : d(size, std::forward

(params)...); + return (id < classes_size) ? + f(id, size, std::forward

(params)...) : + d(size, std::forward

(params)...); } }; @@ -256,13 +260,13 @@ class variable_wrapper { initiator() { MappingP::foreach([](std::size_t id, falc_t * a) { - ::new (&(a[id])) FixedAlloc(MappingP::block_size(id)); + ipc::mem::construct(&initiator::at(a, id), MappingP::block_size(id)); }, arr_); } ~initiator() { MappingP::foreach([](std::size_t id, falc_t * a) { - initiator::at(a, id).~FixedAlloc(); + ipc::mem::destruct(&initiator::at(a, id)); }, arr_); } diff --git a/src/platform/detail.h b/src/libipc/platform/detail.h similarity index 100% rename from src/platform/detail.h rename to src/libipc/platform/detail.h diff --git a/src/platform/get_sa.h b/src/libipc/platform/get_sa.h similarity index 100% rename from src/platform/get_sa.h rename to src/libipc/platform/get_sa.h diff --git a/src/platform/shm_linux.cpp b/src/libipc/platform/shm_linux.cpp old mode 100644 new mode 100755 similarity index 93% rename from src/platform/shm_linux.cpp rename to src/libipc/platform/shm_linux.cpp index 3229800..9b523d6 --- a/src/platform/shm_linux.cpp +++ b/src/libipc/platform/shm_linux.cpp @@ -1,4 +1,3 @@ -#include "shm.h" #include #include @@ -13,11 +12,12 @@ #include #include -#include "def.h" -#include "log.h" -#include "pool_alloc.h" +#include "libipc/shm.h" +#include "libipc/def.h" +#include "libipc/pool_alloc.h" -#include "memory/resource.h" +#include "libipc/utility/log.h" +#include "libipc/memory/resource.h" namespace { diff --git a/src/platform/shm_win.cpp b/src/libipc/platform/shm_win.cpp old mode 100644 new mode 100755 similarity index 90% rename from src/platform/shm_win.cpp rename to src/libipc/platform/shm_win.cpp index abe2249..389372d --- a/src/platform/shm_win.cpp +++ b/src/libipc/platform/shm_win.cpp @@ -1,17 +1,17 @@ -#include "shm.h" #include #include #include -#include "def.h" -#include "log.h" -#include "pool_alloc.h" +#include "libipc/shm.h" +#include "libipc/def.h" +#include "libipc/pool_alloc.h" -#include "platform/to_tchar.h" -#include "platform/get_sa.h" -#include "memory/resource.h" +#include "libipc/utility/log.h" +#include "libipc/platform/to_tchar.h" +#include "libipc/platform/get_sa.h" +#include "libipc/memory/resource.h" namespace { diff --git a/src/libipc/platform/tls_detail_win.h b/src/libipc/platform/tls_detail_win.h new file mode 100755 index 0000000..27b9f14 --- /dev/null +++ b/src/libipc/platform/tls_detail_win.h @@ -0,0 +1,41 @@ +#pragma once + +#include // std::unordered_map +#include // assert + +#include "libipc/tls_pointer.h" + +#include "libipc/utility/utility.h" + +namespace ipc { +namespace tls { + +inline void tls_destruct(key_info const * pkey, void * p) { + assert(pkey != nullptr); + auto destructor = horrible_cast(pkey->key_); + if (destructor != nullptr) destructor(p); +} + +struct tls_recs : public std::unordered_map { + ~tls_recs() { + for (auto & pair : *this) { + tls_destruct(pair.first, pair.second); + } + } +}; + +inline tls_recs * tls_get_recs() { + thread_local tls_recs * recs_ptr = nullptr; + if (recs_ptr == nullptr) { + recs_ptr = new tls_recs; + } + assert(recs_ptr != nullptr); + return recs_ptr; +} + +inline void at_thread_exit() { + delete tls_get_recs(); +} + +} // namespace tls +} // namespace ipc diff --git a/src/platform/tls_pointer_linux.h b/src/libipc/platform/tls_pointer_linux.h similarity index 90% rename from src/platform/tls_pointer_linux.h rename to src/libipc/platform/tls_pointer_linux.h index ffc61e7..21ab44b 100755 --- a/src/platform/tls_pointer_linux.h +++ b/src/libipc/platform/tls_pointer_linux.h @@ -1,12 +1,13 @@ -#include "tls_pointer.h" #include // pthread_... #include // std::atomic_thread_fence #include // assert -#include "log.h" -#include "utility.h" +#include "libipc/tls_pointer.h" + +#include "libipc/utility/log.h" +#include "libipc/utility/utility.h" namespace ipc { namespace tls { diff --git a/src/platform/tls_pointer_win.cpp b/src/libipc/platform/tls_pointer_win.cpp similarity index 94% rename from src/platform/tls_pointer_win.cpp rename to src/libipc/platform/tls_pointer_win.cpp index d252d06..cdbe208 100755 --- a/src/platform/tls_pointer_win.cpp +++ b/src/libipc/platform/tls_pointer_win.cpp @@ -1,8 +1,8 @@ -#include "tls_pointer.h" -#include "log.h" #include +#include "libipc/platform/tls_detail_win.h" + /** * @remarks * Windows doesn't support a per-thread destructor with its TLS primitives. @@ -19,8 +19,6 @@ namespace ipc { namespace tls { -void at_thread_exit(); - namespace { void NTAPI OnTlsCallback(PVOID, DWORD dwReason, PVOID) { diff --git a/src/libipc/platform/tls_pointer_win.h b/src/libipc/platform/tls_pointer_win.h new file mode 100755 index 0000000..2e9e5a7 --- /dev/null +++ b/src/libipc/platform/tls_pointer_win.h @@ -0,0 +1,46 @@ +#pragma once + +#include // std::atomic_thread_fence +#include // assert + +#include "libipc/tls_pointer.h" + +#include "libipc/platform/tls_detail_win.h" +#include "libipc/utility/utility.h" + +namespace ipc { +namespace tls { + +bool create(key_info * pkey, destructor_t destructor) { + assert(pkey != nullptr); + pkey->key_ = horrible_cast(destructor); + std::atomic_thread_fence(std::memory_order_seq_cst); + return true; +} + +void release(key_info const * pkey) { + assert(pkey != nullptr); + assert(tls_get_recs() != nullptr); + tls_get_recs()->erase(pkey); +} + +bool set(key_info const * pkey, void * ptr) { + assert(pkey != nullptr); + assert(tls_get_recs() != nullptr); + (*tls_get_recs())[pkey] = ptr; + return true; +} + +void * get(key_info const * pkey) { + assert(pkey != nullptr); + assert(tls_get_recs() != nullptr); + auto const recs = tls_get_recs(); + auto it = recs->find(pkey); + if (it == recs->end()) { + return nullptr; + } + return it->second; +} + +} // namespace tls +} // namespace ipc diff --git a/src/platform/to_tchar.h b/src/libipc/platform/to_tchar.h old mode 100644 new mode 100755 similarity index 91% rename from src/platform/to_tchar.h rename to src/libipc/platform/to_tchar.h index 09d1f80..df67b2d --- a/src/platform/to_tchar.h +++ b/src/libipc/platform/to_tchar.h @@ -8,10 +8,9 @@ #include #include -#include "concept.h" - -#include "platform/detail.h" -#include "memory/resource.h" +#include "libipc/utility/concept.h" +#include "libipc/platform/detail.h" +#include "libipc/memory/resource.h" namespace ipc { namespace detail { diff --git a/src/platform/waiter_linux.h b/src/libipc/platform/waiter_linux.h old mode 100644 new mode 100755 similarity index 95% rename from src/platform/waiter_linux.h rename to src/libipc/platform/waiter_linux.h index f65045c..f118478 --- a/src/platform/waiter_linux.h +++ b/src/libipc/platform/waiter_linux.h @@ -10,11 +10,11 @@ #include #include -#include "def.h" -#include "log.h" +#include "libipc/def.h" -#include "platform/detail.h" -#include "memory/resource.h" +#include "libipc/utility/log.h" +#include "libipc/platform/detail.h" +#include "libipc/memory/resource.h" namespace ipc { namespace detail { diff --git a/src/platform/waiter_win.h b/src/libipc/platform/waiter_win.h old mode 100644 new mode 100755 similarity index 91% rename from src/platform/waiter_win.h rename to src/libipc/platform/waiter_win.h index 9e51fa3..ca1f86e --- a/src/platform/waiter_win.h +++ b/src/libipc/platform/waiter_win.h @@ -5,15 +5,15 @@ #include #include -#include "rw_lock.h" -#include "pool_alloc.h" -#include "log.h" -#include "shm.h" +#include "libipc/rw_lock.h" +#include "libipc/pool_alloc.h" +#include "libipc/shm.h" -#include "platform/to_tchar.h" -#include "platform/get_sa.h" -#include "platform/detail.h" -#include "memory/resource.h" +#include "libipc/utility/log.h" +#include "libipc/platform/to_tchar.h" +#include "libipc/platform/get_sa.h" +#include "libipc/platform/detail.h" +#include "libipc/memory/resource.h" namespace ipc { namespace detail { diff --git a/src/platform/waiter_wrapper.h b/src/libipc/platform/waiter_wrapper.h old mode 100644 new mode 100755 similarity index 93% rename from src/platform/waiter_wrapper.h rename to src/libipc/platform/waiter_wrapper.h index acabb6f..4638c84 --- a/src/platform/waiter_wrapper.h +++ b/src/libipc/platform/waiter_wrapper.h @@ -4,15 +4,15 @@ #include #include -#include "shm.h" +#include "libipc/shm.h" -#include "memory/resource.h" -#include "platform/detail.h" +#include "libipc/memory/resource.h" +#include "libipc/platform/detail.h" #if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || \ defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || \ defined(WINCE) || defined(_WIN32_WCE) -#include "platform/waiter_win.h" +#include "libipc/platform/waiter_win.h" namespace ipc { namespace detail { @@ -58,7 +58,7 @@ public: #else /*!WIN*/ -#include "platform/waiter_linux.h" +#include "libipc/platform/waiter_linux.h" namespace ipc { namespace detail { diff --git a/src/policy.h b/src/libipc/policy.h old mode 100644 new mode 100755 similarity index 78% rename from src/policy.h rename to src/libipc/policy.h index 2a20afe..d2ad313 --- a/src/policy.h +++ b/src/libipc/policy.h @@ -2,10 +2,10 @@ #include -#include "def.h" -#include "prod_cons.h" +#include "libipc/def.h" +#include "libipc/prod_cons.h" -#include "circ/elem_array.h" +#include "libipc/circ/elem_array.h" namespace ipc { namespace policy { diff --git a/src/prod_cons.h b/src/libipc/prod_cons.h similarity index 96% rename from src/prod_cons.h rename to src/libipc/prod_cons.h index 8b9396a..c3f12e9 100755 --- a/src/prod_cons.h +++ b/src/libipc/prod_cons.h @@ -5,11 +5,12 @@ #include #include -#include "def.h" -#include "platform/detail.h" -#include "circ/elem_def.h" -#include "log.h" -#include "utility.h" +#include "libipc/def.h" + +#include "libipc/platform/detail.h" +#include "libipc/circ/elem_def.h" +#include "libipc/utility/log.h" +#include "libipc/utility/utility.h" namespace ipc { diff --git a/src/queue.h b/src/libipc/queue.h similarity index 92% rename from src/queue.h rename to src/libipc/queue.h index b0e7700..2fd87ed 100755 --- a/src/queue.h +++ b/src/libipc/queue.h @@ -11,13 +11,13 @@ #include #include // assert -#include "def.h" -#include "shm.h" -#include "log.h" -#include "rw_lock.h" +#include "libipc/def.h" +#include "libipc/shm.h" +#include "libipc/rw_lock.h" -#include "platform/detail.h" -#include "circ/elem_def.h" +#include "libipc/utility/log.h" +#include "libipc/platform/detail.h" +#include "libipc/circ/elem_def.h" namespace ipc { namespace detail { diff --git a/src/concept.h b/src/libipc/utility/concept.h similarity index 100% rename from src/concept.h rename to src/libipc/utility/concept.h diff --git a/src/id_pool.h b/src/libipc/utility/id_pool.h old mode 100644 new mode 100755 similarity index 97% rename from src/id_pool.h rename to src/libipc/utility/id_pool.h index 59e8b2c..7207aa9 --- a/src/id_pool.h +++ b/src/libipc/utility/id_pool.h @@ -3,9 +3,9 @@ #include // std::aligned_storage_t #include // std::memcmp -#include "def.h" +#include "libipc/def.h" -#include "platform/detail.h" +#include "libipc/platform/detail.h" namespace ipc { diff --git a/src/log.h b/src/libipc/utility/log.h old mode 100644 new mode 100755 similarity index 100% rename from src/log.h rename to src/libipc/utility/log.h diff --git a/src/pimpl.h b/src/libipc/utility/pimpl.h old mode 100644 new mode 100755 similarity index 92% rename from src/pimpl.h rename to src/libipc/utility/pimpl.h index 4cbf0a6..25074e7 --- a/src/pimpl.h +++ b/src/libipc/utility/pimpl.h @@ -3,8 +3,8 @@ #include #include -#include "concept.h" -#include "pool_alloc.h" +#include "libipc/utility/concept.h" +#include "libipc/pool_alloc.h" namespace ipc { diff --git a/src/utility.h b/src/libipc/utility/utility.h similarity index 95% rename from src/utility.h rename to src/libipc/utility/utility.h index bd3a6b8..4568d95 100755 --- a/src/utility.h +++ b/src/libipc/utility/utility.h @@ -4,7 +4,7 @@ #include // std::size_t #include // std::hardware_destructive_interference_size -#include "platform/detail.h" +#include "libipc/platform/detail.h" namespace ipc { diff --git a/src/waiter_template.inc b/src/libipc/waiter_template.inc old mode 100644 new mode 100755 similarity index 100% rename from src/waiter_template.inc rename to src/libipc/waiter_template.inc diff --git a/src/platform/tls_pointer_win.h b/src/platform/tls_pointer_win.h deleted file mode 100755 index 2387042..0000000 --- a/src/platform/tls_pointer_win.h +++ /dev/null @@ -1,76 +0,0 @@ -#pragma once - -#include // std::unordered_map -#include // std::atomic_thread_fence -#include // assert - -#include "log.h" -#include "utility.h" - -namespace ipc { -namespace tls { - -namespace { - -inline void tls_destruct(key_info const * pkey, void * p) { - assert(pkey != nullptr); - auto destructor = horrible_cast(pkey->key_); - if (destructor != nullptr) destructor(p); -} - -struct tls_recs : public std::unordered_map { - ~tls_recs() { - for (auto & pair : *this) { - tls_destruct(pair.first, pair.second); - } - } -}; - -inline tls_recs * tls_get_recs() { - thread_local tls_recs * recs_ptr = nullptr; - if (recs_ptr == nullptr) { - recs_ptr = new tls_recs; - } - assert(recs_ptr != nullptr); - return recs_ptr; -} - -} // internal-linkage - -void at_thread_exit() { - delete tls_get_recs(); -} - -bool create(key_info * pkey, destructor_t destructor) { - assert(pkey != nullptr); - pkey->key_ = horrible_cast(destructor); - std::atomic_thread_fence(std::memory_order_seq_cst); - return true; -} - -void release(key_info const * pkey) { - assert(pkey != nullptr); - assert(tls_get_recs() != nullptr); - tls_get_recs()->erase(pkey); -} - -bool set(key_info const * pkey, void * ptr) { - assert(pkey != nullptr); - assert(tls_get_recs() != nullptr); - (*tls_get_recs())[pkey] = ptr; - return true; -} - -void * get(key_info const * pkey) { - assert(pkey != nullptr); - assert(tls_get_recs() != nullptr); - auto const recs = tls_get_recs(); - auto it = recs->find(pkey); - if (it == recs->end()) { - return nullptr; - } - return it->second; -} - -} // namespace tls -} // namespace ipc diff --git a/src/pool_alloc.cpp b/src/pool_alloc.cpp index 3e8bc10..d19a13c 100755 --- a/src/pool_alloc.cpp +++ b/src/pool_alloc.cpp @@ -1,6 +1,6 @@ -#include "pool_alloc.h" +#include "libipc/pool_alloc.h" -#include "memory/resource.h" +#include "libipc/memory/resource.h" namespace ipc { namespace mem { diff --git a/src/shm.cpp b/src/shm.cpp old mode 100644 new mode 100755 index c89c98e..a2eed93 --- a/src/shm.cpp +++ b/src/shm.cpp @@ -1,10 +1,11 @@ -#include "shm.h" #include #include -#include "pimpl.h" -#include "memory/resource.h" +#include "libipc/shm.h" + +#include "libipc/utility/pimpl.h" +#include "libipc/memory/resource.h" namespace ipc { namespace shm { diff --git a/src/tls_pointer.cpp b/src/tls_pointer.cpp index 9fd9f2f..dcfba88 100755 --- a/src/tls_pointer.cpp +++ b/src/tls_pointer.cpp @@ -1,9 +1,8 @@ -#include "tls_pointer.h" #if defined(WIN64) || defined(_WIN64) || defined(__WIN64__) || \ defined(WIN32) || defined(_WIN32) || defined(__WIN32__) || defined(__NT__) || \ defined(WINCE) || defined(_WIN32_WCE) -#include "platform/tls_pointer_win.h" +#include "libipc/platform/tls_pointer_win.h" #else /*!WIN*/ -#include "platform/tls_pointer_linux.h" +#include "libipc/platform/tls_pointer_linux.h" #endif/*!WIN*/ diff --git a/src/waiter.cpp b/src/waiter.cpp old mode 100644 new mode 100755 index d6e1453..24a1382 --- a/src/waiter.cpp +++ b/src/waiter.cpp @@ -1,9 +1,10 @@ -#include "waiter.h" #include -#include "pimpl.h" -#include "platform/waiter_wrapper.h" +#include "libipc/waiter.h" + +#include "libipc/utility/pimpl.h" +#include "libipc/platform/waiter_wrapper.h" #undef IPC_PP_CAT_ #undef IPC_PP_JOIN_T__ @@ -23,7 +24,7 @@ namespace ipc { #define IPC_OBJECT_TYPE_OPEN_PARS_ #define IPC_OBJECT_TYPE_OPEN_ARGS_ -#include "waiter_template.inc" +#include "libipc/waiter_template.inc" bool mutex::lock() { return impl(p_)->h_.lock(); @@ -41,7 +42,7 @@ bool mutex::unlock() { #define IPC_OBJECT_TYPE_OPEN_PARS_ , long count #define IPC_OBJECT_TYPE_OPEN_ARGS_ , count -#include "waiter_template.inc" +#include "libipc/waiter_template.inc" bool semaphore::wait(std::size_t tm) { return impl(p_)->h_.wait(tm); @@ -59,7 +60,7 @@ bool semaphore::post(long count) { #define IPC_OBJECT_TYPE_OPEN_PARS_ #define IPC_OBJECT_TYPE_OPEN_ARGS_ -#include "waiter_template.inc" +#include "libipc/waiter_template.inc" bool condition::wait(mutex& mtx, std::size_t tm) { return impl(p_)->h_.wait(impl(mtx.p_)->h_, tm); diff --git a/test/test_ipc.cpp b/test/test_ipc.cpp index 2646725..6221802 100755 --- a/test/test_ipc.cpp +++ b/test/test_ipc.cpp @@ -3,9 +3,9 @@ #include #include -#include "ipc.h" -#include "buffer.h" -#include "memory/resource.h" +#include "libipc/ipc.h" +#include "libipc/buffer.h" +#include "libipc/memory/resource.h" #include "test.h" #include "thread_pool.h" diff --git a/test/test_mem.cpp b/test/test_mem.cpp index 77156b2..16a5ad1 100755 --- a/test/test_mem.cpp +++ b/test/test_mem.cpp @@ -6,8 +6,8 @@ #include "capo/random.hpp" -#include "memory/resource.h" -#include "pool_alloc.h" +#include "libipc/memory/resource.h" +#include "libipc/pool_alloc.h" // #include "gperftools/tcmalloc.h" diff --git a/test/test_queue.cpp b/test/test_queue.cpp index 93decb0..c10d3c9 100755 --- a/test/test_queue.cpp +++ b/test/test_queue.cpp @@ -6,10 +6,10 @@ #include #include -#include "prod_cons.h" -#include "policy.h" -#include "circ/elem_array.h" -#include "queue.h" +#include "libipc/prod_cons.h" +#include "libipc/policy.h" +#include "libipc/circ/elem_array.h" +#include "libipc/queue.h" #include "test.h" diff --git a/test/test_shm.cpp b/test/test_shm.cpp index 67a224a..3272dcc 100755 --- a/test/test_shm.cpp +++ b/test/test_shm.cpp @@ -2,7 +2,7 @@ #include #include -#include "shm.h" +#include "libipc/shm.h" #include "test.h" using namespace ipc::shm; diff --git a/test/test_thread_utility.cpp b/test/test_thread_utility.cpp index abda198..e0b0512 100755 --- a/test/test_thread_utility.cpp +++ b/test/test_thread_utility.cpp @@ -10,8 +10,8 @@ #include "capo/spin_lock.hpp" #include "capo/type_name.hpp" -#include "rw_lock.h" -#include "tls_pointer.h" +#include "libipc/rw_lock.h" +#include "libipc/tls_pointer.h" #include "test.h" #include "thread_pool.h" diff --git a/test/test_waiter.cpp b/test/test_waiter.cpp index 2486736..8230ed5 100755 --- a/test/test_waiter.cpp +++ b/test/test_waiter.cpp @@ -1,7 +1,7 @@ #include #include -#include "platform/waiter_wrapper.h" +#include "libipc/platform/waiter_wrapper.h" #include "test.h" namespace {