don't use std::function

This commit is contained in:
zhangyi 2019-06-18 23:42:34 +08:00
parent a2d918dec2
commit cf0028bf09
3 changed files with 23 additions and 29 deletions

View File

@ -4,7 +4,6 @@
#include <tuple> #include <tuple>
#include <vector> #include <vector>
#include <type_traits> #include <type_traits>
#include <functional>
#include "export.h" #include "export.h"
#include "def.h" #include "def.h"
@ -15,14 +14,10 @@ class IPC_EXPORT buffer {
public: public:
using destructor_t = void (*)(void*, std::size_t); using destructor_t = void (*)(void*, std::size_t);
enum class use {
functor
};
buffer(); buffer();
buffer(void* p, std::size_t s, destructor_t d); buffer(void* p, std::size_t s, destructor_t d);
buffer(void* p, std::size_t s, std::function<void(void*, std::size_t)> d, use); buffer(void* p, std::size_t s, destructor_t d, void* additional);
buffer(void* p, std::size_t s); buffer(void* p, std::size_t s);
template <std::size_t N> template <std::size_t N>

View File

@ -13,28 +13,29 @@ class buffer::buffer_ : public pimpl<buffer_> {
public: public:
void* p_; void* p_;
std::size_t s_; std::size_t s_;
std::function<void(void*, std::size_t)> d_; void* a_;
buffer::destructor_t d_;
buffer_(void* p, std::size_t s, std::function<void(void*, std::size_t)> d) buffer_(void* p, std::size_t s, buffer::destructor_t d, void* a)
: p_(p), s_(s), d_(std::move(d)) { : p_(p), s_(s), a_(a), d_(d) {
} }
~buffer_() { ~buffer_() {
if (!d_) return; if (d_ == nullptr) return;
d_(p_, s_); d_((a_ == nullptr) ? p_ : a_, s_);
} }
}; };
buffer::buffer() buffer::buffer()
: buffer(nullptr, 0, nullptr) { : buffer(nullptr, 0, nullptr, nullptr) {
} }
buffer::buffer(void* p, std::size_t s, destructor_t d) 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<void(void*, std::size_t)> d, use) buffer::buffer(void* p, std::size_t s, destructor_t d, void* additional)
: p_(p_->make(p, s, std::move(d))) { : p_(p_->make(p, s, d, additional)) {
} }
buffer::buffer(void* p, std::size_t s) 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::buffer(char const & c)
: buffer(const_cast<char*>(&c), 1, nullptr) { : buffer(const_cast<char*>(&c), 1) {
} }
buffer::buffer(buffer&& rhs) buffer::buffer(buffer&& rhs)

View File

@ -49,14 +49,12 @@ struct msg_t {
msg_t() = default; msg_t() = default;
msg_t(msg_id_t c, msg_id_t i, int r, void const * d, std::size_t s) msg_t(msg_id_t c, msg_id_t i, int r, void const * d, std::size_t s)
: head_ { c, i, r, false } { : head_ { c, i, r, false } {
if ((d != nullptr) && (s > 0)) { if (d != nullptr) {
std::memcpy(&data_, d, s); if (s == 0) {
} head_.storage_ = true;
else { s = sizeof(msg_id_t);
head_.storage_ = true;
if (d != nullptr) {
std::memcpy(&data_, d, sizeof(msg_id_t));
} }
std::memcpy(&data_, d, s);
} }
} }
}; };
@ -380,9 +378,9 @@ static buff_t recv(ipc::handle_t h, std::size_t tm) {
std::size_t dat_sz = 0; std::size_t dat_sz = 0;
void * buf = shm::get_mem(dat, &dat_sz); void * buf = shm::get_mem(dat, &dat_sz);
if (buf != nullptr && remain <= dat_sz) { if (buf != nullptr && remain <= dat_sz) {
return buff_t { buf, remain, [dat](void *, std::size_t) { return buff_t { buf, remain, [](void * p, std::size_t) {
shm::release(dat); shm::release(p);
}, buff_t::use::functor }; }, dat };
} }
else ipc::log("fail: shm::handle for big message. msg_id: %zd, size: %zd, shm.size: %zd\n", else ipc::log("fail: shm::handle for big message. msg_id: %zd, size: %zd, shm.size: %zd\n",
msg.head_.id_, remain, dat_sz); msg.head_.id_, remain, dat_sz);