mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-07 01:06:45 +08:00
fix bugs; simplify codes
This commit is contained in:
parent
60d1a6d00c
commit
cfd175dbdc
@ -3,6 +3,7 @@
|
||||
#include <cstddef>
|
||||
#include <tuple>
|
||||
#include <vector>
|
||||
#include <type_traits>
|
||||
|
||||
#include "export.h"
|
||||
#include "def.h"
|
||||
@ -35,6 +36,16 @@ public:
|
||||
void * data() noexcept;
|
||||
void const * data() const noexcept;
|
||||
|
||||
template <typename T>
|
||||
auto data() noexcept -> std::enable_if_t<!std::is_const_v<T>, T*> {
|
||||
return static_cast<T*>(data());
|
||||
}
|
||||
|
||||
template <typename T>
|
||||
auto data() const noexcept -> std::enable_if_t<std::is_const_v<T>, T*> {
|
||||
return static_cast<T*>(data());
|
||||
}
|
||||
|
||||
std::size_t size() const noexcept;
|
||||
|
||||
std::tuple<void*, std::size_t> to_tuple() {
|
||||
|
||||
@ -99,27 +99,19 @@ public:
|
||||
});
|
||||
}
|
||||
|
||||
static auto pop(queue* que) noexcept {
|
||||
std::tuple<queue*, T> ret;
|
||||
if (que == nullptr) {
|
||||
return ret;
|
||||
T pop() noexcept {
|
||||
if (elems_ == nullptr) {
|
||||
return {};
|
||||
}
|
||||
if (que->elems_ == nullptr) {
|
||||
return ret;
|
||||
}
|
||||
for (unsigned k = 0; que->elems_->cursor() == que->cursor_;) {
|
||||
T item;
|
||||
for (unsigned k = 0;;) {
|
||||
if (elems_->pop(cursor_, [&item](void* p) {
|
||||
::new (&item) T(std::move(*static_cast<T*>(p)));
|
||||
})) {
|
||||
return item;
|
||||
}
|
||||
ipc::sleep(k);
|
||||
}
|
||||
if (!que->elems_->pop(que->cursor_, [&ret](void* p) {
|
||||
::new (&std::get<1>(ret)) T(std::move(*static_cast<T*>(p)));
|
||||
})) {
|
||||
return ret;
|
||||
}
|
||||
return ret;
|
||||
}
|
||||
|
||||
T pop() noexcept {
|
||||
return std::get<1>(pop(this));
|
||||
}
|
||||
};
|
||||
|
||||
|
||||
@ -183,10 +183,9 @@ static buff_t recv(handle_t h) {
|
||||
auto& rc = recv_cache();
|
||||
while (1) {
|
||||
// pop a new message
|
||||
auto tp = que->pop(que);
|
||||
auto& msg = std::get<1>(tp);
|
||||
if (msg.que_ == std::get<0>(tp)) return {};
|
||||
auto msg = que->pop();
|
||||
if (msg.id_ == 0) return {};
|
||||
if (msg.que_ == que) continue; // pop next
|
||||
// msg.remain_ may minus & abs(msg.remain_) < data_length
|
||||
std::size_t remain = static_cast<std::size_t>(
|
||||
static_cast<int>(data_length) + msg.remain_);
|
||||
|
||||
@ -30,6 +30,7 @@ std::vector<ipc::buff_t> datas__;
|
||||
constexpr int DataMin = 2;
|
||||
constexpr int DataMax = 256;
|
||||
constexpr int LoopCount = 100000;
|
||||
//constexpr int LoopCount = 10000;
|
||||
|
||||
} // internal-linkage
|
||||
|
||||
@ -439,10 +440,11 @@ void Unit::test_channel_rtt() {
|
||||
for (std::size_t i = 0;; ++i) {
|
||||
auto dd = cc.recv();
|
||||
if (dd.size() < 2) return;
|
||||
// std::cout << "recving: " << i << "-[" << dd.size() << "]" << std::endl;
|
||||
//std::cout << "recving: " << i << "-[" << dd.size() << "]" << std::endl;
|
||||
while (!cc.send(ipc::buff_t('a'))) {
|
||||
cc.wait_for_recv(1);
|
||||
}
|
||||
//std::cout << "sent ack." << std::endl;
|
||||
}
|
||||
}};
|
||||
|
||||
@ -451,12 +453,13 @@ void Unit::test_channel_rtt() {
|
||||
cc.wait_for_recv(1);
|
||||
sw.start();
|
||||
for (std::size_t i = 0; i < LoopCount; ++i) {
|
||||
// std::cout << "sending: " << i << "-[" << datas__[i].size() << "]" << std::endl;
|
||||
//std::cout << "sending: " << i << "-[" << datas__[i].size() << "]" << std::endl;
|
||||
cc.send(datas__[i]);
|
||||
/*auto dd = */cc.recv();
|
||||
// if (dd.size() != 1 || dd[0] != 'a') {
|
||||
// QVERIFY(false);
|
||||
// }
|
||||
//if (dd.size() != 1 || dd.data<char>()[0] != 'a') {
|
||||
// std::cout << "recv ack fail: " << i << "-[" << dd.size() << "]" << std::endl;
|
||||
// QVERIFY(false);
|
||||
//}
|
||||
}
|
||||
cc.send(ipc::buff_t('\0'));
|
||||
t1.join();
|
||||
|
||||
Loading…
x
Reference in New Issue
Block a user