From cf0028bf094616e090157448920c57dfd5dea242 Mon Sep 17 00:00:00 2001 From: zhangyi Date: Tue, 18 Jun 2019 23:42:34 +0800 Subject: [PATCH] don't use std::function --- include/buffer.h | 7 +------ src/buffer.cpp | 21 +++++++++++---------- src/ipc.cpp | 24 +++++++++++------------- 3 files changed, 23 insertions(+), 29 deletions(-) diff --git a/include/buffer.h b/include/buffer.h index 4895a72..719c1fd 100644 --- a/include/buffer.h +++ b/include/buffer.h @@ -4,7 +4,6 @@ #include #include #include -#include #include "export.h" #include "def.h" @@ -15,14 +14,10 @@ class IPC_EXPORT buffer { public: using destructor_t = void (*)(void*, std::size_t); - enum class use { - functor - }; - buffer(); buffer(void* p, std::size_t s, destructor_t d); - buffer(void* p, std::size_t s, std::function d, use); + buffer(void* p, std::size_t s, destructor_t d, void* additional); buffer(void* p, std::size_t s); template diff --git a/src/buffer.cpp b/src/buffer.cpp index 1ed36f9..6607146 100644 --- a/src/buffer.cpp +++ b/src/buffer.cpp @@ -13,28 +13,29 @@ class buffer::buffer_ : public pimpl { public: void* p_; std::size_t s_; - std::function d_; + void* a_; + buffer::destructor_t d_; - buffer_(void* p, std::size_t s, std::function d) - : p_(p), s_(s), d_(std::move(d)) { + buffer_(void* p, std::size_t s, buffer::destructor_t d, void* a) + : p_(p), s_(s), a_(a), d_(d) { } ~buffer_() { - if (!d_) return; - d_(p_, s_); + if (d_ == nullptr) return; + d_((a_ == nullptr) ? p_ : a_, s_); } }; buffer::buffer() - : buffer(nullptr, 0, nullptr) { + : buffer(nullptr, 0, nullptr, nullptr) { } buffer::buffer(void* p, std::size_t s, destructor_t d) - : p_(p_->make(p, s, d)) { + : p_(p_->make(p, s, d, nullptr)) { } -buffer::buffer(void* p, std::size_t s, std::function d, use) - : p_(p_->make(p, s, std::move(d))) { +buffer::buffer(void* p, std::size_t s, destructor_t d, void* additional) + : p_(p_->make(p, s, d, additional)) { } buffer::buffer(void* p, std::size_t s) @@ -42,7 +43,7 @@ buffer::buffer(void* p, std::size_t s) } buffer::buffer(char const & c) - : buffer(const_cast(&c), 1, nullptr) { + : buffer(const_cast(&c), 1) { } buffer::buffer(buffer&& rhs) diff --git a/src/ipc.cpp b/src/ipc.cpp index 594d02b..8e2524f 100644 --- a/src/ipc.cpp +++ b/src/ipc.cpp @@ -49,14 +49,12 @@ struct msg_t { msg_t() = default; msg_t(msg_id_t c, msg_id_t i, int r, void const * d, std::size_t s) : head_ { c, i, r, false } { - if ((d != nullptr) && (s > 0)) { - std::memcpy(&data_, d, s); - } - else { - head_.storage_ = true; - if (d != nullptr) { - std::memcpy(&data_, d, sizeof(msg_id_t)); + if (d != nullptr) { + if (s == 0) { + head_.storage_ = true; + s = sizeof(msg_id_t); } + std::memcpy(&data_, d, s); } } }; @@ -187,19 +185,19 @@ bool wait_for(W& waiter, F&& pred, std::size_t tm) { return true; } -template struct queue_generator { using queue_t = ipc::queue, Policy>; - + struct conn_info_t : conn_info_head { queue_t que_; conn_info_t(char const * name) : conn_info_head(name) - , que_(("__QU_CONN__" + + , que_(("__QU_CONN__" + ipc::to_string(DataSize) + "__" + ipc::to_string(AlignSize) + "__" + name).c_str()) { } @@ -380,9 +378,9 @@ static buff_t recv(ipc::handle_t h, std::size_t tm) { std::size_t dat_sz = 0; void * buf = shm::get_mem(dat, &dat_sz); if (buf != nullptr && remain <= dat_sz) { - return buff_t { buf, remain, [dat](void *, std::size_t) { - shm::release(dat); - }, buff_t::use::functor }; + return buff_t { buf, remain, [](void * p, std::size_t) { + shm::release(p); + }, dat }; } else ipc::log("fail: shm::handle for big message. msg_id: %zd, size: %zd, shm.size: %zd\n", msg.head_.id_, remain, dat_sz);