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 <vector>
#include <type_traits>
#include <functional>
#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<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);
template <std::size_t N>

View File

@ -13,28 +13,29 @@ class buffer::buffer_ : public pimpl<buffer_> {
public:
void* p_;
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)
: 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<void(void*, std::size_t)> 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<char*>(&c), 1, nullptr) {
: buffer(const_cast<char*>(&c), 1) {
}
buffer::buffer(buffer&& rhs)

View File

@ -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 <typename Policy,
template <typename Policy,
std::size_t DataSize = data_length,
std::size_t AlignSize = (ipc::detail::min)(DataSize, alignof(std::max_align_t))>
struct queue_generator {
using queue_t = ipc::queue<msg_t<DataSize, AlignSize>, 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);