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 <cstddef>
|
||||||
#include <tuple>
|
#include <tuple>
|
||||||
#include <vector>
|
#include <vector>
|
||||||
|
#include <type_traits>
|
||||||
|
|
||||||
#include "export.h"
|
#include "export.h"
|
||||||
#include "def.h"
|
#include "def.h"
|
||||||
@ -35,6 +36,16 @@ public:
|
|||||||
void * data() noexcept;
|
void * data() noexcept;
|
||||||
void const * data() const 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::size_t size() const noexcept;
|
||||||
|
|
||||||
std::tuple<void*, std::size_t> to_tuple() {
|
std::tuple<void*, std::size_t> to_tuple() {
|
||||||
|
|||||||
@ -99,27 +99,19 @@ public:
|
|||||||
});
|
});
|
||||||
}
|
}
|
||||||
|
|
||||||
static auto pop(queue* que) noexcept {
|
T pop() noexcept {
|
||||||
std::tuple<queue*, T> ret;
|
if (elems_ == nullptr) {
|
||||||
if (que == nullptr) {
|
return {};
|
||||||
return ret;
|
|
||||||
}
|
}
|
||||||
if (que->elems_ == nullptr) {
|
T item;
|
||||||
return ret;
|
for (unsigned k = 0;;) {
|
||||||
|
if (elems_->pop(cursor_, [&item](void* p) {
|
||||||
|
::new (&item) T(std::move(*static_cast<T*>(p)));
|
||||||
|
})) {
|
||||||
|
return item;
|
||||||
}
|
}
|
||||||
for (unsigned k = 0; que->elems_->cursor() == que->cursor_;) {
|
|
||||||
ipc::sleep(k);
|
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();
|
auto& rc = recv_cache();
|
||||||
while (1) {
|
while (1) {
|
||||||
// pop a new message
|
// pop a new message
|
||||||
auto tp = que->pop(que);
|
auto msg = que->pop();
|
||||||
auto& msg = std::get<1>(tp);
|
|
||||||
if (msg.que_ == std::get<0>(tp)) return {};
|
|
||||||
if (msg.id_ == 0) return {};
|
if (msg.id_ == 0) return {};
|
||||||
|
if (msg.que_ == que) continue; // pop next
|
||||||
// msg.remain_ may minus & abs(msg.remain_) < data_length
|
// msg.remain_ may minus & abs(msg.remain_) < data_length
|
||||||
std::size_t remain = static_cast<std::size_t>(
|
std::size_t remain = static_cast<std::size_t>(
|
||||||
static_cast<int>(data_length) + msg.remain_);
|
static_cast<int>(data_length) + msg.remain_);
|
||||||
|
|||||||
@ -30,6 +30,7 @@ std::vector<ipc::buff_t> datas__;
|
|||||||
constexpr int DataMin = 2;
|
constexpr int DataMin = 2;
|
||||||
constexpr int DataMax = 256;
|
constexpr int DataMax = 256;
|
||||||
constexpr int LoopCount = 100000;
|
constexpr int LoopCount = 100000;
|
||||||
|
//constexpr int LoopCount = 10000;
|
||||||
|
|
||||||
} // internal-linkage
|
} // internal-linkage
|
||||||
|
|
||||||
@ -443,6 +444,7 @@ void Unit::test_channel_rtt() {
|
|||||||
while (!cc.send(ipc::buff_t('a'))) {
|
while (!cc.send(ipc::buff_t('a'))) {
|
||||||
cc.wait_for_recv(1);
|
cc.wait_for_recv(1);
|
||||||
}
|
}
|
||||||
|
//std::cout << "sent ack." << std::endl;
|
||||||
}
|
}
|
||||||
}};
|
}};
|
||||||
|
|
||||||
@ -454,7 +456,8 @@ void Unit::test_channel_rtt() {
|
|||||||
//std::cout << "sending: " << i << "-[" << datas__[i].size() << "]" << std::endl;
|
//std::cout << "sending: " << i << "-[" << datas__[i].size() << "]" << std::endl;
|
||||||
cc.send(datas__[i]);
|
cc.send(datas__[i]);
|
||||||
/*auto dd = */cc.recv();
|
/*auto dd = */cc.recv();
|
||||||
// if (dd.size() != 1 || dd[0] != 'a') {
|
//if (dd.size() != 1 || dd.data<char>()[0] != 'a') {
|
||||||
|
// std::cout << "recv ack fail: " << i << "-[" << dd.size() << "]" << std::endl;
|
||||||
// QVERIFY(false);
|
// QVERIFY(false);
|
||||||
//}
|
//}
|
||||||
}
|
}
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user