fix compiling error; preparing to refactor

This commit is contained in:
mutouyun 2019-01-04 22:11:19 +08:00
parent 17621c1e83
commit f388a0a360
5 changed files with 57 additions and 28 deletions

View File

@ -2,14 +2,15 @@ project(ipc)
add_compile_options(-D__IPC_LIBRARY__) add_compile_options(-D__IPC_LIBRARY__)
include_directories(../../include ../../src) include_directories(${CMAKE_SOURCE_DIR}/../include ${CMAKE_SOURCE_DIR}/../src)
if(UNIX) if(UNIX)
file(GLOB DIR_SRCS ../../src/platform/*_linux.cpp) file(GLOB SRC_FILES ${CMAKE_SOURCE_DIR}/../src/platform/*_linux.cpp)
else() else()
file(GLOB DIR_SRCS ../../src/platform/*_win.cpp) file(GLOB SRC_FILES ${CMAKE_SOURCE_DIR}/../src/platform/*_win.cpp)
endif() endif()
aux_source_directory(../../src DIR_SRCS) aux_source_directory(${CMAKE_SOURCE_DIR}/../src SRC_FILES)
file(GLOB HEAD_FILES ${CMAKE_SOURCE_DIR}/../include/*.h ${CMAKE_SOURCE_DIR}/../src/*.inc ${CMAKE_SOURCE_DIR}/../src/memory/*.hpp)
add_library(${PROJECT_NAME} SHARED ${DIR_SRCS}) add_library(${PROJECT_NAME} SHARED ${SRC_FILES} ${HEAD_FILES})
set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/../output) set(LIBRARY_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/../output)

View File

@ -10,8 +10,8 @@ if(NOT MSVC)
endif() endif()
include_directories(../../include ../../src ../../test ../../test/capo) include_directories(../../include ../../src ../../test ../../test/capo)
file(GLOB SRC_FILES "../../test/*.cpp") file(GLOB SRC_FILES ../../test/*.cpp)
file(GLOB HEAD_FILES "../../test/*.h") file(GLOB HEAD_FILES ../../test/*.h)
set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/../output) set(EXECUTABLE_OUTPUT_PATH ${CMAKE_SOURCE_DIR}/../output)
link_directories(${EXECUTABLE_OUTPUT_PATH}) link_directories(${EXECUTABLE_OUTPUT_PATH})

View File

@ -90,7 +90,7 @@ protected:
template <typename Acq, typename... P> template <typename Acq, typename... P>
void* acquire(std::memory_order order, Acq&& acq, P&&... params) noexcept { void* acquire(std::memory_order order, Acq&& acq, P&&... params) noexcept {
uint_t<32> conn_cnt = cc_.load(order); uint_t<32> conn_cnt = this->cc_.load(order);
if (conn_cnt == 0) return nullptr; if (conn_cnt == 0) return nullptr;
elem_t* el = elem(std::forward<Acq>(acq)(std::memory_order_relaxed, elem_t* el = elem(std::forward<Acq>(acq)(std::memory_order_relaxed,
std::forward<P>(params)...)); std::forward<P>(params)...));
@ -102,7 +102,7 @@ protected:
break; break;
} }
std::this_thread::yield(); std::this_thread::yield();
conn_cnt = cc_.load(std::memory_order_acquire); conn_cnt = this->cc_.load(std::memory_order_acquire);
} }
return el->data_; return el->data_;
} }

View File

@ -28,6 +28,11 @@ struct elem_t {
byte_t data_[DataSize] {}; byte_t data_[DataSize] {};
}; };
template <>
struct elem_t<0> {
elem_head head_;
};
template <std::size_t S> template <std::size_t S>
elem_t<S>* elem_of(void* ptr) noexcept { elem_t<S>* elem_of(void* ptr) noexcept {
return reinterpret_cast<elem_t<S>*>(static_cast<byte_t*>(ptr) - sizeof(elem_head)); return reinterpret_cast<elem_t<S>*>(static_cast<byte_t*>(ptr) - sizeof(elem_head));
@ -42,7 +47,7 @@ enum class relat { // multiplicity of the relationship
enum class trans { // transmission enum class trans { // transmission
unicast, unicast,
multicast broadcast
}; };
//////////////////////////////////////////////////////////////// ////////////////////////////////////////////////////////////////
@ -58,7 +63,7 @@ struct prod_cons<relat::single, relat::single, trans::unicast> {
std::atomic<detail::u2_t> wt_ { 0 }; // write index std::atomic<detail::u2_t> wt_ { 0 }; // write index
template <std::size_t DataSize> template <std::size_t DataSize>
constexpr static std::size_t elem_param = DataSize - sizeof(elem_head); constexpr static std::size_t elem_param = DataSize - sizeof(detail::elem_head);
constexpr detail::u2_t cursor() const noexcept { constexpr detail::u2_t cursor() const noexcept {
return 0; return 0;
@ -111,7 +116,7 @@ struct prod_cons<relat::single, relat::multi, trans::unicast>
}; };
template <> template <>
struct prod_cons<relat::single, relat::multi, trans::multicast> { struct prod_cons<relat::single, relat::multi, trans::broadcast> {
std::atomic<detail::u2_t> wt_ { 0 }; // write index std::atomic<detail::u2_t> wt_ { 0 }; // write index
template <std::size_t DataSize> template <std::size_t DataSize>

View File

@ -49,6 +49,10 @@ struct test_verify<cq_t> {
for (auto& c_dats : list_) { for (auto& c_dats : list_) {
for (int n = 0; n < N; ++n) { for (int n = 0; n < N; ++n) {
auto& vec = c_dats[n]; auto& vec = c_dats[n];
//for (int d : vec) {
// std::cout << d << " ";
//}
//std::cout << std::endl;
QCOMPARE(vec.size(), static_cast<std::size_t>(Loops)); QCOMPARE(vec.size(), static_cast<std::size_t>(Loops));
int i = 0; int i = 0;
for (int d : vec) { for (int d : vec) {
@ -85,22 +89,39 @@ struct test_verify<ipc::circ::prod_cons<
} }
}; };
template <typename P>
struct quit_mode;
template <ipc::circ::relat Rp, ipc::circ::relat Rc>
struct quit_mode<ipc::circ::prod_cons<Rp, Rc, ipc::circ::trans::unicast>> {
using type = volatile bool;
};
template <ipc::circ::relat Rp, ipc::circ::relat Rc>
struct quit_mode<ipc::circ::prod_cons<Rp, Rc, ipc::circ::trans::broadcast>> {
struct type {
type(bool) {}
constexpr operator bool() const { return false; }
};
};
template <std::size_t D, typename P> template <std::size_t D, typename P>
struct test_cq<ipc::circ::elems_array<D, P>> { struct test_cq<ipc::circ::elems_array<D, P>> {
using ca_t = ipc::circ::elems_array<D, P>; using ca_t = ipc::circ::elems_array<D, P>;
using cn_t = decltype(std::declval<ca_t>().cursor());
volatile bool quit_ = false; typename quit_mode<P>::type quit_ = false;
ca_t* ca_; ca_t* ca_;
test_cq(ca_t* ca) : ca_(ca) {} test_cq(ca_t* ca) : ca_(ca) {}
auto connect() { cn_t connect() {
auto cur = ca_->cursor(); auto cur = ca_->cursor();
ca_->connect(); ca_->connect();
return cur; return cur;
} }
void disconnect(int) { void disconnect(cn_t) {
ca_->disconnect(); ca_->disconnect();
} }
@ -111,17 +132,17 @@ struct test_cq<ipc::circ::elems_array<D, P>> {
} }
template <typename F> template <typename F>
void recv(decltype(std::declval<ca_t>().cursor()) cur, F&& proc) { void recv(cn_t cur, F&& proc) {
while(1) { while(1) {
msg_t* pmsg; msg_t msg;
while (ca_->pop(cur, [&pmsg](void* p) { while (ca_->pop(cur, [&msg](void* p) {
pmsg = static_cast<msg_t*>(p); msg = *static_cast<msg_t*>(p);
})) { })) {
if (pmsg->pid_ < 0) { if (msg.pid_ < 0) {
quit_ = true; quit_ = true;
return; return;
} }
proc(*pmsg); proc(msg);
} }
if (quit_) return; if (quit_) return;
std::this_thread::yield(); std::this_thread::yield();
@ -264,6 +285,7 @@ private slots:
#include "test_circ.moc" #include "test_circ.moc"
constexpr int LoopCount = 10000000; constexpr int LoopCount = 10000000;
//constexpr int LoopCount = 1000/*0000*/;
void Unit::initTestCase() { void Unit::initTestCase() {
TestSuite::initTestCase(); TestSuite::initTestCase();
@ -322,13 +344,14 @@ void Unit::test_prod_cons_1v3() {
benchmark_prod_cons<1, 3, LoopCount, decltype(el_arr_smn)::policy_t>(&el_arr_smn); benchmark_prod_cons<1, 3, LoopCount, decltype(el_arr_smn)::policy_t>(&el_arr_smn);
benchmark_prod_cons<1, 3, LoopCount, void>(&el_arr_smn); benchmark_prod_cons<1, 3, LoopCount, void>(&el_arr_smn);
// ipc::circ::elems_array< ipc::circ::elems_array<
// sizeof(msg_t), sizeof(msg_t),
// ipc::circ::prod_cons<ipc::circ::relat::single, ipc::circ::prod_cons<ipc::circ::relat::single,
// ipc::circ::relat::multi, ipc::circ::relat::multi,
// ipc::circ::trans::multicast> ipc::circ::trans::broadcast>
// > el_arr_smm; > el_arr_smm;
// benchmark_prod_cons<1, 3, LoopCount, cq_t>(&el_arr_smm); benchmark_prod_cons<1, 3, LoopCount, cq_t>(&el_arr_smm);
benchmark_prod_cons<1, 3, LoopCount, void>(&el_arr_smm);
} }
void Unit::test_prod_cons_performance() { void Unit::test_prod_cons_performance() {