From 3cde8cd510428c8addbb7785ec6da8e17e35ea1e Mon Sep 17 00:00:00 2001 From: Kresten Krab Thorup Date: Thu, 18 Mar 2010 13:55:39 +0100 Subject: [PATCH] Implement basic flow control: sending a message costs reductions equal to the size of the target queue. Also, minor updates to debug messages. --- erl.sh | 4 ++-- lib/kilim-0.6-krab.jar | Bin 353214 -> 344662 bytes src/main/java/erjang/EHandle.java | 8 ++++++++ src/main/java/erjang/EInternalPID.java | 8 ++++++++ src/main/java/erjang/ERT.java | 14 ++++++++++---- src/main/java/erjang/ETask.java | 6 ++++-- 6 files changed, 32 insertions(+), 8 deletions(-) diff --git a/erl.sh b/erl.sh index 3a7a89da..28e1b28c 100755 --- a/erl.sh +++ b/erl.sh @@ -4,8 +4,8 @@ if [ "x${OTPROOT}" == "x" ]; then OTPROOT=/sw/lib/erlang fi -java -ea -cp erjang-0.1.jar \ - -Derj.threads=1 \ +java -server -ea -cp erjang-0.1.jar \ + -Derj.threads=2 \ -Derjpath=$OTPROOT/lib/erts-5.7.3/ebin erjang.OTPMain \ -root $OTPROOT \ -progname erl \ diff --git a/lib/kilim-0.6-krab.jar b/lib/kilim-0.6-krab.jar index 071d7e9682cdde4b7ae77f0160f40ec22e0f2df0..1eba2171882ec463df451c9c70d52db7dee5c523 100644 GIT binary patch delta 24783 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 Q=E8{H63NA<_;@M#Khw5NdH?_b delta 33525 zcmZU)W0WSr(ze?+rfu7{rfu7{?S7_h+qP}nw(V(SnrCM3^?u)ZC=m8+_L)Vd-g zBkstRAhe!QGf-BNY!qRuf`yf$pj>iT8H0&B>*v5BNXCmpi;axeLCD+uD04MxY0~|j zbe7W{=M(0Sx6eb0U%pqTh6gv|QZ zg)7ef*S??ZxZ`;pJfqq|RM7&7HE_8&8ntAI3Byk{{xXv|P@u&vF2jzj=g_@}kErp- zEvxP-t9QjavwczMEI<|APP+T8Nhn|e5={Au+l3z&Mt?$I)aeqY@TO(n<0my10d`f& z4EOH`#YY!Ec1xxtp}0e9BAVG zx5G>EQo9v&feH?|yj|GO`zmew0LvxVx1J+~L(Nkm7z84d4)e zxl#WAbHn^U-00f><7Q9^edTzt!oqU7Lc@PW$#XajQz=obNtO`6`)a^Uo5*asM)odv zFuTyi#&mbNOkmp8sHAy7?tL@0?tH`LjOF+Fbr1g&wi;JvYt?X52py4jYj_YhSRB2= z!^UWI2qmPMOMN-6|F>LG!lGF&WFosTIqqbhSKScLKWb8I;Pe@7RuTyQQUfg9aTpCI zTu-BW$DV-@4A?yt79I0ib#B9U(7*Tuk+Eiih}($2gy}8x_yHvZ108J@c{EvhOknnp z8sBNwkFjEnMZ2mTj6X3RWNa)L$}_K7iM_(Bih6|GiyXwb-Xth&IIgTVI)Sz%kdtEg zIP7lq=7&_zvaGhadstku+{SJBIP8TA6=wQ!PmX~AXlMq>BUAMGtjT6O8PzR5TYSXX zAe5HaiyO=qAEu|10*=EN53WXfJw@#!hch8XT-+<4 z50YB%xxu}DGPBW+A=$}p6!Qw>1~S`f6_=nki=X2QzEa6jUbsM}8PQ^A(}h0;wBprj zE$tNm^z3d7ec0X@5^Vf~uM%H!uLG9X5DlLGF=$BglV9L|0}Zo!Mi+R zvcnE3QA}9J?biG6&X*kLS>LaZ+*p1H#u#u|T@Nk<*jkI5faiP1u87qp^|-V+4_zaG z)B!xObTth_o0_gZ`VS6pqyCD;i5v`xloj07^4Mw0)ocTwg}W>RsXXtthl49uVB?bd zDi1{`Ue{vXTFPDFA1Uy;fiGT=&2bh`sHm&9WM>Z$>Z?ydErabL7Iy{;Bq(7XgRx9>N=&(6InAB zoVFrtY`^ozlj7FI5teSdP}i25MLV&aV4Hg>9jUhZSVL>Bm^%%5NR8kaf*28aOr_kf zT)n57yOZlZ85DYU?I5h$U*%NUKuh<}p_8mRw59Cr{T2L`)uY|&&f03!)@{H6Ewd#l zwHNFdXVpJu@2tF1r4A*hZuy{wQn77&D^76fa*9=PmggjK`;{eKjM>A%5+qTXXqZxm zGTX9-cxRxpyqHBnpt5`p@WGYd`D)aDmr-NAxLT~GdtEW^gCpY^`WL=`PE`6G{+`JU zyJ`FphG3m+tViNtg#(F6Yuf|@P{lYaZ}H8&o=9?$mse9XJ)}<_{PC@gzJ`vZvv2`a zp0pAP7@$1dmblv-TvRm^vFLOrK_qk{AWVql|M}>bwl-%bM0ZqG8s%3+x?;Z0}w8OyU_Vpc8NOr$zJ+ zKD-sc@MdlJ13Z>bq@WK5^LSkT*Kfx89U!?79cIqqDhbHWDf&)00L72>lVl<$(z~i5 zXJk#N@Y8RxsPR%qv(TP4S!5N2W<*0d#FJ^k%N_EfdTw?*alBcuvd*c_qRU9R$#XAZrQ3R8nb;=;Z z9=RRTA9U*cZ6sq}lLtO|0mf7Dm`4;AfY~xb)jOK=D}3ZDp6Q1_&MOKGAXrG(>>2l( zamFb+lJ}TVC^qqvLJyvSapXmK$oa8gsv}y_i`=;eiDZ1NC$AX+Aow7`D;8_0gBok7 zIA&undGNvhV6?Qx2!|&e#8gOmS0I5VTu;WqI&%-DcaZZWjpEai=mUA6|9`#w@8*M7 zUIB443K0lsmH-Io$NzHj|3-&m4R{~rRo8EQ>F2~D76=?%5kho>z7$(1Kun+@X22h) zW@DTHyt2e9nH0S!WKE|h;QV)5c+F0~YU>ssSIbU1N2zTzs20mDbTKuF#*)nrSL+T} z-IW^4g_L61)T_$ruhSlLNeQ>-%?N|?iv&7X$y}ZfUHM=ND;DngV(VcVbWqlC0am$sqdI0OVWD*ALwIB;x$dXx@@Hx=z{rfx4uPSh5PG~A1M z=t8`TjYP_z&P9+wT6n}^ftNmT!)PJTXX9kb26HO&GG7M#RV&{wR545M|NFuz;)9)QuiyK?e`+;HA^LdA% z3tr@y;m`y0Tv%1;0unWDJp2~*peJN`a&{xp7c&+ked+|YvS#_X>7j#5Z;N`g>+oVx zug@wJJZD^U95Sm5z~FgP^2AU=_+yQR7OR+N*=BhQe+qwEQJ9dZI4#no4T%(dG^7k` z-h8MN*!jZx5|+htKDZzXP5ne9b5-en`XCc_PaVZgA_6fzdK&o65Yiwz;>HqV=yY`P z42xnk_IzV}4y<@#_xV1qmr-nT+^YunX$`loYQ9{Qi5d2IkX~M0iQ)592Q}qTUu(WKzFT2tN-Dq zAeMx=xcDIxfChVv6m;oKP#{*PtVtlzNYAdm@Q9t@Ik0fJEIF|^+iZbP6geh6x;3*6 z&mAhtJp*b@qdSl`g?`M@U4z1bOPG|&qyU~HVwD(%#>}D1vxZPHE!UhZ91hf-YKkU~ z*&(ehMoeZanoMu#CoyA8NkaI(FOO`L#MEe9oB~2A;ATAZ8YmYNq|l>uEG&NhNRhtM zs0?+(ggCIu#*tKfn%HVj58pziOvzAnaBIuknO4l(`_t%NW!nOuNXk*l7UP=k(hc#L;nWK zds19aQ2HK04)3Eh7m3?aph;v35Uy`iTc+y(d_e)O1_=)Cbf62w?amCLu^;v&!MeM$ ze$3i1-dWyFC1R$Is-Xak1pL(S?Fln@_bjvG)#b-4*-=oQ4@uL#(LW((;;TvaMTR1* zgVI#xjWPtcmhIkD3?$81SZ-4gH3#d1NUdM0V(wXz-<_MUtZJ$yV#US) zY$mZuYy*sG&e?pn2MO7KQqfY5R9$CKOSa2Z5)fXQ&%4ts-As({$~;bIeP1JnyhHVH zVO$`@iiXH<;D1E_BuJHz6EINF@V0clH07>&jZkw%4z2sp8?X zBo$YpWk%AHpdJGbm(x3>AC9C?laNIOXlqUSz={9hCaL18Zc=DL5rV|z87Beki zo$fyDlZ8K|ItbApX4pvmIlhp!doj#EGUqqf>hyy97z?FoSVddEgc%`|Oc^@^P&gTC zEzPtvCvkAdGqb*T$t|wlg=F3C23NwC4~kt2_%hzgn$)TGQ7$;ar{_2Qv z1xL!E$Q-xRKsr7U=wPLDs99o@d#Ee2dvA+xoi)+wi#ekZ4&5Dh6&zdIwnrZPM?4N} zTTP7-+)1qUOLWM|S(STNwiO(lm`?g|Iil~TDiu8ji=-`4hQ(cHuociv&Mu#%c3yA~ z*Yh*5YulIZ0xTf_&wQty&*RffhWrLD4+wAmP;DIxu3|$3LmD)jVFcgSX}dyL^u9p+ z0EUrmGlHM7Ugtp1@Mq!#;vm1ty|elCeqGv*i*iW<&+84lzm4H2j$e97+2?^*2kk*f zHP4&kv^QkStp}OeoRkIXb862A+b*?ky9HX6`lS#<7A!9TjBkC{x}$$2>)R0XFRlq_ z@G%Alp4#?V1I`uLP}#X86eiFr@4+@ub$LY`L^Rn%5QZbk!F)Xv}Cy1wev6t5Qbj4vaEIrjNh zSTxwx9FiBxo&BOvq9GleAu9J$sl^tSozyJyCM_rgbWf)uLAS^poN;|%+xM26+B=%) z&Uml@R_|8%qYq`;UxK#$IPiP`u-nHuL-v)*7pN~EbKtnC<&ACMATeApBRd}+&R<2y zHP&}>qx#cfhl4&!yvMp3o)b%(+oH@%71=Ot(g#L`MzDMa?3ZK@!t-{Gg&EwV zKf^)JD#38QOyLZ;MeEJSYTKZ(`9^TbGnyki zTUYL1`hV{SEt9r!CYuR08@Bx$wF`S7X&2p>>cTs zAw$5s{1zoy-=FjS<(!Z<4mkv@l4Rv7djx zhh>vKBK^4if`{+7eq)!@N5f*{^VT#y%&@NW;S{T*Z#a_}NicOtqtcZjVnv`Q_I3+p zBtl`E6LGCt-LA^Q7#6C2NF@cxI>tvS+AB}c>5vS3po7c;_ev2U-#yoKw(r#Y1`YMU zAxTQ8+NA)+X=HTZGs9fl{H>M`BeZeA5#$%_zTIDf4u3UnNxQW5KBy4vU_ab|lHmg% z>JyzlkV+4vGtylLyGys&Ce-)Mc68?r^;+qN$n`qvH`@T+b@H;55DoxbaD3py_gZhU z(X-Eis+)Xjc5RTXuC`1(jb?ary;^oIg=n=lUk!oA7HqNcKb!UP5M&6|YJ-z46)|*l=jt|N6Lh zby|#U3%c3U^g-08zf%O1KF{}}{iuLs&+iy9cfCM}(Kr9GcJ2`>EG8pWzqwjY^rmPi zop)W}8c?WFGUysBn_{^C$WC6+)eqRm58Oya zsqzJ2pLd@~cUJ-wVT((~8$$ysO6pSUKew_UoLd+BJ?6{1FOAadTX@ny1l)Q2TGX-r zB7--DO~hb2P+3tYLAU3AEd-{*wo-v@quRWdU(=6&%wWNz*T;c(8kB7xyeyYpqZnDt zpR4>O*<2;2YmRa0)~SIJ*wq1cv`j|GP+Gu^=CFiU$_?<(yMetbW2jlTBJ0;0ek=6++>AKo2zu0Gk}lP@pKypM`Kd<2!JRHKq$&k9gVe4H?j6`<@#>k zQ|f%&E+ufg404(8VGd~#N>&C%-)Q{?{=b?1-^y=e0PrH%f24ygOgUrQzlFRQa3CP! z|C8d2+B&#+Dx13K%Q~A2y2)5NyO`RUI{i24_f7myX)k2g+k9k^^N`f`u*mI@oIXGL zx(Jv9VXq{l1yySqK~-541l?k!TdL$voYh#|bXUJG#+EcFuA^KeaEMsQXmr*9Fc{&h zPIc4G^r!4cWV-Y3yFVT~EUN(Aj}FAVDES1;fo7tt{sO=5)S$o@-K6I3oFQat`V?KC zy#rwk0_Zh9fgR-A3vELh8wUQ9bBMz0JxyB1=O@Cg+d;KC-w}Oe8bgY!Ww4S{xsU7-U}#b(Qj}L&z;U@UGGEnRNn}Q7 ztRiySTd(f@!$nIZU2kLktLUu?8`blb;jnNoL8bUaY$u-oBlKRg-w%#L#<}BhSpmB; z&S#FK{L_ubcq@1Jq;z58zng?Z$93gM-rpuEsk~pmwj_%V{Im^2I6R<`CE*_UN}3-M zVlDqPwcO1HU_|VsPSsh6NA~_im98a>e5f_(Hjy~s-92^jryWdLWg<;wB&NYM_c^J9 zvy=fE$vna|?1J?n{e)`>WD>Z`%A-RCge<4+)@n|=ZOmK~v*fl+0#qpuulm36W1bG$ z>HK^iQa=O6Q-IU<^nWx&NP2=UI)Qt>shdv!Tv~HU;ASw2&_tjoF&E42XQjWZZ}X=r zki%IHCRrN*VwVSitpJDU>Yx*UX7GXS^j`tJyFWWw(qMbL8Uof^QnH&8TioNdC3udl zh!ZJ4f9)^WJ4AR(0C?S@z9|xq@wZaNksGu+yP~7IgrRehzuD1`PBjuzOPRd>zbtTcLUq{)pYAoHpFn#QUd;D_L6i;yztHC}a<6y_8sM+b3{VwoF-}(dx zt-jd}@?XIq6Zp0Ai)sv%6n@V-1pH*$R{It5e><-R1S#-8IWQ3bnfxD%0oD7@Hm*ZC zg8XM73tNKlPd;pX#u5Yj&x`=R0`Na2u`z*Q{J+oW5!-^p|5JftRJ3KG{;EI*iGuWK ziPscR0OkLRKA?ZaLdqtq=CWpLwY=sg-{rKlk`cr*a_uQ&KTAV^V-HruI^XprA)ZNZ(Q%r7=e4!Z*> z!H{s$^$ylVp!TuJmE_embBE$^e;kTj0JgFDyu&;~?J?i;LHIQC!Sa~w7qIo7;bO5w z?q`Ta@d`P-G2}6D9RrTgnzrx0`_CeIQ+_ZfGLjGq3=F*T5TP}5TF4Cv^vav1 zx%^Wq=wqEBS@6WMHrtOTxvz?Isk2E$4_KGoVc=|DM^C!?H1=!p`(p$eWzMW~fTK3B z8O5M!#R2Y7b~jFZqgA0uW5oBQjyd8%)57%#q2rbgE2Eg2QMh8%*n8qw%-P`I64k?V zQTbmDcPaVUW8nmoG5Gw^;Wh}XYJamROqdyR0IDBpk|T1V%HbYEolZ_1>E52z$!8E#|5GmS=*a-s<6R z89ts%e1@~})4$mHh{1}Mg3c!&qF3pwwOwoZ+e)>xxuJV+uKX3!`~OBo#g2`+)E z&5h%YS)S**F0*W;c|2kgrpKhw-3FLbPJiI#XZ5_y2jx(zgUe&F zTT9oAMtH>%Iq$(2=PT6kB9!``yNm7;&1!ApK$TMXn9i`6k0hA@Jvkk9EC@IRtt9YP zjx#T#v(@LAygnMvG=S}}>@^W|kXn~eybr;C`uo(trOhhdh?17g3%l=mXtfu{z>Vz8 z2}KviKmbO`9AZFhVu;x}-RdUqet4s2;J$l^luOew>#%1{Gb+e6R+gB#@EKB)JHQ>! zkqyD-^C(#}F&~;)i!)r>V^Q~HdBtCy%{PYanRT@+_!liJIP|;^N_6x~uC0RV&j%cK zpMp|z`rs`zqhlC0!Mq4n%tk7_mN~U7-m>WcIvlL+q#DB@vuuhOVgMslICzHlrBd<6lKY9%~!=DK1 zjE+RT;vHvd6gx_Fl}coj7$4%~w0_)k@Z^X4N!H!)cS` z7ADD^B(I4xMVS!#c>mw46mNEKf62dP#q=L5sd3j}kN{I<+rMh^4?lED$kpOGtIE8U z|ES5A;?d!jRs}-VAO{?YoyMTrF+9!;B7l^V>TrS&;4jKUIR7MJWH&SO9M6;W^=<(G z;1j|jsE`+K>(q2q1OZWIYjBX4E>=e6ZmqAzp8|viWwKffq=9Xr2A`u-jnj)LE;@v} z3Lgf5YJS&Jth@O=QJ%W7I8Wn$y`f|mU$BERhWqY2jJly*dbg$~xZ0o_VbkO@>g27K z=P3Yd)>aH8F{wSP++S}UoL?~J)gb%C6}~3L?DNiSt_ecG$cZYVTJ6L%55QN+pHa zGMF*LwQOBqHs<%@M5ZKlAhpV~c+G5fe_BDk(b~!LG|Q!-Al^^@`8Vga3JqLEsn|nl zalxd@Kp;Ck6iBCJxEOLf1IsYu#q*^v$oXtc8-tBxBxb9%m+ZUkw$w4;5PTtO(ZvHG zgwrYN-WZ1Jsl@1MRHz(;1DROz;^qT@tzG;@?{^mYWn0$PI)f~(^of^W!ynyYiWLjk zV0*3*R>o7Wl-D8H$L+|7Tl?$}*e6&HW>sd}r49o;7~(pFLg4KI2FEb#m-yDSf<8kP zXZf`JbdMDutCh@`$>gz!&XDfoW@jXk>m#!FGD28sUtj-wKg#<#olpJaFDw>+VZr;K z`17~vphY-eRk7~BnBeSM$;c=tido4L{tG~zG80LrsaKHmy(UW{iz`ErfL{U=9-%)c zh@qWtvbbKhcwT0{{=8pu{A*V+IOx%1r!%?h8{p%en!g_tLW`BPN%t72V@0=PGuo^6 zcUrDnN7~=}MTGLC3eea#rj)ru$=BKZE{oNplow^dVz+`de?Wes7k-<&k)+G#{lkvG z!F&d_NoG=g%rkHu@$>u>Rpv4YE>A0l?_U6d5|$jZV*ZN?nxYi75BBuG0F+?^RxfTX zyK2(>$?0%pT|DkH!i`}p7>w`v7nKPfo_NLGoAffrCBXci2E^%D|G`+{RDCpFOz9fi z{L$JV3ydyh{C>!a%}BgcCLY_8IwB<8AF$X6?BS&krD`_A&H*0loQ>0kaD|&j zuE)^^KI9l5wh}_$@e~*mNqD2ODRKwa6uqUG>p5uDX3vFB8xc$IQY`@i`N9y5)j%Ug zU;6+S8vxnS&TvcR0Dn1I!KJRvLgB;$i8NYd2NjU!MV#1K?kLQ3-OnAI4IC5L=xgb^ zkr^_j=v>Ag6q7s&YY4BM+896EYI{9ijD zUemfvqUOI@i)f+^BOM@ESyvfX^#@-!&!p*^V9%-nBP|lBCY;Dp6^PL*t3sTHAq|ys zveYy^Mq1sJ-SkYtt-w7oV$XdRH40s&Op*q+vfnpuC2B;g(L1<{rl6k#CKHmcBN^B^ zsY0!FJ!dH-Uh}y0)G{KAX-A6>kW)3C_~9C#4@gm?a_7ODze{*jTt1icxdfI373e~} zJWuQdQ-y1fGBM5yv}-I_#yy3CcS7h@2SsZ&ShXmq^Kk%m<#=cCsfmy3;irFS%*rDz~H5etrX@ObLMBce%Q_B@mLH=BV;gM6GD&n!}pa6awQhWD3# z?EVCw7PqZAvcClJbjMY`_po}8Ji;K24Fx)4K~cSjmc?t~m)i`z z;c~(5IMv}no4?g@jZ*op!;i>N}&FO})`fhXJTi`Q)$M{${K zMM`AF%DCZ2Idt7$4wJ?%otw@PzgmF2TKLEov58er5sDqK3|>X`B7&*?_U9(g72M_b zZ5RF9Ye1t<$h4j<>$3UMl3#_VaR*E7wIK0HZ|j4zj?f$(qB79)LIp9U8u|t{u_H*F z>=6dw-ayLK^>SH}BU5UbA$NPuaa&OiJd#LgVUa{Sz&vOwp%TTg+ar&+Cni|;WeS1E z`Gb(+BQKa!pzHTDm3J`iBMkZvbmKh>`Z31Qk-ARmZr<^WM49vzr}SoQ<5q-d4l`!n zXzC~34$O{0)ce1NgM+D#U_meF6CE;^(0Blepn42+hUh()7VTvL?`ej@^a^>ZpKuByr zKq&vG8X;?FX=7yX@!#@8vlg_6_Hr`6_+}!iX(I{600KbGO}hp80E}WReEfve&4yx# z$N+?`p_-HUUP*FhV8I32c2Nk{RQ6Y$F$~qTS>}O|60@)tx68(PT~cwdznjImkaT|2 z6zfCodyZRr3(M}&dx5*_Zue=<=f~;9?AKFxX;@hVWcr95qWHk}Lq@>9g!c`7blQ0U zStdxdIvBtm>{K*>PxoP^RUhdhY<1~Gj_tym1MJ;6KRVx_s+EFCwUuNEWp{2DA9}PU zxPVOtrGdlR#4saG_$LX@Vv&ysYXeI=9RDc{7r8ye1B<$d7f(y5cZb&7rZL{UL#GY) zph_IiEGxhBrBC$8v5cA}E0MXAzZf`IA}m|RkO|;C#&tLiruC=-hN0DFBPf(@3*-9Q zo&t#ylgdW)Ah6khRBj@IKkqc9Mgk)?TNlpne7} za=^nlQ)|UUE+Y*$^CI&?t+~3_AyFo+o_Yo23W{!*=t^AZHODV1t&#^d61?*fO|W?g z9}(al%DwtB8r*6DsX@Cid=(o?@_^lMTh_>go4EaO-=o1CLD{^f$jO2k8C-D3_*hSk zn}{MRp1QY|zP~2gy*6N?jr<#W)H;32^fxS97H<5*heFe`Jd)QX1(asSU9p~D z>vsXNZ_|RP@{=Oo%q&Hhm~~c@+SqHE5IQ@fth}eBFDdc`j97|z=UZofc84xrKEGm! zSoE#`Qb&phs$W-u0PZ>Jsh!(`mln)JaXs$s#yJQj&Dtu)g+KDAY4rNL^@MW?TmpcN z-YQ>K=t-yqnex>bLyr`e!7St88tVD+aip8*7VqM5ARHwt4E(VBO|7hiHkFW4S1J{{ zSe~){fvK{}xjiw1vTWW218v@9-k=np-U(T!fCg-|iV|mdbmBqGL}ph@P4A|FQI`lp zXiW3XizMDgFItxVq6A-a6;|&7zZfu2VOVcqPBFlV#diRlk1xq%9z8)+6s4%+Q@1PH zXc-gMhC=-OTvja8IC)R88a0Q;+<891gj!sgCbN$)7Frb~pX>{Bf9{W@UGjspLE7r# zM&Z1^7ZRb19n*RN1z1Vw;B^_ISLRUZT)SxL>>(_tNfg@`De0YC=aDQt#uxBtI@ZXt zvANg`jO5%cvcmrs0cOVtG29si%D#`o>I=F}>D@DOw3RY4dWPLKB+9W!SJ1C5*x2Y! zafFRXQ_^@{uxZ(g>kVY0JZkAep(L2QL{x%hT8PoIENP5a)S2yqu?-6S{;uPa`#Q_t zL7){Cd_Z?+fSVLC;q+A9FbxQNjH|-`)gv@-;cTx{%!%Qv>*9pL2jXgu1r%;;r0E+2 zJz^uRub8D1FV7V_&mqbcs)+a~N@x3ojpw?+G)`1fecEQBaODyevXGP~QjVn>Gb$Qm zFL)92RYvr*7L`qpoo^pWlpBOnFc*#spYEiS;E$-~MxxQd_J*JqU;#i4un{`9gb^oB z*g>j+r{@;^J}N3b&rP49pOm^f*DE@WS(L+;-wpOJ4(e~GC|RZ;qO-fB_1y)Y{)W{d zzbqCL_)+L)1MB)MP4t*#YOgNNHl`_1M8I{ff4-aGIJeN!Q=wQ0a9?;x_<%fLM2ONu zb)9vemw&8fm|Ud>BL;wZC+j7a=N6EkaETVK#&5*i@(3Xn!=yb4oXJvj3)&O07UbK# zD)vkr7U-Xi9}76D;jRy5t3zSRyDV)I$d_f-s|6-DpKFRFqe^QAu2tn#@o&b-Wl%=A z6$jOZJ^~yTyqlK%V=;~oP2=xru|6fi^!Ew`BIj=A^;NjkngDdZ`EzdNkWZeCb-5=} zej=Ya30|GNz(f}X^E+iDKZOsy6x0s)@rdl(N?DpFXHKfHjTKb<2Gl4rF<%#Pe{X@a zU2d3APnR!FG%AZ`WXs``Fbx?3`y&C(vidKlVjs6sWqUVo{%)Z)3E{ZW=#opSU-)zksPi5#n zPESzjH+QBYPU)uS&Xh9b&503Kpb%#oBcsn5Z&a}IYym`0sBj%I`%mO&b5FR9EX;LL zZ9!To_5-OA`scV|xX!b`^2{1%q^P#vFZY><>C`$VCt~#J-uZK8=VVtox$~4OWbH(k zjfrod!-_HrwJNoc0V<&lo zXtd5o_lA#=sbDlf4~BSc&(SV;wo+slCop2FXN(gaaHzyZK^uXpm?m8 zuT@*=d6!8Oa|xg-rnd;}v8bF!zQS@8BP4^8mDxgMVcUME-(u zH!|ex!MU~BoY){JGQmI~e{grq_m~`pHhqnu!*%H+0RYyf#XHO zY^q5Q7}<$2FmYzYPO;c7(kDkXmHYi$x(hQlg==YRcboo~$aGRv#EYuP`)WSb>rH;+QrntG3g&G2 zg`|?r-8m6M56f=hj_lyex#h0;-uqP3P2(*dUfG7a8SmtB;?Wzir{8f9Rlv~FyQfD6 z@?-Ri^Igg@1US#{;VJAXrko7>0OvGxd_{M~m;J?J`Nj68u&|riwDOTDP)q=<2btDS zcCE57H7pU11kLXH_Xt>YL}l3st9breWz|A5sWDVvZ-h@#PUrdpK#t(IXhYmqM)RML z@)dLZBGdbNA%3+#==lO*8S*k zQjC}dErwPC`!s$DRTSmMaYBF|*ZMKhV7EZYB6ml=3?l%6!JbD?7&&P(%WADp zgw_2HqRsHRM6J~ok^ra3S=&Y(di|UW6w|iq6uJ3PM=cJK_&`=Uf+s+Bk;MZLSNpg+ zlL!xQiZUoGdEWl{yxePUe!btW;>HtQ$A(ODXmX;y9G*cTXp}1{S_ArnGT|EAk70-> zmBrGtMGd|b_BnG#bF`7fi;f6>*i`clOuOn@mU+83+>tWz%5(sX1>fu1uedfK9(E-9PsnDkQVi2w=tvV zdc61won|=RQzITNFzyAKX#A5u_i+oP1s)OxZoZfA|h+yx^YDdi*Z`$aIpsMN_91jK$51?vc`+ zlM|XmwXV-AF_`QZ{}xUn{`0In(WPn~kQI^&m*vUHLNxWu z(M3IeK0GQYuXhrlB8Hky2Qhj!i`+mhi*=%yT%Rh3jr0t(wG_?)cxr{X3gO?foQS*P z7EPMBscGRv*W}9k+ZM#9;jP>_i-=J+f;5{1fuXsb0?NuObg1q7W%#D|lSgXSvuT0o zt$x;cm5oAvTfB@%)|0u01GU#IC@1t@4~ml);hV7g$k7APBwRrTrIMGGD5zen=j5=0bZowm{iCsjXcWke53`S0PQVNe_SJc?#_cd?> ze3qqyHUgQgVx+>31mZlyxjIx``=jt6HM3W!UZ5QMLgS-#2U6DR9Mv2Aj)n!eZ>C>l z>q^n|V>UD(bGbllMzlZ!Dsq`HO`Q<9N-$v!%GxHMVF9)&RQJE7XBn*cWkI{9RDpR5*LA2meE7(9`H=kG~UF?&3Me=<392q zAA%G_4U6f3*nrnp1thzb;Z zP+o}h1QtN-fHc`h*Oo;R-WdGj@JIL@kyz98m)?bsKCTXeEtyu#w0&)Z%@FhU+Gfq# zV)WKy!gV@nMYw5cRi?*6bZ$_!Z>rcQk#Qn`O&wvmrzFgh%+nHE^N$6&AVEc%r0IOVf^uJ9&c_C`w-(Zm$G#!ClcYrQt_br#Y%C&!`^D zFh{Lq6Jh`aIb{zNdIRwwuuf5x7RTM0SGF&M+Q$<-hGw@ReKfD@6j zlR~&tO3I$Zk?6Ye<~X{+s%#0Ysx{m8SSi%Edg>)(I(8s=)kPp=g+#lbnfgU)XTyOm z%8(PT5)H0cO6qwsI)x_H{pZ}&RN!y``LqTuDgcX);*oyHec=ijQ)G|wDD508fA)sXSN{+m1jmGZ9roW`8`3< zZltmffCaD@9P&1@QLs0;?f(u3!MJUFaL8ZLUcDhHKCsDO;a^|rIA8H7yCS_Fy?<4@ z1K00>HoTI&dJ~|XgQ^q&1pGI0&-LDG$&^dbY#hx$*}^tc44xZkyIy8bVjc=^cf0TdaIc=WXw$FafHc9P zrC$#)=V~XG>~qdSY54Gtu|SmlIIg?LLWO&TPZs7qC5}}!MWe{UKZTAx#=<_We~oc! zzd%<>na?|O&nt7!n{rP;s6$h%OGa-%jBWt+?3+Pj3T@Y-w@&g-A_9&8 zT@$T_hU}A=nz1SZoD!mBuGcoKNFS}9lVuADSVxG&6ewmF)kB`3l)my3>)ywN+fr)W zQ&7248&M?RVrIg8P@HY2tX)A`fIRWcV2fOffo|DrTYIGje7ZmP&u2OZ30!PRiclG8svibx?Eh(X} ziDL8e#OwlcF+i$zm%=*6PFYoRN)UjfL2N&uO&aOp*T-IYLDy-q_rWC)Vg03P(E@#H z2;_({Ll7SThP^*A^$2TY9@>EzMu0)hf7i%JQnP0X=dxDmOCo`@WA1mb(R~!V&Z&p{ zKDmeIVdQ2EPL?I44#v=wWvCC>Ri3HoWe-4xq~I&sy2sX#fm6~#^Y>0*l zHg<*)yZ-GULK>;ygSs^l=)Xidz$pu1_*uLmVcizY?nGm|FMS5S6QIx;wR6P&hNdrf z;}o}Z>K3F!;X9O%Yt3I#)y_Hn5#D2j`an?N>w^y&1=Edlf}!(g5(cP&_arxmQJ`Q# z2X?X+z{o)L%;!pQ@8-DtgJE5M6XMbY_W|xs+^uD~oA;8`$`Bz7` z8Ld~V(q5+%xby-Vy{vPvwB*g$Fq)OP2N|)WYTrfu8$|nzaW(GIGJfQ!71n{*va*KC z&zdB((e~e@wb~Sc%M|VGm#?i)hmbQ>DpC^tfU@z58Wvlj{|eT*=cGdU{Sq3$OBYVR3;%pb!Z;+Q7<2`^ThiV95_O*^Q*ih(OWzaWH>AEO|BCH} zH>-b}!3NpVtx`Ie#t$k=2^7hO>hfI zKujPa4 z{CVBc2cnVSPVp;%+=&bJzhlB4;rLCD94XuNWDm%6=^GM6Q@>34ycQp%(Z|T zb6}NAn7H_uBA>D>O+AP%h6qree~{cnONK zR!@fgsHa_(OCI>*-)!93t%_pJyq+#*#Ifu==$f1cfmWaRvR0H*3&fGN1GP!-V^Hm? zf8fAvl=yAQRx94hu_TqHNvAb37EA$KBHUh@scotC-dAW&bjB}})luCdcBWUN=N*4+-(Fim+uEl8L@08`sYYt#IE&b4sbz4S76hXztVXfxkUjq0k zUidx%HoOTZqMMvHxUZC~B>9^BLN#ir^Y|_-Xk|$U*a)%1JVSreKR=&DZ^oT;qw!Sd zK;tG{%=1<~IqG9wA5*Qu_%6UC)5?uvt73yytG^mp7;^8g$1h^pgVZxxKP>nW8Vg1} z7BJ3;B&-ses3fXh;PLc@;aaIbVL9;CTx+`-fuH)2?V0DYfjZrSc2#ja5*enyXisb! zjGf0~ritFs$M{3AvozO^IEqz=Ury$xC9gDF-_pZ%1@==Zv(+iE?AZYsc_5bl$4N8u zZ46`kJ%pjp_CKF8njj`^ST!6b_`WkCF6GPRetuc?=e;NF`@ln=F7ER=>|0hmrVhM( zICOs=sYdJe71RL1fIs430OiI<(C+>}ZCwXER^R{kJf27P-h1yoviHiSNH&G6kWKWE z8A%dXA=xuKl9gnZj3mll$qE?>`QPVx)cgbi-H`N zaap>Dv^Rt+YQj_aGR4`X`aV|rJn=tIJyBHtCBriL^~j`_Z(`kj?&0#p@ZH4o<(@WC$26&_XK1besLZd2toU~nmun^(*l zUQ(3Xkh{4SpWK#Ji?d z#XEIxIz;@1m&=UI4VRhhD)s3_NnSpE2Er@6`hom1X?Xn<-MyPvw{?@(Zgx@1q@?KF zO>?Tc+Qg}OQ^FZPQvfK+r?Cy-tk=I844tRQvHzzXR%L$_}Eve*-zwxgzkKX%mtwtw`lE$kZ|AtF|p(s~@EwfY_27*_kMK-O6Iqc6amLoY; zpv>OO&8vLBk~8m`9nMD_q&dmq#TOWD9i4rpq*~Vi3-#h#wTa>J8*sr!<*3)&1TW&j zQ3*NIS6Ik5-;(yMGEm3I)@7)pw#`e_5pLUqIu6?QqmFrYA5cfXt8L84pP)jCmDjSt zpPq)m{lB#|F4-7}>53-(u%$(eXe9}<*LoRwmAH7%wv@6{D!kUbTi=_}9{Aq=!``0> zrjb-;c9^MIk44S+buHRk%qm~q9vRl3OPdmO;P@14OQhL=LGV(6J^;2X$ALenBBy2? zyF}^`&8k=&+5BGoEiEbZMolVN`u5=?wupAf6uSzZ0-w7CJ@wi%3-3N*`tQ~q3Jn!I z2a30|_SEDNXMR9SBDHTqHN&8N2@W!m6zaZ;gM7*F5h6vQILXh06Y);aj2>I7zNTiL za*;FnLQw$T4E)7KLvEsYrI}tjUE!OJPC|t(CPhl^m`txVP41Z{Uig|k%$U%ZF6Mo( z^=+Eu^>y*s)VHoof)l^4bXYL`Sf6N%jW&t;PM76+H)S)3TJ*gimUfBV&kNiP8j9xl zYfnXa$FCQ{j>bM2P^X6@7A?PsI?UC%QTM#$Q_*{@&9#IR!g|%AFDEz2x;O%Y-+1HR zJ))Wmq*{+3llYplhkqd~qMUi(PkV*n=+>il`8^Y}*z8C*o4a(%#WuPIns-GH*&bVK zd}ADz8m?@ewu{Y)DUPP?rRqWv6STxvMM*C$g34-8h4yESw_AcC; z>h}`^Or7k0_tt7T*mU4C2Bvn;;zdP1v-)um{VYry5vW=E+03PDea{yEHobMX^_Swz zX|kqNorKOF2U&b|vMs9VB>#`(tAnGC2OXUj6&>=Nw->1OOYmGP!%5r6I*cX4rQb#2 z7PCcBX02KkZQzxz(?ud=r3!@DoAa&)MS;Lo8J+^7Ey+t|+A_4wbg&2fUs9a0cN<68bQ?THv+o_Y02YZ$DBsY>GX z+RW3#)ILM{{)yy1udew^ARcV^^*`RA_oas?Y&aTg;5@*3kI#*LU#3BJnNe_gaZN^6 zcDG&@Xpmhy3NabC8oxW`L5avH{=Kw6vEQ=a^m}h7(?(uf?b~KuYOqCo;efpVHSYRP zs_(_Ubet@l+{MY4(;M=y#W9|jpSwzXZPmP4FX1uWMTTzAH;esbjJya(-sBwbIr5|w zw(}uRqZ@VG-V~`pqtE+sY#BxrWpijwn!DQaE=z1V**7t2cU;rWG3V!XRV~VO7r1JW z81`}O{hS0V-As|%mFu|XZ!hMPWYFF3bi3@W>e%=dyYI$DU?H{0e+kF1f4I!Uy1F^= z+P=hdJ=2%WiV$nR8|pvv5PbF|ywr(SmQ9W!u9xEYsigbrN}ZD=7Tdoj3D4lPtvK*b z@bf~n=>BkQa=+Q0o3q_yzgU?{vK+ymmO7RgfbVthyVhcwZ)h~(!yE=}wiK9NNVHw8V5?Q0DvN-ITM47H$V1Ni{Pc*;cGk4pu3a&H zZ~g5V0la$q>#A&j!b6g#1?3;c#=6b#+$VU<(YTA_-^w8Iv)8qr$d5ctqs~|6+|?ZZ z>G8tvS@stVQZ?jKEFIZZ8H^b2+$x~!u9ZrUFS1W05qqz}X{xt6PurX49XyvGNV`{9 z`Y6_^S!32YVl1Ozz`i&I(SRquY2i=x=H_te=EZQ07vv9;+iBx-z3Llcigv{I6QZ9? zQETw0_cv4)@KDwpOHvd%#-|L5G6`hO(-PD@v&5~IZG5e|{*^>RpnlP*!rp8?CwVA) z0QQ8t^Ku*8dqK>oq4ZlDsYAU4(qi|@XzZiEynEa+?=$(xXlYZ8l@RfV?(qi?QN5;y z&aJeYh?jV2J}o#))erxah8=!wxL3F)soRpc_4WP|haux7v5~SAnCY)YQJ2q7l%HZ? zrfdTH@ zY7v(SvqBxE)7dZi71(;h)|Xxuja|-Jg_gzmg?bO-b4>BJRWG{b+~+ooj&@g)^I2LD z4e`bvnCl-eTp3N@6n}NsePVEU@FbxsCl=vR{0QV7zCS3NNrtzuk} zt28z$3g3;rqUr=c-g+FxG~q=WXLOVxjG(f!G{ktPw6hwLlmMNNZQ>0>4HMijgl zK|F0czY>g^DDmfPu zxIy9s8-;CGZ|Jjc+DX0|^kX}m@zyDpK5R{Qf*J2#PshL88FS-4g6q}ix4E3mO`qpX z@!RX(UJ$(GfZt6VD|g{=CcwGk9Um8?%*q8QFP4HpQR7k$oA?6`Td|-0btHQ7JYvIH z10o`yje_)YzKg4h_TBu|V<_=K)#KMc8Bdek9v5Fk4aV)Io5; zq3jaB&zW=KY%sC--cL$xbrF}_GEk7wTUCl>uN@u@Gakktu)%q^`+fiFOCsV+j*Zn~ z#U%u^hjGc*k0=x(EG>$4CMw44EcI?nQcVh)ef87GZ5B~&c6=hTg{W7ae_bb?o^;r` zmo*;exwO-7U}wtQvne{`{h4(!F^f2Ryo+41z~<3l-y)zJmw%}EC-D2{$8S^n-l(>y z*X(quh+lqSz2d{sb13vXBjHcdZ6fNcJP1?n@1F_CD!(VR>)BJwFH8#NwJ{m|s$3z` z9H8EgcrRGgz9>86SzCelo~O7_)Y_xQ_?tTFZtkmF#wr7gh`07fdPjKvMMe%wH-5j> zR1AkZyRkHK@UYP;Z%?x_HL&Z)QYZ=K)Cu8iZ!L;E>K#?RE8*15`RQ3@bknnrye<(^ z9@aRMb}!8#*4mWHsQdS$DTKS(Bg8~$SadbAn-1f)yD37QIs^u35eXVrkZzIwM?875 z#X1)S%FU#^Bz4rw49V$m;~vFZ&Thy-!rI6p3R&rP&BSlCim_W6hZAR=w7T8!|uZ^SsYP-1BH_}yM%s1t?dL}jlMI**gjwK{*kYYRzfc| zr$-7o*8H%H`DeGUy_xS^q17~B+CG!ZH0WW^Qb#}VqRtD%)uUMLqP`wqO~OuQd|x}l zN^ldyQvXA%Y)yJQ10tw^%&+LeRFk_B~@Hfb~I(NgB?DVg-3##NzA&fiCcuI3wpaoyti4`GQ3twV^*Cd^Dp(fX<6GjLmfH@$9sCdomY=?c4`{SvQy8`(YEd{TF8X^EZfuCP*c(GR!=G0Z$YEBJ}uq3{#}B zXA5CG6F?vEXy7uH7UK5JcV^ir%nQu6pikJ9XDaiwb0#o-wjLMJ$rt3l7nD_&M9x$f9BE|Q z^6DWw%r_%{hf1pxK`3)>=umehOrzMDIQ` z8_L8arzMZ6eS;GY)I-(^;9)bjWfZ5D3L-ZP6bvg1GifpRzt4zU4I1!4F>9(A(k%9! z^)i3I{+!VAL_K17P=;B1_BLnoj0bG4bE*tW+byC>@Q!F%6yll8z+?O1Rrpd3SO%z*hMW7UYt|+r6)Bzf(_aq zaMI_0kT)izHiaWHx%@M)+5q{_qj~P@sNC)%DoCSR)k=`4%6yB9)%3VXyF2bU8(<^S6)VwvS_luf6@bIuah$zJOq=p?Djq&=&qa$e;2H zu+bp4%pjx`dexE+YjJHy)yLq;ngV-m;QU&t_8nsn%N8 zM26tR&u+~gil?NeU7|J^7iaBe3ck}+(Bc>bQ5td5x>QJ5VXgEH{OnP_{*kd!;39JY zs~EBTz1@VVUcr}$U3bGE@_}Dcxnt@-7q!y&u%^r_gxZsIq$PY(lO{X_9Gfaqt#bi4 z%}Jffn#X&O%9}A_Hr=nEcT=azUT;r%JQh->9=0<)8&Et+kW+-sT_ig|Tw-X{r+V<~=_->&C8s&|T7kd+$3^BU6Hbml zO>ZHT6Lil$KI}S@)?-qsJGz|898M|byGz2GET-I?kh>Rh1@Rkm)w_6PILR)UYhAtNXPt5 zO9#4d0zI3sY_l&sYx4jx2YY4svNfIHj%X|6FN4e*jQrBa~gHrRAs$emc`+h7$|) zL=~D(2l|ncH^4{Le~#+uynIw!+4o(Bc->MnnG6zL?3G8}dpYOs`H}Yun!h$}TY1GHGDh%qb@sk2I}#U7>{H8!+nWz4HWL-pb%}pjGr!~hI1R7Y@}Yz`jz{P< zncl|xv5Bnrn7Hh z_!lCvORBL;0+XKXdi^H4M4?H{{ff=F^`XKZep8^djr1HMz~_%yC)=9Jf^-zNX zYNq=$Yb4D*Dp$53{Q-G}v+GYTo3g2h+%qyNT7){8DXM?#;`l}XDJH*)apL=yXWQnr zytY^3njh)g=3kAA>*807|>MwelLlfk&`9Z zjqz5YwjQjJ4Z*yslKgdvYApWQ)tUZRT%wMLjdvm#f0EzmQsE)$T6OjL%{&={GcsB< z+~DB-#N)Y88Lz?{f8j5GHoSHnG`Iq5nsbZQI1@jA6~1Mg?-)X~jb*^{i{hi`&71sY zOC`zeR^k!{r49U*!^$^kB5`OSu!+^}_Ri-JtA*|2t6Ogo4%>{DC32m`V_|H;2oguq z1PPCq{iADnroYTX_i2CJA@ScJ^LnAPVZ!YdQm9V!%+8AqxV5MJXohsCkmtbUHg@ZL z9)`Zcy*k+<{m4vF%X?bY3yFl@{48#56R-n#G>T+I;68=j~Yk&5!-B#e#(t<1+f}<~b(f zj&?Tq9(&G~Yci<_^N>&r6Yx%h5p8MpEEx)Qe4h zYmE^iU;5X-l}i=c4Za3Wy*#|xieFpzv{K%+=v~eA`Mr^)(tQ4($&jO^m7jw9*0*mT zxO^=YB4{j+-z9j+b)mOb?q^Yv5~FK7j{)(Ig==!=UF9+@yh>H$_XjlN8&u;J_>YLf zp8t$<%K+e*h`z7g%s>gh9^fE$gGMo&abmQAq3vTeV)`5VZA^_oL5t7ld0(r2GbYd5 zYac(Kin+Ch@guUMB`}lVBZ#-TN4) zCP2A;fBUiIPiXoXh)z!v4x(2EqezYhj~B@rZDW zx!I)uc5fGLePY}b-_?6&+!P^(M6;QJ;FsAn3 zbE^_oEVlJ%n!i#?dvi-_SMvMMs00ik%cWi8bd8pYsoXXC`GpgY?SL)c? z;hWYFviy9xYEO5Z*Wm`DW8~s2gIH+?#?>#_Zx$eJ+T>-+f$*L@M=#BX=NZH{qe3i| zy}9L{U!|)(H>C{R8Gc2#S0NVa?o%`Z%Vg3UdH&|dhaKLZsIi&3_i9c3J8?%#pH{`IOl(eTS${U~Dsb#onRr=LfS7-D=P*kH_f0$& zg`FA{o259LU=@1xLRjZhi7s2sQe}}h+h;vA4dfLKCoS}tLpEI~ug6!*>>dNGT|{pp`JA1C5D}!mUpmr#6&Ll`7WV*R;_ez zM$%kGpLdO&tM#>LA`ZUrf?1%M(ODT+PUll92^bnO#bcRozHM*FxhPia zuo_E_mwX)oeCvg->@@PjF>NWG~l=_ z9_C>g!Ccni^e+2mh#kmUO7 zB9paV-Mw}_-h796x!|sgdV^&GF2>_}3JUHU9|WRC71(rxLWjvb(!D4C8J?>zMVmlL zkiV71JA_sP;J}OxuEtNDWEV}5^x-Zx!orlyl>84N4*p|&cF3L7Ae>kU_Nzm~DU`8P z*pzh2k=j{Qvh1D058uD7_pIEFYqGHkS+t-M3Nb7J7ojd$O|mLc%vH>O_sK8wF$-*< zit<~!^#0DO$B&SyKE&-kiq|B;Lf42oICL*a@v((!(GaBKvfKsQy_EAE%+swCMG)a; zH-k(xpygTtRvLH{*wd^NkFu`ncj2-;q~KV0w0t;l|DmU(kZPO5O><%$GZpofAhyQL z><4tD#iV6j!gg8}G;i{AmY-NZx%eE8#nJLC`Gxl7U;<(BFEtkUUw;Ch)FqZj%%yJ) z58+>`HvJ$yHl0iMWJvp!i!A5$kt3-lL~Brs>YE&}OgjIDkwai5e`fY1lY(hHqHbDpIL73Om`AHI7gUvAVzIQgl@PVhl%WA~@*(7fSkLSo;Vd^KVXZdQb*PoLkAjjoiRo~-K6DO)6ik#9}A>vLsvKC zlDopWjaiF=2uK@CX;eGz=Pq31uS+3}&)Tozn-9WI_ z+tUW|I5&jC1-*WXlxh7^Yb{tbU8hknU57WbN1gAYC!B@3mjoF6AT4r_zKC%C4L*H_W8HZ$(GhOWe!i)^*Flwkaa5 zoQD1L&Bs$6mwd-%MEoC9xk=^)e3}DdjI6gN?)yeT#nlojpNzx$8uBXp2`n0FRNh|s zVzPFhqDi@x_Z!|!#`p217&qM+FC#gYtNpNo0xNw<{(Xyn)|uXSdV7Wjs@BK!RJ{ek^oR31_H)(mU$OH(Gk+69JaeWnBH>HVqI1}u zY`Oe>ueUU7o02t`%35`ca}-ndZUp6TJf8ksmXARgEZSn)cRP5xVc_qwGh95EC7oB< zEX`Ed`Z>A z#2=hJ&E8K&MmQIDN!{6I;9cVZVcbmFLkXV-CQNgh`V4ONzp!t>X%p56#+OzME5xpf zDq~`Xo08xk7~{>(dsPVnP7I3iP6#J?!Nqr(B0qW*oZ$?tAf z_(*YroW7oz^6s}ns}G-9JDm}U4}^Dbv5h*yt`1=qw13YtpUWv@40O} z5VX$s+yoln0_j@JD4j`1zu|!SE)2gq=fIE%Nv+$#gX9pPQt331Xq1UMPI|~PCJG~G zhD4#P)n%|i0?-&W2c!Zm`%WD48MS&-U7j=~0L^2Tg}9)##LGj((GqW!AmL0XecHB= zc62G}HHZ%#3cGt7atAF-7z)XOqWqrM^e8yM$H17U1|awlin^gY5OTDa%Lx!VREyN% z0FWxQ_2x84BkJv%x{xdgE4npp2naA9feUtAhM`+CBMWk_t~(b}h&Jz20I9-8ndhm1 z+((;#Re4+qK%yGbhb#on)j&`ySJidbKnT&SFE1c75aicw>RRd`6mV4Pb0fqVtyi@L zGK?;zZ-oS6qDoWWLhxXyRDKs^S{#*%J%sR}d9{Ba6i_7g;sf*x4yv#O7pg~zO6@a4 zVQ3nZ6`DeX!qP;blqi9^8Zqb!x->@uT7^zsk%STwAs5mDoHd|Ks6?Cwln0rptJ8q? z`=L^?P0;f+s8ri9wCg-7b)Nu}RTP;5z!V!mtb~bMH>HTFje{x`(882O^IQ>_gi0tL zh_L~-iZFOxZVTp?CyJLQ40A%+uftM;jTWMKGm9`O3bFYP6G1g_(s!5) zvQ|LjFgelF%ei6U?hzx=Pwxp|Dn92f>h#_>(|f6{R@Nr@0DAZQ7OFNdt%zbhgB$FyVoYv=!47ZHHq z!O2mLeRl~)2PI?$@|R#t%t)0xrFmnvpdN24R4C6roW=J4`9q?O*v7mq_Ab^L-_16;(Kxr99iR$%HB(+om*ja|Lp{VpLAh0c+ zq|ZnXxI^Li%wW*Tg-7xDXMray9BgWWGrnAq1;RiHlxQYWlw1L5T!As7s&KM69N5Fi zhZKLe+^`7Mq;W1PU{nA!fUNAv+F<{~Y*A18!$ZaYZ`YhG5cNL-`z&KEDP}RM*+y=RKz;lEAuMEn7qbuO`1ICJCVZHcj9s;6?;7)ah74Mc5XG8<^ z{(zx7d<XK;|cm85JS_zHav)%k&-)^z*O9pP=$znZV1RFz#!}I{o`N z??18atiN^o=i%PJXT${GUMDl?TQ3;vXUB`6f|M;7H!8-?+@1b40v>b228%!vIe4>* z1umC#X6OZOZh_urmIL>Y+;0kH5P zjQ`dB^)6V|Z_>c{E=&?t)oEXWKNVnej)Kj}d?Jdpb5jn< z2`vv!S!W~YnmWL`2jfPypxz$nKBWoZvIpZuiRGG^y9$E-^n<(58K2h8fSNs+Jc{K_ ze|vx%3{Np|J_RSDlPx#Q)dC>-4U<4A*ZK`AAF)CL^uW0l7%57YOYDKM7U+Gc%D2PZx|(t%5g8oBpNjH5j4YgVg%Wi$)QN92#RGSN~;T4x61F=4D}BBKxP5Tk#6=*0X

ZXaG>#;?Z%GZXkI$jR4`{@jNec2m)QL zK-M9Q8t^zg_V~Z6>wm*(^(~Srh;of6$QTxa4Nm7I|8{muCz3@D95iEM19*Rqjnn=C zee&st06mou+GK4wIv$HRjYI^%))@hJ;WMoRA4E|_P!|!XQ0$d_E1L{*y21TyD29H7 z0P58cW*`=Fd_7=|fxU>FVxECJGr0fVa>FhT0YXPGK~%%p9)a~I{{)2m1>LVa1x6uoQWSd) zgrOUY03H<1h5|&OAny|c6fl6o`A|p*5`i#5fix&wf*DyIVHWXcx!}d9G1rF!LP9`kHVIz4U+*0EWCEb;}bL^{CHfLf(NHW^-wt;GAzgc%HY9;G4Uq;%V7bw z?NDq$93L)?d1w9~oD4|E2U{cd+dnuq;MoZ!NA?;orqa*6Yd^M^%KLffu{tZB8@Z90s&ke^V`vBR_7#?6qvvUTL*U*N(?^0KyJv6HO2%s zNa5rFN>>^oTnXAqbqd)dgsVZF=}sXQMDX*FDPWxxPJt3ievQct^bx^%p$OLhXdp@f z@Dsy@p_@Gap+FEZXkdf?1QA3vGlT>@k46QMC?g<80;(btL}#K%;JQ#7QDlY*_(=lS zfRad}Gv=gldFXFhWQG%HAq5RZDj_rG&=hs#kr8kugKI(uG|`!AE=*G31}QSI$-wA% zu7iS8gfX#zWIjx4fCyP+Ne&h<8vZS!KnpY=QMOBHJ=^4PS*VaHI%7xy*MVL$KgnPN zZ4}@LhkR0js?r}DWDz;)i3LDL3D!%>_5@)pG&1vsON47D)N0RdESZs_y>5IE341vc?p*AosLprnQ?K&d^@$htlzIdGdA z^u^Byg``}@#09#j;Zjg;zrO%Ez)J%%{sf%T;z0wKgE|DALON(by$iQaAxyNOn(UBM z2*L`J1Q4JFE1EAMm+7ou3)AE<>$jrAwG0)8K`3TDTLt~CK)hJ z2fCLUaRSo=ywso#Eqc&~Wz-3L4hW@(t3U)$KLv~J zftSCi0i1yiY|g;GQ)M>gnE1eTHqhS3fm3jOCE9ah;9T_?dqy8mSVVwSH5g=|v&4WD zJE%Bd^rVa)z?BB!M@X1z>;wj<;RZ}1AeA00>ux@ym~8TdMF>e-_P_y$3PSE`5HWIdiPVJzJ+lN7? zQDeLh7g#L&2MN;x#a!TN+6@Ej#KEBm`A`&i%?Gn3*h ztPGW)K8wHss$ZZ<)TFD%1Dd?Wg(iUiGmi`0<^k)G%XbPH=K(9jAa)8lB88!9#0zy* zIDs{w{7NSoT!4@nc3dqQKG4R1_NlTrejWYlo z2owf~z!i^w&=q00IF#HAjp~ZPrGd}q;rsxx3D_$rH-|*vv=C_^OA@ROh~fakreI48 zih_}KE(k5QZ3ZJkll?8vxY`xAc7BtW= z2C{d?B@Vj28Hvm|K}BQG;Ep&rS69WNGkp?ZKbE?HeoP_H-xvv`()g1yMQFwY zWQG@r^MnzgeKkD~a$Y_}!x`tn4i8F3XApicEWq6t{6i!OdXboN0+XOGQllh6(LLY< z#sXITL7&Hw?C0rdI4u}mXJWuq3S`$lMZ+0VV0-)Iqcew6;I%+o5jtZl4Z2WXa!iYZ z(ITtD3tfDEg5UwlGN80|B^uF91kWy1AGOJV7BZ@lFb{w&3r=2_-Xb&9fTsc&bC$AT z6z-fx#&Thdzyk%ar6y%T(U^`?Z1;Q^9lGp-99ZVmd8$mm05n+-{xX0bmJ5*t&#qI1 z1v$7X)Z^VLL{A<(=U()kLek2?y7kF}b@LuLfyn?2P;r3UN? task = task(); if (task != null) { + + task.reds += task.mbox.size(); + if (task.reds > 1000) { + task.reds = 0; + Task.yield(); + } + task.mbox_send(msg); } } diff --git a/src/main/java/erjang/EInternalPID.java b/src/main/java/erjang/EInternalPID.java index 47ee6ee0..e5639f33 100644 --- a/src/main/java/erjang/EInternalPID.java +++ b/src/main/java/erjang/EInternalPID.java @@ -20,6 +20,7 @@ package erjang; import kilim.Pausable; +import kilim.Task; /** * This is a PID on this node @@ -63,6 +64,13 @@ EProc task() { public void send(EObject msg) throws Pausable { EProc task = this.task; if (task != null) { + + task.reds += task.mbox.size(); + if (task.reds > 1000) { + task.reds = 0; + Task.yield(); + } + task.mbox.put(msg); } } diff --git a/src/main/java/erjang/ERT.java b/src/main/java/erjang/ERT.java index 54809c34..35672a05 100644 --- a/src/main/java/erjang/ERT.java +++ b/src/main/java/erjang/ERT.java @@ -458,6 +458,8 @@ public static EObject send(EProc proc, EObject pid, EObject msg) throws Pausable { // TODO handle ports also? proc.check_exit(); + + //System.out.println(""+proc+" :: "+pid+" ! "+msg); EHandle p; if ((p = pid.testHandle()) != null) { @@ -711,7 +713,9 @@ public static void run(Task task) { /** peek mbox at current index (proc.midx), which is 0 upon entry to the loop. */ public static EObject loop_rec(EProc proc) { - EObject msg = proc.mbox.peek(proc.midx); + int idx = proc.midx; + EObject msg = proc.mbox.peek(idx); + if (DEBUG_WAIT) System.err.println("WAIT| entered loop #"+idx+" message="+msg); return msg; } @@ -748,13 +752,15 @@ public static boolean wait_timeout(EProc proc, EObject howlong) /** wait forever, for one more message to be available */ public static void wait(EProc proc) throws Pausable { - if (DEBUG_WAIT) System.err.println("WAIT| "+proc+" waits for messages"); - proc.mbox.untilHasMessages(proc.midx + 1); - if (DEBUG_WAIT) System.err.println("WAIT| "+proc+" wakes up after timeout"); + int idx = proc.midx + 1; + if (DEBUG_WAIT) System.err.println("WAIT| "+proc+" waits for "+idx+" messages"); + proc.mbox.untilHasMessages(idx); + if (DEBUG_WAIT) System.err.println("WAIT| "+proc+" wakes up after timeout; now has "+(idx)); } /** message reception timed out, reset message index */ public static void timeout(EProc proc) { + if (DEBUG_WAIT) System.err.println("WAIT| "+proc+" timed out"); proc.midx = 0; } diff --git a/src/main/java/erjang/ETask.java b/src/main/java/erjang/ETask.java index bf46c59c..e8c04edc 100644 --- a/src/main/java/erjang/ETask.java +++ b/src/main/java/erjang/ETask.java @@ -129,8 +129,8 @@ public void remove_monitor(ERef r, boolean flush) { } - - protected Mailbox mbox = new Mailbox(10, 1000); + static final int MAX_MAILBOX_SIZE = 1000; + protected Mailbox mbox = new Mailbox(10, MAX_MAILBOX_SIZE); protected static enum State { INIT, // has not started yet @@ -144,6 +144,8 @@ protected static enum State { protected State pstate = State.INIT; protected EObject exit_reason; + public int reds; + /** * @throws Pausable *