From 79f6775324d1b95abc534ca47f203e2efbe3a79e Mon Sep 17 00:00:00 2001 From: mutouyun Date: Tue, 8 Jan 2019 18:02:34 +0800 Subject: [PATCH] use circ::prod_cons to implement route & channel --- build/ipc.pro | 3 - include/circ_queue.h | Bin 3683 -> 3995 bytes include/ipc.h | Bin 2642 -> 4074 bytes src/channel.inc | 197 --------------------------------------- src/id_pool.inc | 83 ----------------- src/ipc.cpp | Bin 6509 -> 9600 bytes src/platform/shm_win.cpp | Bin 1864 -> 1939 bytes src/route.inc | 94 ------------------- test/test_circ.cpp | Bin 12294 -> 12703 bytes test/test_ipc.cpp | Bin 13420 -> 13385 bytes 10 files changed, 377 deletions(-) delete mode 100644 src/channel.inc delete mode 100644 src/id_pool.inc delete mode 100644 src/route.inc diff --git a/build/ipc.pro b/build/ipc.pro index c894a13..4d14f8e 100644 --- a/build/ipc.pro +++ b/build/ipc.pro @@ -27,9 +27,6 @@ HEADERS += \ ../include/tls_pointer.h \ ../include/pool_alloc.h \ ../include/buffer.h \ - ../src/channel.inc \ - ../src/route.inc \ - ../src/id_pool.inc \ ../src/memory/alloc.hpp \ ../src/memory/wrapper.hpp \ ../src/memory/resource.hpp diff --git a/include/circ_queue.h b/include/circ_queue.h index 6913067b3128671fa80de74f3cce0bee68ca6d7c..03d42510ba0a9cbcb765f241783aacc54cf543e1 100644 GIT binary patch literal 3995 zcmd6p_dnEuAIBZZo>|%9taDi>DMfbY?7ebFcSiO&TSjC%7iW~SGLmd%W*xF+WG6z- zPD&blX?*+s3E$5z_xU^?_uKRFe7@dxEP}`h5)godgan`tHbS6~x=5ds515{+_Q}tG zpKEM0^VuOJ4<3;MXD7$Me#sTCV+PR<^3dODqwnd-IrHB?{y)4dpQWF9EO^Lb`r4%f zF75XbQ_9Ne3UiQRu=Eo3bt~d7=(~}L6yOc%ETKv9v2%+iRc{#+0Z(>GSC0e;H0FGN z&Wfx-gEDRQMh47U5`jhbgVu%?D#r|N76Yi{PNc>MU6DnhxvUa5Vwa2q0(Gg)kmf2Z zLPF2gQTv1a-Hh{mnMC8o>}L1s20It(7mSgLaj0azX|Q_~x>=n`Vm zO2DwLoeBxgv4@0NAV}mmJ%Qy_#qJB4^fT!))(bWA-z{K2sOHd@*sw=gR|5nYKuBKL z)j*W|3!0<_Xt6(9C$u-k;j^E)f1f1>VdH`nVL(1N{H!Lfp|6hDJ|BhXyEguK)0dcj zwa6_TA^@>`&mCl+N?N@bptA=BKLs?rEcGGw1I<8wKGh29m!R1;Mm{janhQ9C;!^6K zVP(sb-c%hAgL~@PbY#;_%pt7Ma7az*lKQY2yY?kHfttD>ebRlUCU4o{)eqx|6M|M; zIZn%UWLcA05^L|2?fSLV#j|C}5c$e+&YD!wW>j*U6JHtHeJ|}sAAI3a zUkM=CFK;W1qROceFY;kBDMl!>D(uUuGBj*l|Bm$(XhT`KA>i72-a@-3QH!d5TCO*U zEaJ1(vljYu8QwMp+Y>XFljqpqXHhE@zI(SAvFc+b)+H2tG?XcVvRg-6t-Qu&t&>G%D#Q{SsyITlGd?+ioP?Vf4?*;iU7CEnN z;{9b=Wgm_^FFB&%AFM6X59H-$383vTFS>~XV!7e%@<0)+N%`*PMZ%in4u3bqD~RnY zC;BE9R`D2Nuw%{r5%K2bhH%rQ0jZ&;+Y*{e!Y1r8kD@43n1Wazo#ewcLn5I~W9qvh z4Kj)pue-z1f+Kmymwivjd`BAVS3AxpC34}JsX|BQsp(q z458?$eYVvWBnX9s_ZxbA-dCh2qc&Y&~nFWPjK|0tn@|Ti<24 zkEp>1_f_=IdG;TNwU(IKX3UvclTOKP(*EK9$hi|4y7@`2SKPEGm$$I&3>Dt@+}_b# zpVUk#=eucuO!2#e-INY>G+CD{TG$#G8PYr(^J20r-$DBNEjDj8Uhb+fMo$fWz)-+g z!pxCRUy-$NCIy;i$(2r$UWvdmQ+8vd3$i8M_hq;m_Y=OdWiW*vK9s6@7M&19x!KiL z_3eG!ZCH1!a65x(HoEt+g~x157@N_F{}Ob3fpT{K_3WARn%Rz2s=_Jh_8)!V!5CeR z*N^3W@iP+n4;;xB_CJ@xTPIqNM2c3yQ_^I>J<8cZ?-2lE;%>$I}Q+7ug(lKGKWZy~*VsqnT{HbGBn!ubS_z zk28{~Ow@`3h43iJcysE%>RXb4+JxDa2g17N2ILot09oVspy_yK@IXo;L=Oj`2>s39 z0Ch9zqW)en5@1fx4bN9l(J+Gri-PP4$20xKN5iz~loz23h5LTvMiTnkgxkH;r1GNI$_EZZhH6%p&9mt3l{3z8lQL~Eli(iO8I@3T zMiNlnexx3(>5!va532nq#@DIa#6~ivx3mN(iw=i1Zl^ zSCSNu{M(+XM%UJV>^;{cA_d#0{i2baJu60^OF2wBM0i_1cg}|NWEmDs(@3-w?!?yg z-#YalEo`Lolbnzi(~7OBar3vLQ-J^^d4A4Pq0QLzauf-1_p5#IM5b%WjJ}MOH~Bfv zDTSNoEHYPwyOg`k6T6-b#yh>A55fsX)?IrwkzX{aQ;!*`tXm~`su1c$e$pAHfuaQE zS<|-1*?3%_-oo^H!jM4DIg2^`xhV;>j℘=#q~};G_ooRIRY$%olWNw=6Ywefy=B zR9T=5UZr@pK;+r|D;Pu+Qba~=$5cUj{gnUBWT0*v?8nOu2jbKyvtz$H$FkV_I-dG}(tq!o zfzNlQpH)58`=q4ne99lz?d-UA(*F`wy6iTub!$pj*yzP|gYi^LVn|>5! z(LSb4dT@gJXn|DW@t6MA+QmQo0Xi$JvoQxR`i|?-4vsc7L7XtVs&oqhaz4E zluBHY{1y{m9xx6ZXgs^suEy+UEr2A~mv^!ADx#a~y1sY9-@bPoROyXS!050}HC{N2 zPercwh>*S^ZkJez*93y@sZ>5Lg%qZM_vtoI`+w>`R`Yx9UCVr^WCft2ef9Fjf+XCJ z%`qp`R!TWcltRf-8-K^FPZvH>#9oSdb+Z2y#@>;PL(HvE%qz+o?dc0ZSL!hnP7{F; zlINJ{c>DMdDp*T_wf?s70}lq z*uYP1a+XE5N!(NPWd9v51+=a8gq7F6uuxD>v)QS6hLYgAt}eZO$omaD%dqU1WC; z*DcvBEf_N`+IvN(hsfJ-#7q_E%~C}e8@f2(t5*8f7}dDBy||jAY!sN_BrC~DnQyf) z8ngLr;)@_ih|X3FfYAEQpLZglD|_ky_`2-8{meOU&MF-ze^%!0U;R(;+EPevj63d% zfLA>?z=KBL0auQ&37H)Ga~)4h3J4IIxFgvOZq8v;8%lxdaZ5Ihk*lSH7?(CbB;?Ml z_aFa%@xLOXkU?pYec%;y+Tzke-+teJOb?AERy$_P=Kt_#elU?F)0n5~9~+m;tA{(~|7-sZP+a|i=KuV+ zKDqzwpnBl&=A_Q@l_lYm{*#S1el6_N60_kS7!?vD;q5U9FmGD&E1p=|J>7qxuOpG} z)c+un-1)VT`26Kc*b5&CMvTc#O|^2U`h$nQEG00;xM{}`b5mENM*S21OA`0z*ELdw z?u`%Z8;Hwn5;5#~LJip9m+zBi5QC-9=2n06Hy%-HxIx{{cI}{fVN@wu%sVY!vDY(b z>yQ5;HhWE&`OEWR>XljC3N0@)lQRGGKS)C0i9YUh|BqXdAPH+~7uvgYKSxH<`%nI7|08;Z>+iHTPBo@v>WuChoc15SlK;E^C;pcv`p`uj{15+1 zyau;7MW7Ttvx}b(vXCulk#EY(gHJg7iQuZQTL_ktD)m6jxb}bfe+NpZY95uX3%5jj zeRhb1yE#+l(>ZAM(p01YHNR*F>;h`m$}d(;i#maXz}a$I5;jw&be>LJ1A0EM?V*4D zUt`g{mhHUEx%0RGN+5QEDZPm(LSSoP@B>$0>2Lng|NOs4NR}(wVZIyNg*%Tt<$uKl zPkx@~gnw(G$xef-4huOiI?C_7A(Zd-KmIU;k)`?1j+Z{a0qcpM}(0C8d4XC7rCUDy*}1 z@kr%Cu~2wItNs8yxhL}9{kNU&``7=c{UFuhdIkDWLcntks~KjGioN7{v1lYbCLX;^ ZLeo>hR9H#EnB+rO^K~K_GL5@3{vXs&FlGP% literal 3683 zcmcInOLN;c5WeeIteqJZR1~GX(lUF?*$3S`9u7=G7HW`S0ML%==)ZRtfcTJTJL9%I zNFuP<{r1}jR-YQfA1V&IF2rp1N!EpGO95-QZ$$14m(FH`G?$`K z@kat_TuqQl5~hbc$BP{aCIQVMC<+EBW>MEX z7*oQDAm}CLpc`Qjyt!uY3bSzJeN7W`9t`OIb*AId@ z(_-d(+m)!a+2`7n!sNX8o?|^=hV;=PJzu|)D(QZ+z!eqz{s>l-OZcnB07W1iy);G} z+;3~wg_xAQ4fW8;j>!6wb*#L~TPbZP^q*39F~yxPhJQ(3kNE%RueZg<<#n2R*c~xs zzmUdLdH5%cQV{DrBx{J@QS~TC$&|6Pyrj=3wv z%KGJwpFS#)o?a%F9qJu1)_GD2-=$wg|9W%!fCF8Jdl%pN{l8kR;3o6!#52{jcE@h! zb6Rh>;g$V>55DTpz#Mbjo4B3du_rCd1vIDqGfi;<1BUCHkU?8*p1CR4HyMkN5M4|m zisNCNPUlX-x8R|5+{q$bstfQ#O#Y1HUyc^oxA`2}rkr#a_kp#wl@GNj;n9x*SEsl= zf46uQT5NcDN!_6sDm*q4LQ0R58ZEcqr*j)FbSa3wDu)C%Sib7v%6)2f;T<~D*A3hhWtjXsI!~$ zs1R?=itmH$8IDO1vHno|xu5;zNczWbI2hwFtAuFS<1mA~kvK`kEZIP#n=k=+Y9|we zI7JYnPV_QD9Fe}@KzMYwhZK)buzwonH`Q!#+7MN5fYe@$LK0m$#wK6F?VQfMSA<@u zE5u4a3APv}>1Kg7nIuCh&!YS$^tjpMk3k6RPjViQkV_{eOvQ&4;C9m9oeX91P?+NQ lBTkU?=Zwwq#1j4(;}1k0W;DYeXq@Z+SkWJ;(>2Vg**|9PM}hzV diff --git a/include/ipc.h b/include/ipc.h index e59196ad7a87b50bfcc07dc6afb5e9fe004bf3c2..583cc9098f182c1a39313915b6fc6aefcd28c546 100644 GIT binary patch literal 4074 zcmbu>=R2DZ-^X#HYVQ%FLd6y{Hnshz5wo^RRE*lY)QT;Ns;y>gv?(n$YZi%Bqc*W> zRL!bdRaIBq*Z2qSJUNr&$g|h+d7ob=W-#&zQ6Mo95fQPDm^s1)2}1@Fei#~S84w=- z``ls0FBL@)WflVX7iOn^ot6qTGKx}`wgUP-6Pev^zxx#*OF+b`g4HGT zv7rX)8lF#CWa22`Mc-_`FQ!U9X(WPqB-5hlkG)$}z~#~(v^_+1P~3Kgx_rF#13&hW z>EASFSsuOY>94?>SkirzNSTMtrQ_hu`{t1)8GoYS1@@7(+SX5mw9L39te-gxpsvd3`dVqRs-=1N>o@~C@q0oTPh&UUuu)H#b?LKt= z0R@IdnVuv^5J$x=86L2kd`XYl!3+v_4rsBJ+TQ^)yrW=M-csP;x(zHT=b;f2RJEUk z*J z*U7*+?mOq|t)6s@H;07Kg>sOa2!;iz?gyUME6zcJjUI!B3A128>06OW ziYxBrWyeS5|7FOqaI4BGC|v^EahA9rec;Ian+~tq(sRS1OF_mt_9A3Z#V-h7E+(i$ zDyeB{8xNVL7Q26@FTF0pKuy9^t~%%C_S>&(0(k%uc+B})S3a$$r$XwGSm2|uI8sUA z$(qd8QfzUv&qoW0wKg`WmyGNIQtmzeOXz5A-3!xS?hj~2^z;lEUJ_F!#00_Og&fCF zqS*j|lKQgZI%Dq3u%4w(hj@5a$N8|cXGr~7%B?!yZwm@T^qq`c^SBKCS!ru6mYC_LYV4? zV=dEn$llHQcZCn{#Wcqa^EEVz_kchC7H@i!9yf0EqxX4S*6fJ1CAwU2hgzouyzC-R zJ$W+8VQzF&63HrU?XJYJ7Vp~Hpb8NIK9bwzZN z{LSwW{Qrpykb0AGbBDEthXI66>GPPAtN5ht7r;#G+Qcibkt#NHRN8 zfa{W~y`iI7m^U)GIw!67+CP^(4DbnaP=+_)wUkX9;Scu=jj?tL%2*4jN_uuy#PWvg zk+o)`Pd_EMfHU>0`91&G((?+VbA*K2xP>VUxUUXG7b$WbNd#T{lLNfSv0^)#v$f7s zQ-=yW@Z!Si8@wBdy=bLFp}u;A{W8c3Hr{4{J{+_!0y{ z20x2$5Lxz@f__bU_^t{%{A}y{C^Isx{dxfuh}l2cnN4HlgJ(x7@etdtl9Vh=7F-hi zMfqqPh0SEC-=tCoX&dVfXcf*ycL}1)Ttd2is2$hjct~m0u(lO17!yZ$zk2j<$JMo_ zJf6mz=73|jjK(G^p3EAxOyWBmHc*lNy_FI_9f8FGgMPBKSqDWRdJh;ZKH~Q@yhn)q%dhiW2b{$p(9iW4Sq#)p`NTMkH6i*9f1pSsL!5=fIa;APW zC-~n@MYaQb8YnKLo0Zi>brvQ3L<|wWukwmhqS7`kHi#f^W3#t1WXUY!B@a58Vo=dW z%VmsW!x^bE##r`9Vp+KcxZ%xkL(WfOq?cG@cU1#Z=u$9~kr}tUfUq;JA+dKKQytVx z9_0G!djB^F&COX1b&U$^w~=B$sZ?Hz?!!0nqs+yaX|n>RjPzlEfYs!(2bF_`qa@9I z4@f@im>F7BsZl?R4d>d0(W9{7LUIk>f3V_j?*1HrBrff+e1sPlE}dA&DE_!eWonf; zogj&=>BaK()QvX3(PmxBhAD*BU;7V60{c@|3Lo|gdZuN|qLFOLUmXrl0W9bshq~kC zMd9QXVC@2l;+Kkp4CoiZD_o8^0w_|rT@NSdMo-0HzQQ{(mu&`XcLU7>mJNvugy=M z_>93y)1XhCIvL!?RiEfe(H0yJQ{RQF6a4K3RD?s5ZMusc@)1yNFZ7#78*UPk8BBrA zXa1qZ$&WUZd8kJBwi?XBO9SMx+5X%Ah+UAQDJ#a2S3ligch%kD&=67%_;A@J{vItz zde6&yEtn#T0_&mSkL6ZQ^$m`Z+Yt7EAi8F(5;>-g?s7ztFxpmw1 z{>SiNBc}C4ST#$XCP>*Nq}}U>*W8Xv|JE6;LqydwxTS;`cGY!C);T0&0EGTW;5Gj7 za-4x)dF9tc{z`vmnd3H6u-L{atBSd7y?G2BUV@g?<57J0zoQlJiFMAqnEtc>K34ax zql`k@1SzMaY>CMTVA?Tay^e`D-w9M+Klj5gInk|Snp3)?`rW_%^Fa1gqU5hla*`HL zW1AYm5gyu{!j?S5U$?lutl(U@sJ_n`U9vOVwo+LP{*GI6-r8DW1I)?4NQZK6mp>T7 zEnnqcf}1P2dqiTt8;xD1U+@3vvzo5I8E`FhqsSG|Cd=pOAs;ZeanuUra+6=0(o(>{ z^-;M%+JZ?MAD=W&0t&eSRbhTlZc}t7VbM@-wwde?8$LbiG;^;BQ;qehUVR5%{p8j_ zvnO-Ce@EV1<+>N8&ekm~Je3q3ds%^h2Ss?~8C}oqzyyC@TTO%i_WzsK`s4t6?jIXi zBpQ&e_mpA!%5uwoI?PM-=BOdLxr>MI=KS+?g`q>0I*b4KdvJ_PZ@1eH_vG?79(hG2 zPb{bq&ocNpgx@O`f^wNE%dJ{TloI?cZ-AnfT-gn6f$l;OchpsP>Sf&;B-hXf)O)hF zH=-U40H^l48HLJZv4OeXuR+i+#_-JwC_?|~Q2~>z+z$-p8V9!gGtSq_jE)HYSvRb; zbTEcG8Ho?A%h>(DUiaToowwEG4dcq1_rSACmQ4Q7=%?!zJW}a)J8vS+D zq$gP)rjp3kwD8p%yXAJk)93DJYEb7-F115bF-*q%ijJp}=H32o;PHx(mzl2j7Qvqc zYp17#AV)JvrNLwq)`4G_Q;n0pnNhmM0}5H%Z}#lyyr&oT`V!!SwjEW#Pa3`!i;C>T`ZuIheEz)+_JC)HLIgd0dfag zZr3zrT3rX*U@4xciT3%FZuUP z3u{6@dDR>X^9q4>)$6}0(n(SKhX+fCs#Jn4s({%~6Kv--4e zq-H86h`Pq5$QB_j(I;ky%^ILMciO7c=_T=m9J}TfBB55y<|;l7NaL9ckD?LYbM82CG=;d|Wn}!$jIY+n#PPfZ zXYa1GKJEAX_xt};xVb$$Cz1PXYQMd4BUc>OTYkG-ODD@`B;@-3A2sE6ArTb-7)gmM zBkNg;hA4UvU}E{`Inkqlps*N5nz1Gok+@8yhCV3e{IBh|hGd^^BZlrwCHIA`A7~zk z^o6J@>6|+vEKr840&uJn@szST>pJHp z&neOC*0;O|nNuv@-0V3Zsx%o>_VlL08L+6kKx8jI<)#MaV|1o0yf#sp`^{F$jGDo5>qAyka^|oUKU!0eUWm8=5_P$l z@V2=MIic~0WVmx}>$3?T8{d=9k<#Ab3Ec8rXWwm8lW_PiAycL*g#A1B(vS%ViM(Ar zQk|>3swMf2kYt+IvN7fEduTjz-G3|UgfY)-1AWLp^J?E1d)9o$3d`-{A*+c4dq!b0 zE$4*$Uu+n!Slr%^RcLq~O}PIZiuz3yVFQpqw?KK3z@4&{LSeK#e4!Wl9Ld2sTw%2o sbd89*A5G??UOs%?O9m(0fBpj=Je0(0=zF=_jL{=fuN3=s1}6^w1rVNt%m4rY literal 2642 zcmdT`O=}x55WVlO7!ojR6JmOen?NWz^iVgnIkc2wWUZVP$kHNd?WQID?VXXdyV}@E zDU?D_W=AtmZ$940r;TOzTLwmRQ52_AbJbP?Uhf3=#$II>=dINDSDDj^_|_Qf&+C)H z?W7W$v0>eAHo}f=uHKTN&}=JQ!?*z1aQIOat;0K@X1Y>h<>3-`Mpm;$vJ(_q0qqfW zQ50`)->hyv-M;^DH-vGcHS$NtlGn@vemf5{pzEfKJcQuU4WN=PMV0;SHTvex&Q})~ zPJSn5R`A`5n^ya=e@3UrMtH6SvnvYvQ}<&DTcT74z&2a{iRY zxD=_lha8Lftia;k)zZPH)!a*?5xG?r?3wg13B>^Hq+|C2eXQBSwpCuHjyMY6*OJ$0 z*a`5pfZ50EcQ-R4NSzW@=*@XCn~!pf{T@^5npwM}85Le^8^t`%aGvk-syLcpL@Osy zyXlwZ*D3tKYZ3_GX;6C&z#leGV0|(y|I8Rwz$C#9f(dq%#0x+Wrq=r|3JeNeUd?7*fiEV#@ z_>@{4iGrHCqi=HUAtqoNVHs|~%jl6~CB>05z>X>0Amx-M+4)HJfF16kkwd>>2qAt94ny*| zHL%)GPQvYY8Oi48b_=X%tz|2%D?_dbQdQbuJ-KjqxFPJ5P^OR=cK+ENLKhA(No6r= z683cJ;ouW#g!d%Y4R;7WFCEKVsAOxb+@YZ3SY!fR#d3!hu4d5S_anN;brt=v6<8^i zhI}m5IIEplT~aIkl3a0*J*(G*`ZpDuL;hZ~$261>o~S5U4|LSo@%P|;q=shaRKO={ z>Q1|k4SGr^o%k}STvN&GWmOG>pHRj`GfjoD?J)njXoy`X0KJAQoSOK~kF*wr_W$WD V6*VcX`x> -#include -#include -#include -#include -#include -#include -#include -#include - -#include "def.h" -#include "shm.h" -#include "rw_lock.h" - -#include "id_pool.inc" - -namespace { - -using namespace ipc; - -#pragma pack(1) -struct ch_info_t { - rw_lock lc_; - id_pool ch_acc_; // only support 255 channels with one name -}; -#pragma pack() - -} // internal-linkage - -//////////////////////////////////////////////////////////////// -/// class channel implementation -//////////////////////////////////////////////////////////////// - -namespace ipc { - -class channel::channel_ : public pimpl { -public: - shm::handle h_; - route r_; - - std::string n_; - std::size_t id_; - bool marked_ = false; - - std::array rts_; - - ch_info_t& info() { - return *static_cast(h_.get()); - } - - auto& acc() { - return info().ch_acc_; - } - - void mark_id() { - if (marked_) return; - marked_ = true; - [[maybe_unused]] auto guard = std::unique_lock { info().lc_ }; - acc().mark_acquired(id_); - } - - auto& sender() { - mark_id(); - return r_; - } -}; - -channel::channel() - : p_(p_->make()) { -} - -channel::channel(char const * name) - : channel() { - this->connect(name); -} - -channel::channel(channel&& rhs) - : channel() { - swap(rhs); -} - -channel::~channel() { - disconnect(); - p_->clear(); -} - -void channel::swap(channel& rhs) { - std::swap(p_, rhs.p_); -} - -channel& channel::operator=(channel rhs) { - swap(rhs); - return *this; -} - -bool channel::valid() const { - return impl(p_)->h_.valid() && impl(p_)->r_.valid(); -} - -char const * channel::name() const { - return impl(p_)->n_.c_str(); -} - -channel channel::clone() const { - return channel { name() }; -} - -bool channel::connect(char const * name) { - if (name == nullptr || name[0] == '\0') { - return false; - } - this->disconnect(); - if (!impl(p_)->h_.acquire(((impl(p_)->n_ = name) + "_").c_str(), sizeof(ch_info_t))) { - return false; - } - { - [[maybe_unused]] auto guard = std::unique_lock { impl(p_)->info().lc_ }; - if (impl(p_)->acc().invalid()) { - impl(p_)->acc().init(); - } - impl(p_)->id_ = impl(p_)->acc().acquire(); - } - if (impl(p_)->id_ == invalid_value) { - return false; - } - impl(p_)->r_.connect((name + std::to_string(impl(p_)->id_)).c_str()); - return valid(); -} - -void channel::disconnect() { - if (!valid()) return; - { - [[maybe_unused]] auto guard = std::unique_lock { impl(p_)->info().lc_ }; - impl(p_)->acc().release(impl(p_)->id_); - } - for (auto& rt : impl(p_)->rts_) { - rt.disconnect(); - } - impl(p_)->r_.disconnect(); - impl(p_)->h_.release(); -} - -std::size_t channel::recv_count() const { - return impl(p_)->r_.recv_count(); -} - -void channel::wait_for_recv(std::size_t r_count) const { - for (unsigned k = 0; impl(p_)->sender().recv_count() < r_count;) { - ipc::sleep(k); - } -} - -bool channel::send(void const * data, std::size_t size) { - return impl(p_)->sender().send(data, size); -} - -bool channel::send(buff_t const & buff) { - return impl(p_)->sender().send(buff); -} - -bool channel::send(std::string const & str) { - return impl(p_)->sender().send(str); -} - -buff_t channel::recv() { - if (!valid()) return {}; - std::array ques; - return ipc::multi_recv([&] { - std::array acqs; - std::size_t counter = 0; - // get all acquired ids - { - [[maybe_unused]] auto guard = std::shared_lock { impl(p_)->info().lc_ }; - impl(p_)->acc().for_acquired([this, &acqs, &counter](std::size_t id) { - if (id == impl(p_)->id_) return; - acqs[counter++] = id; - }); - } - // populate route cache & ques - for (std::size_t k = 0; k < counter; ++k) { - std::size_t id = acqs[k]; - auto& it = impl(p_)->rts_[id]; - // it's a new id - if (!it.valid()) { - it.connect((impl(p_)->n_ + std::to_string(id)).c_str()); - queue_of(it.handle())->connect(); - } - // get queue of this route - ques[k] = queue_of(it.handle()); - } - return std::make_tuple(ques.data(), counter); - }); -} - -} // namespace ipc diff --git a/src/id_pool.inc b/src/id_pool.inc deleted file mode 100644 index 1fed0c2..0000000 --- a/src/id_pool.inc +++ /dev/null @@ -1,83 +0,0 @@ -#include - -#include "def.h" - -namespace ipc { - -class id_pool { -public: - enum : std::size_t { - max_count = (std::numeric_limits>::max)() // 255 - }; - -private: - uint_t<8> acquir_ = 0; - uint_t<8> cursor_ = 0; - uint_t<8> next_[max_count] {}; - -public: - void init() { - acquir_ = max_count; - for (std::size_t i = 0; i < max_count;) { - i = next_[i] = static_cast>(i + 1); - } - } - - bool invalid() const { - static id_pool inv; - return std::memcmp(this, &inv, sizeof(id_pool)) == 0; - } - - bool empty() const { - return cursor_ == max_count; - } - - std::size_t acquire() { - if (empty()) { - return invalid_value; - } - std::size_t id = cursor_; - cursor_ = next_[id]; // point to next - return id; - } - - void mark_acquired(std::size_t id) { - next_[id] = acquir_; - acquir_ = static_cast>(id); // put it in acquired list - } - - bool release(std::size_t id) { - if (acquir_ == max_count) return false; - if (acquir_ == id) { - acquir_ = next_[id]; // point to next - } - else { - auto a = next_[acquir_], l = acquir_; - while (1) { - if (a == max_count) { - return false; // found nothing - } - if (a == id) { - next_[l] = next_[a]; - break; - } - l = a; - a = next_[a]; - } - } - next_[id] = cursor_; - cursor_ = static_cast>(id); // put it back - return true; - } - - template - void for_acquired(F&& fr) { - auto a = acquir_; - while (a != max_count) { - fr(a); - a = next_[a]; - } - } -}; - -} // namespace ipc diff --git a/src/ipc.cpp b/src/ipc.cpp index 3490b5501b22b666a7ec166336170e91351eeef9..a7a18787f60d325ade5f7e819a7a166ef232a4b0 100644 GIT binary patch literal 9600 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 N@jcjkwXU@PzW_6%_xS(- literal 6509 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 literal 1864 zcmcIlTW{Jh6n@XIIHFP)7=>;R)09Fa1Z+iuwt`+Bw#o9G!(uJB*$!RT^51vtgf?u| z)R#pF;&Xg1-{c3~b}p1(#iTd|x%*moS7?=#`p)z)Y{~-XX|B1i=!2l#@y8=jOz4V4M&MHiOg$@4u>=F9QvXc>AU&$Pjxg#uoh98AuPh`I7z zsft!OJOp}c!%@8?_NYH^Eg{D+lwKL5(NJ&-u#M}Pgo^ER~Jkvz&Vg!1F z%2a&Tx?rVQzqem+-VJUo1>5(L`Mm4GZSsFS7o(3;ww#V8H_O@O6dqtT9kcQI zVllgXQT(xG#GWV$`+#wHk!}bXgr>-=oTV$_S2~9 z;{UEoCzIqFPk9#EbajAjwI23o4%SUY&)tLqeM;PgU0@wVHg_#pQBtA=xkkTIsM}uM zHI)|o9ZPzrzhlEvR5x4K-g%z7YRb%BbB7=VvEv%6eD3m-hKxe=*7Vn7b2jL(F6TpX wwf|iq2(B_3=mzaix%T;!<|x!ia~IX6s5mMMUK+B{Md`+SZ+QPS(R_Qq0bF7;7ytkO diff --git a/src/route.inc b/src/route.inc deleted file mode 100644 index b098e93..0000000 --- a/src/route.inc +++ /dev/null @@ -1,94 +0,0 @@ -#include "ipc.h" -#include "def.h" - -//////////////////////////////////////////////////////////////// -/// class route implementation -//////////////////////////////////////////////////////////////// - -namespace ipc { - -class route::route_ : public pimpl { -public: - handle_t h_ = nullptr; - std::string n_; -}; - -route::route() - : p_(p_->make()) { -} - -route::route(char const * name) - : route() { - this->connect(name); -} - -route::route(route&& rhs) - : route() { - swap(rhs); -} - -route::~route() { - disconnect(); - p_->clear(); -} - -void route::swap(route& rhs) { - std::swap(p_, rhs.p_); -} - -route& route::operator=(route rhs) { - swap(rhs); - return *this; -} - -bool route::valid() const { - return (handle() != nullptr); -} - -char const * route::name() const { - return impl(p_)->n_.c_str(); -} - -handle_t route::handle() const { - return impl(p_)->h_; -} - -route route::clone() const { - return route { name() }; -} - -bool route::connect(char const * name) { - if (name == nullptr || name[0] == '\0') return false; - this->disconnect(); - impl(p_)->h_ = ipc::connect((impl(p_)->n_ = name).c_str()); - return valid(); -} - -void route::disconnect() { - if (!valid()) return; - ipc::disconnect(impl(p_)->h_); - impl(p_)->h_ = nullptr; - impl(p_)->n_.clear(); -} - -std::size_t route::recv_count() const { - return ipc::recv_count(impl(p_)->h_); -} - -bool route::send(void const * data, std::size_t size) { - return ipc::send(impl(p_)->h_, data, size); -} - -bool route::send(buff_t const & buff) { - return route::send(buff.data(), buff.size()); -} - -bool route::send(std::string const & str) { - return route::send(str.c_str(), str.size() + 1); -} - -buff_t route::recv() { - return ipc::recv(impl(p_)->h_); -} - -} // namespace ipc diff --git a/test/test_circ.cpp b/test/test_circ.cpp index 0fe66b65ebb578bff8cc5f1b8b28e90fcd604da6..4ca7c68449318e3501b6cb14a3ace3263355939e 100644 GIT binary patch literal 12703 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 literal 12294 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 diff --git a/test/test_ipc.cpp b/test/test_ipc.cpp index 3bb481cb87017af14480259f3ea62b935383c5a6..1d941f8db2a5b7f81f6492f9aa4567c8d70b5db1 100644 GIT binary patch literal 13385 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