fix bugs; simplify codes

This commit is contained in:
mutouyun 2019-01-08 22:37:34 +08:00
parent 60d1a6d00c
commit cfd175dbdc
4 changed files with 31 additions and 26 deletions

View File

@ -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() {

View File

@ -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;
T item;
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);
}
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));
}
};

View File

@ -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_);

View File

@ -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
@ -443,6 +444,7 @@ void Unit::test_channel_rtt() {
while (!cc.send(ipc::buff_t('a'))) {
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;
cc.send(datas__[i]);
/*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);
//}
}