mirror of
https://github.com/mutouyun/cpp-ipc.git
synced 2025-12-07 01:06:45 +08:00
fix compiling error; preparing to refactor
This commit is contained in:
parent
17621c1e83
commit
f388a0a360
@ -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)
|
||||||
|
|||||||
@ -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})
|
||||||
|
|||||||
@ -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_;
|
||||||
}
|
}
|
||||||
|
|||||||
@ -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>
|
||||||
|
|||||||
@ -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() {
|
||||||
|
|||||||
Loading…
x
Reference in New Issue
Block a user