mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-07 01:06:45 +08:00
don't use std::function
This commit is contained in:
parent
a2d918dec2
commit
cf0028bf09
@ -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>
|
||||
|
||||
@ -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)
|
||||
|
||||
24
src/ipc.cpp
24
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 <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);
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user