diff --git a/build/ipc.pro b/build/ipc.pro index 6d71589..cad56ce 100644 --- a/build/ipc.pro +++ b/build/ipc.pro @@ -30,6 +30,7 @@ HEADERS += \ ../src/memory/alloc.hpp \ ../src/memory/wrapper.hpp \ ../src/memory/resource.hpp \ + ../src/platform/detail.h \ ../src/platform/waiter.h SOURCES += \ diff --git a/include/rw_lock.h b/include/rw_lock.h index 19b9906..f75690f 100644 --- a/include/rw_lock.h +++ b/include/rw_lock.h @@ -100,13 +100,13 @@ class spin_lock { std::atomic lc_ { 0 }; public: - void lock(void) { + void lock(void) noexcept { for (unsigned k = 0; lc_.exchange(1, std::memory_order_acquire); yield(k)) ; } - void unlock(void) { + void unlock(void) noexcept { lc_.store(0, std::memory_order_release); } }; diff --git a/src/memory/alloc.hpp b/src/memory/alloc.hpp index 4fb4d35..957f341 100644 --- a/src/memory/alloc.hpp +++ b/src/memory/alloc.hpp @@ -2,9 +2,15 @@ #include #include +#include +#include +#include #include #include "def.h" +#include "rw_lock.h" + +#include "platform/detail.h" namespace ipc { namespace mem { @@ -100,14 +106,41 @@ public: namespace detail { +template +class non_atomic { + T val_; + +public: + void store(T val, std::memory_order) noexcept { + val_ = val; + } + + T load(std::memory_order) const noexcept { + return val_; + } + + bool compare_exchange_weak(T&, T val, std::memory_order) noexcept { + // always return true + val_ = val; + return true; + } +}; + +class non_lock { +public: + void lock (void) noexcept {} + void unlock(void) noexcept {} +}; + +template