From 6163618433d1ec9e7d2ec6d92599061159562efe Mon Sep 17 00:00:00 2001 From: mutouyun Date: Sun, 3 Jan 2021 12:52:03 +0800 Subject: [PATCH] =?UTF-8?q?=E9=92=88=E5=AF=B9=E4=B8=8D=E5=90=8C=E7=B1=BB?= =?UTF-8?q?=E5=9E=8B=E7=9A=84=E7=AD=96=E7=95=A5=EF=BC=8C=E5=A2=9E=E5=8A=A0?= =?UTF-8?q?=E4=B8=8D=E5=90=8C=E7=9A=84sender/receiver=E4=B8=AA=E6=95=B0?= =?UTF-8?q?=E6=A3=80=E6=9F=A5=E3=80=82=20=20-=20is=5Fmulti=5Fproducer?= =?UTF-8?q?=EF=BC=9Asender=E6=97=A0=E9=99=90=E5=88=B6=EF=BC=9B=E5=90=A6?= =?UTF-8?q?=E5=88=99=E4=BB=85=E5=85=81=E8=AE=B8=E4=B8=80=E4=B8=AA=20=20-?= =?UTF-8?q?=20is=5Fmulti=5Fconsumer=EF=BC=9Areceiver=E4=B8=AA=E6=95=B0?= =?UTF-8?q?=E4=B8=8A=E9=99=90=E4=BE=9D=E8=B5=96is=5Fbroadcast=E6=8C=87?= =?UTF-8?q?=E5=AE=9A=EF=BC=9B=E5=90=A6=E5=88=99=E4=BB=85=E5=85=81=E8=AE=B8?= =?UTF-8?q?=E4=B8=80=E4=B8=AA=20=20-=20is=5Fbroadcast=EF=BC=9Areceiver?= =?UTF-8?q?=E4=B8=AA=E6=95=B0=E4=B8=8A=E9=99=90=E4=B8=BA32=EF=BC=88uint=5F?= =?UTF-8?q?t<32>=E4=BD=8D=E6=95=B0=EF=BC=89=EF=BC=9B=E5=90=A6=E5=88=99?= =?UTF-8?q?=E6=97=A0=E9=99=90=E5=88=B6=EF=BC=88uint=5Ft<32>=E5=A4=A7?= =?UTF-8?q?=E5=B0=8F=EF=BC=89?= MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit 行为变更: 1. 在连接时根据模式检查sender/receiver是否超出上限,超出则返回false 2. 在send时确认是否允许发送(对receiver模式来说,send之前不会尝试确认sender个数) 3. 修正若干bug --- demo/msg_que/main.cpp | 7 +- include/libipc/def.h | 13 +++ include/libipc/ipc.h | 37 ++++++--- src/ipc.cpp | 63 ++++++++------- src/libipc/circ/elem_array.h | 85 +++++++++++++++++++- src/libipc/circ/elem_def.h | 61 ++++++++++---- src/libipc/prod_cons.h | 103 ++++++++++++++---------- src/libipc/queue.h | 55 ++++++++----- test/test_queue.cpp | 151 ++++++++++++++++++++++++++++++----- 9 files changed, 431 insertions(+), 144 deletions(-) diff --git a/demo/msg_que/main.cpp b/demo/msg_que/main.cpp index 2c19e76..654b4ff 100644 --- a/demo/msg_que/main.cpp +++ b/demo/msg_que/main.cpp @@ -111,10 +111,13 @@ void do_recv() { int main(int argc, char ** argv) { if (argc < 2) return 0; - ::signal(SIGINT, [](int) { + auto exit = [](int) { is_quit__.store(true, std::memory_order_release); que__.disconnect(); - }); + }; + ::signal(SIGINT , exit); + ::signal(SIGBREAK, exit); + ::signal(SIGTERM , exit); if (std::string{ argv[1] } == mode_s__) { do_send(); diff --git a/include/libipc/def.h b/include/libipc/def.h index 9732acf..d9cfdc0 100755 --- a/include/libipc/def.h +++ b/include/libipc/def.h @@ -48,4 +48,17 @@ enum class trans { // transmission template struct wr {}; +template +struct relat_trait; + +template +struct relat_trait> { + constexpr static bool is_multi_producer = (Rp == relat::multi); + constexpr static bool is_multi_consumer = (Rc == relat::multi); + constexpr static bool is_broadcast = (Ts == trans::broadcast); +}; + +template