From 808f21da61c6dfd47fa0132b71fd3c5023a4f6ab Mon Sep 17 00:00:00 2001 From: Roman Shevchenko Date: Tue, 15 May 2018 12:46:57 +0200 Subject: [PATCH] [platform] Windows file watcher performance optimization (IDEA-191007) Decreases buffer size to reduce kernel-to-user space copying overhead; bumps processing thread priority to lessen the number of buffer overflows. --- bin/win/fsnotifier.exe | Bin 84480 -> 84480 bytes bin/win/fsnotifier64.exe | Bin 98816 -> 98816 bytes native/WinFsNotifier/fileWatcher3.c | 80 ++++++++++++++++++++-------- 3 files changed, 57 insertions(+), 23 deletions(-) diff --git a/bin/win/fsnotifier.exe b/bin/win/fsnotifier.exe index 8ee73f23e75dc07a446a79e832efdc8f1f481a25..5454e0b47ef6f47a344a45ee05969b27acb07b83 100644 GIT binary patch delta 10321 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

CF4! zjHL&-CDLLr?>S|g@{#g&^*IQx--9Q&t2@+P>S$pM$H~$i9%VJayCAv50=1JqYRM0UORmalqM5QJGMTW>T4S#=vAU`OF-~c=Wd< I>NyN8jny@s%w+=dj;E171 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 Y!yd(oYXULZdz=USO4v>O1KOVd3;KNSf&c&j delta 23248 zcmeI4dt6l2-v9Rk28PQBC?j_P1;slGC1l}RMdDBO$#q6UQ)|4%ueCSYDz2Wbc{~rJfF4KcR1%fujl#i_xtaem&?z3f4|?g z_u6Z%z4qE`Mk}h^E2`YLq_U2!BQxhedwZbc_e~p|>FECD8$Jgg-T%ObZJJKs@GJCQ zW$=bSv^evI-O%xiAJ}jo`t!ainmT?D*L3{iJWZ!AD=HSp+!__MwO#Le^!iU*e-CG$ z@nE);mGX_Om&*Vh|H-9i_li8GlqmoHVM>L|)~FEAL8Xh!OX1kVnM)s+d&Rt;%L{CP z?Yzriw#}_7Vppi5sOEOH`uozL9P@kG=Ig4t#Xc%bSbgoI_+GbowuFD;Hjw3Woo;O4 zkRKJLy4kntLmbk4QMKenr{!35&+&!2RK&fg8^luhWnJ&cu%B=QOHOo}eF=_L-CP=| zT8zG(#wk3&y%+nKC%I4eb9}ET>6RHTYEg%3zG7GS^X?G|SEaE)HD9#XiQ3>0=>UiE z1$Zhu9Hs8Q$J)GB_B&R9nuw_TVZ7Zvpj&|qE<1C_HErnk!f}BIdMxX92o=BMr&_}I zii`&`+c@_~WS97PkMM$FcjZBbb{BfZzQG99svil9{Tp9_YMlM7zsMM_tYnJA=&2Rj z99`%JWBeuitq7=jSM(Oa8_$$L=AX8Q@-g~(%#ZKZ_hh^I8U2E8kK7S)pQz^d?U(-P zaG+tn4B*abe*GnQF+h3DJsEB=O;(ep{II^Omt`E0L9c8ag_if1b|PXKuW`1@YL z?jukW`xJiHYuBQKc5!g;$_oyMu|eh?#y7Og1ii!fGIE(U>->~99dQOe5;1LD9TaA57lb#CJO3|xaecTfbo@Clcd&WM#rh= zGNY5Upl<@;Kzqlfn?JIT_|xIYF^^pJFhlVA=p@x#fY{2*j)~O{->OsSZ{LVCcl=eQ zDEw)k?(y5SA@II^w{{u6)sG7nM^nuo+f#o<6KhA%j#YiL)To-z@;0CFh=HPNV({M- zga5SFCoT3Xu!?bWg@+k}df)q25IXCk-2;`JXg29ZHLAzsN=3my9Bj!JUT6r9uyy^P z4mX_+H=XY?^zya{5>>Nve!&nQ5sxz3{r4YL_*k=Ew13RQx&$W&YGn*f4~jwe-B+@9 zUt>txU-J}4!?@h+Ei#53TF4a&spJoL8DN?*Gku0ydAB6KSvCKL9;H4N9gr*j$`^kX zioc2-#^+HqEB;Ot} z+qL#L{Putdk4N~OfvT86uc+qF?I{>|W_J@Nu3+s7RM%F`bIsmUcwDQS%kIjC5>1nS z6ctglcIj*sG|+!*mpEC^>h}8%$JucqOckx`Fy8u7)D9Qgs%0+Q7h!bdSPG&`;=49y zo9D!4o0rFBo4-t-H-FygOT5W1%tb$wU-ugj)K3(!7=B+St{?`G6^{uiygv`|pXm8H ztg2;T;6uE`zqkHA`Xt8^^CN%3e*yb*Ti0ZEnvdu@FK|&YqH0}L%h-3-lWjV+c7k55 z4WGo{=o-b=^AEbt_YLb1vz+1mrQ#&MxA^F810tr}!nhHaT&r7B!W8>fZ9=N>VGEaT48O1gK`6uQ1o@D$ot8ITM4fR#yej zIo)hnJl&M$bGkg_#M#d2=25N*ov5hGo5khN5GBvKF-%&@zwFUw!&B45k#pQ4omRBC zVWZQCk^^~3K$dAH%G+m)X9i9mi_?!16+=a1siK#~3Cy}a!d$DXL%W{SZNT5Ma^=X$ z$~{gw=jlY{9)-=Ehuft#fC1P24I^+E`d_U)6MOnn+BCJ2Cm7?084H+F+TC0s#(1^v zk-1DM)7$fVpibx;v#$FroH{u}UmB{KGyKdoT9`q#J#Vxy_7C1aurF)j(*vWY?|l^4 z(tC&~r+XTCJbBBaExCG(-P(~)2&boXt|X^NQwUCZrx)tBG)G*YkE>dFGETM3(W{Ot zrJgwXIDR=WeC#1i=t`;1&IXBwGK7d@F>xzZ#u$)?;(}C*&J#yDEw1Zsq-wr_!*)!- zVN-6bOoMYh9}=Wu9UB!eaLwvdY~iXRM(^eRCE-SH9^VY?ps8tXD^JX0{| zRGw#QvLVm5HQbl60ep9lNUwD>C~~FkVvlSV+JYM({zHec=_4^Al?B?@Xpgy8tX25n z$W*q1KNuMul7pxm^EnZijzDeFZ!Q~A9~WyhnI3|8u5K3%H|h6@j{ z7f)kZQF$hE&S?`3Xp2E~jl;MCr^3MfQ1p|zMKxozERm)wn&~2r|6Yo?ophfs67!}i zy+?&NUbkPkumG>swP@ac(tAL9H+Op9(!4(B6_YsI^V0orr+b&?{sEH#ye~>`Zm0JN z&3jdPw@UBOPH&0keM@@H(i_m}ovnGdOKasGJSy%Ek@XKL=%(ruE3TRXjjG;hB2 zu9es3)_>O?Xf}g7XQbI zFLZi~HSc)oT`tQW?DS66yaS|nvGhLG=}pzVT}=OR;*w5xZ_V9)R%?$1vhdVSZ;aYvH#iZ5&Ka_R0X3xC?_ZPL86rMJKI z9`E$-(Y&eB8za3hbb2>y-X78$D7_V?PWNiftw^`ObT91m7HZzVy{EN@tMq1eddF+t zGr}9M8z{^c<9%)76Src5=6ywaeTBDH7Ym!10Zd}L!_?LnUZKfC<(wd9*r7o4H8B&2 z*}@su`4ALuU_YLbV~GM<1!6L@o5kw^o;#j+_Vq#Q-*LmDBS4$M#5ArK(|Dwr&xz|| zbf8YsU7KVduf0};f5SJ##dotgJ$_oj9E&lTpNXquxqR-B#q6K_^pFo(AHH*FBD=*e z4L$1;lESyg=dnNdxA94Ma`a4ii2cd8B=j@(Ex`O)7H|~ra1Q%PSFz&iR=}?$^cvH5 zGCY;P-!JQWP8Wi_m}ecv_03p27%PAOvn=48&b8A#7iM$ooxsZ9|0wG!R#lPbbYJm= z#8UPV-Jzw_@#^k-JyJ!M$;SiD$?R~$FAgLqs zIUzD0$Q#j+u~a-E))MXN<;apT|MdFq(1OW;sl&!a{yxNYkXU{B&;Z7@HP z?Ze+!gSxL7$&}SSuzPUtYlp*Pw&RXSF)ZZ2tEx-zNS>7)%YNh!XP0$fiv@!g*MY`z z#x3H%WsiGaq>BPmFQ%jnW`2 z3M-MfA0Drj(Tkn4mBL`j5yQ>+IgW*xS0VN;=nl*uuFmzp*I_J3Ud$ht@1#~Io;0!P$;t|@f&2TZ~9h$s@;Bu zfK1V-*ZGy4K#w0XM81iCpEEGy@dlhC*`v(m&X;P+{gn%`|L8E538T4HT>V0kt@UtV zk~Hkp%H>NZc!S0&pF44AXxTo*SqzgP_Hgl=GyL0$PXtUH z!<1EzspfO4`3v>r?>gM5<9X$z;XW>}YE9zhFzR37XD2-!urwW!52<34=y&y`1CcR{ z__E1I*l`|}JC9A|6}ctYnEfetc)&}EOiA+DPZx4faOi5sUMW%u}%=|kB??lR+L7sCsD-;5Y`pI?~~ zg=zDr83F7Zcb_@ByXggOPo?_x_a6Fc17Zs|s&iYi8%-RkCGv55McUbJEQ>vd!4i z{Tcg@wtKT@GG^kF3L@AQ+rtIZncfrAL1yj1pZUeP>0O#*@nAYGR?@i+V+IeIm&>N| zds#h@rVQXA^n6bmQrOQ^i1^*l*&KIGc?9i#pKgiE^4QLj7 z*v9d;zdz*S8vIQlCZ}9I_AnjBo0aGy+|C0lM+WxbT~?$H++QW;57;oNK7mNz9Vg8v zwa0wt`U3Y*DLfA2AiicrG~OY1t>}Yk{LG48EQZ@xjA#3K{K_%0tGjErxOil3bo_x< z@~y%G5x3jGhu}$nHvqF68qAMBzcRFs2u^Pju}f+bSKtEhZMyu-=K!U2=%Dr zU#v`UVRhWNsy}X^^i_j#ORZQHf{A$Zs`>1O?e3}{7|Y@}%Tl~|Iuu20(VWxO@Tk@M zjdO9(^vV{NS*x3h>>ZCxvo4#rt&U)Qx2@@ycOO@j?tARZfK|EYbSv&V%PvRG9Y+za z&{c^-!d4ABr<)8r>W`ymBZsHAl6LQ0WGR*aV}7#&H2&=RFnurMCG!AFb@43#$u4U zSsfzsp9zm;Vx*JL@azpE2F?0b#1~+i`t>RX(o}(1iq6&c3gjXa8;8rqV%Rcr5r1<- zoIXQBDj=F0Od(hz#+qiZVccXI(dYM4ZHo04-#?_(I~>{Od)l7DoYmqyXYas)1<^#_ zW=b+0|A)45bn8XYNE0H}6vJE6az$EVVQG+-6Veg~%L~$SKw6Su*)A>5NJ||9%*OqMjF`rI%+?upQQ6?Z2AdN#RL0XJ73n>$+8tE~lQl!a94>!bGc>HY&P9y-}E$Njl6tw7~_1$=1o)oTq5h@_l%-s zyPkBkhQWcT~=|!ZskS-&&BHcl9AcZ}vC5&&J65v? z`I|d7`7W4`s9N2#|J20H$L|~+G!1~+8y@jxlG%`=v2H%!y>oqxX`U9@^c$|ne92*a zL}Tohi*Mr=N+;)Itkb=|`dn1N+hP2J@3!V<9+;~Y%)^G7Hdl+yvRcDLAl4v;xx(y- zc?v z@v>)Q*iio5voqKP{`0d5hMoUVlvPXBqLVlu)-BJ)pj~G@*B5UmmCwyJe1?8m)fdlE zJQLdZ_s?asoqYJN2=)V?xhu+$DZIV4r>s%s)w{|A-u*i)CI7J=JI?)|zY(=EUz=92 zc5I!2TDI7y;E{d@i^hv0*kU}j*ZT#AFJgUOoXDo}*)NXmme49%__zCIKK7B?_g99V z-1cHDtL2})xR7n&qwBk~HMSY`U0Fchk9g!&e&HedvU#G}j@RVfeEselSXa&1)5gB$ z!}o?8E2g5gvh0|@^C})IbSayJcdA2t+1{Ss-@=38Wpo&a^PPJm@rC&j{Jn#>?u~JY z$mNc`r$P@*(L%8BWVu>yRq|t>l|GCUrSs2Tnjdg$lEaZSJ-;;Ij?XbKtuu|6ZIfS4 zWQN#DVr?i7kG0S%A#8>1;42TYUen-!xr@WN4-0#&IID4+C^)Qdm6(fg=vzFsp~6@= z!QohvJiWEl_^)H<@DCbPX5%6I9$*Ew>V4&m9pU%)_Y`-=fd!`7$I*20XT-NwYL5B0 z`19##6Z79tdAxRD7ueix|Ivi0EqP=czPQRXxBFIOWQygv-!24vh;O>|;@){2;aKL2 zdvBn__=_sO(3|O7-6kG#7Q^l5w6Fif&iSm)KztF5Jw3RMpTmvrbr|PnBO_MS`$Rdh z?pr4;7ULxuf%{f`rROjv2($3dk^bYI{xO zxik_dYj9TQ3Pl<3iA=5T*DuAnJpqUe$Ct>Zp4s9NcLc}Cs=im+yU7i0^DTy$hWKLH za8N7q4vI91mC3i)MC0LQ7iJZ^4&g;=a^gNf>1@1XXs0tgD|})%xt52$Hh$b73QfTG zlOh18?(4X!VqK101de5-fNogRQ-JuYN5+^9U*p>*hp~gd_S$`;Kk}>Q{`) zzrKU5;WOUI@V=I*4K$41zWk*(B3<;K@Uw3`)ujgaSNw-!4#R}ii!W>(z((??8#Dcx zwk4VFqT<`z)p!H1<+mFnLvyX7x3#aG(=suzBJmcOg_`5rJ|6LAAbW)mfAa&p&Un7n zYTA1m4vTJAgzy_If@*a;rSXb1)=OipG>(bXLMkOC1ZY$(X`WU?z!ZC;RJ8*;4*;in+L+Cf>5}n|E%cB(<2R1^d-Xmc&(rgSE%h&NGycYLcbB5KwUb>rrk(6KpK`+Lmjw9N z$@(4RX-z9a-#GfeobB18{8CdaKln}t``*_6PO)3iM~Bc1l|K|_Re$eWHQH5C)^<@X zi9HV6N=_R*@rt_P(k}Kq4}HI!W!tvDpYOuj`S({^T>`DPb61~pVO?!S*AiX2Jo&m9 zxJ5V0usx;wk-zfsJ8Yb7@pS}XEqddWOYl?ty&Lbd?>PT7ft}zjpY~=i@E<>oVHMnX za~QT9b8gN>3-7=Ak=|phA4X(MKCiw#jLotgza7d9?^#48u@=PuTVT8WRhY{**GN;O zcs0Q%j&v;P4APaPn@IPN9wR+V`WfjxQny9&xB;Zmq{B$XR~z`46!8^^_^c$|L|RXJ zhP0LR7g9HTHzhuPq+z6kNXL*Ckd}~cCf%>83BR`?!{121BfU@B6<=kEPY==oq$5Z( zNoSBgK)RmvDbhO9mq;6h;{3{4GF&J9n)DY^FY#rgr~qj{(h;ONq_asMAT1}|L|RXJ znDi>tAP)RB85GXG3!F9<--e3M3{vsS1@T!;`UL5-r29z^lb$90jMQGt@awynsMuag znmE$-G^wo{r7C-*9^xmz3p8$-BI)39sm-F))~HaM-<>Ac;8u609m7uAL8`ai`k{}` zRA`WHy;fmGX(sk0j_e}+Voe}E6~wq%w9i#yEO4|>oUe@UO1y;_-w9}+HsT z#A1g*eAk4qFg$7xG6E;}=2N zCzjYbGUABk$iQ8jLxl;w`w^M1xEJvj;%MS} z;uzva;@-r~#C?dbCNY!t5bR5aHVWuR+)mt|SV@*GFo4*Pcpz~s@nGU4;-SPUaRPCE zvPm8=kqpHYFpRjIcsOwlaT0MIaWZiO@d)B3;uPW*;!(t{CNhjBgPk~yxPv&ISU*Bm zID;6!{L@-6lQ@nzi#UyVEO9RJIARli3#1(&n+zqy$3jk9aY0B=K_MIN}G1(}*_`Zp6*R0fNQ-f0Yc~DWHuwgt(nJoLHYK zuV4Ui5OE4|9PudPG~x{6T;kxn~%8;MhhTZmbtXb-#>5PL>ysMv|Uh&v>k zloT@PN7EHY%K|~fp2V@lUc^bnDa5L?e5@>=?<`MT>?}`Qt}*(b4Uh$DoCS#MoCSy* zh*_MBZ*s;Hw>aa8Tb=Ohz~c zf4u6;U)mlHc* z*_`iqeq&?{6_MZhS}&G+;uA^!C>je&92p*yekG0g$c}UtI4hqhi@eUaemCM`@;l#e z%88#OzjIf>xoc2Ees#x27PzdAXb(j<5N{=JBF-jmA+`~>5+5LTzPmWz*6idr@7T(M z^aSH~>}G)`eTHnOy;L-a_iQgkGCq5*3yi!Ak>l9E& ze3iI?*!d#ZMBGgN7UF9=-o)j!5`92kJMmwMJBU9a)@RDgzd#&B{1@U_;*-Ql#2*o> z#4kxUDfwi0jRJ~^zaTCr=EOC`ZNzoNZxc5VUnXuMzD3+Zd{blGO|4|Wm&@A6PJDy7 zgZM15b1$P8u|7+-i1R&IPdB1-?;?o&4^q5yZ$sM)@qsax0*ZH>WPyE?h;k@AmJTpa*GLXgN+`g&k&MErp1tEI7MLAGG?~24O(A+- zE3xE%fc(yFtO(*H@-MJ5#sWQ6!d$CAFgTwOztzw_#l%yrQE)FSC!9*|NV+uV4pa^K zSCT)C{6mQA$X`xeL;exO4dj2^Is~UPHIjQYxtqvcOWZ;{jaa4lp~S7^UrX%Vaf>0g zlYgl*o_Zo$GIm`lUB%ZXnlt|4CSEKj^kvPr3+69!X20|lVlw2yN?SZpAR zPZRkUNmN>h-yv=#K22;VZY1s?ZqgW&xISAp*hLBmB0fi4Llq1mjwOEqv2!8%C2jktyUo514y zo%_K_6wpcm6~q;EfMjAj`8N{RQH8^ZJIFteSU+C2@WaIQ6d&$fk_S=1dq&!>PFD4>LR9dSDyun%z!`Iiyb5kErQ zK&$N2S?}>L&9LifOk;$66^$9myKjIS&;SQNER3tgwa#zh8NVXdZlY#fYLRg zo6_~eE^R&~-i13yvDmpHATCl-qQc#k@L%+9#!^2weL@$vdi45f(epEK${=?o=p#=z zzcXHL`bEBO!afJR93XrM`S09W)>=J^_3^({g!3cp4?J1idt;--dSVodh!SQOn9E^0 zj#SeQz$Xj&kC7U!e~x0Iona54llt{ll=Boe82O=st;wTV=xpanF2dx2h1Rze=5N$1 z#!{q39*Qx+T`>;zZ*#`}9dRXiIyqyRmy6;x)IE;*;(y9m|=*KSt^-(A0#k9<59@~+mGGgu1B-^yT5LY8H+{BGEu z4Orx*1mt-t0T@dGQ~gS;&6zAyr`>f{Ll%qg?DOIE_<<2piFHaA>t=LT(1NL>87UIy zYqqYjho6# z@m=X%;{U&N)Vs$}H6$}tEf`--8Stw!!_V#|;#lRlnqYjL<^8i;iEE)t90toc)(b5@ zUCP>VYy#*#DgG)81oc(fV8|?$_3thY(ujl97m9|FpTmo+X@#uE|NZ{y|9=1UpTB=H z{eSrVlXK8%dPvDwxp+b8;=E!A7Qdri#w{+Lyn6A<2N#r-EM9bE)dXg7-{zWdcq*&+ z3J>s*>w_TDFw#h&*5?awBP3ZrC}4p@^2xJ^w1jj$X$2|%?O~d@4{EHQbMYK$By1u* zLwbpHGwDa9pOM}sZ6{Uq^00c+Akt{kSkgGsG^st5d@?xi&0^vbq1Hd=vUqFKJQfsX zC%fV)Pvl1$OB!cgHjmAZsv~S9Z6;MouUdba$0E{$yyQ`0Nz+L4NDD}dNh?SjNSlw$ zn$IGbe_W0{PIIo*G;3`k8^;okd{D?q($frTa2H?F+*rD}C{8kTn zp*`^yS&n=hv?4@NZX++$ign>t5%X_rN30D^or^`WXuOTpdmI*yLX`-d9C@LmkP47b zgVrLo&t%GG=-f#BGK>w=1@i1h5R9?_OzVO6m4;sh^L+?oCJLi zNt~<^dLOA7c|WXO2P3s09|vv3I`)!?fqsT0;)VWzq_rY+F}5~3U@wN=Kyu5+|C2LZ zQPv=dm~!Zu;pl%+7#ZcA6nUVl&>tz^4)sfwcA;@dqOi~nNMW-vxS;i9Uq4b&x{gLX zTCNE?Fb(B#;yCCwBoV(IdK^g{=Xjb4qdFZ6D>Owa^a7G7dNq4ToQ1;`gdQ^upUkWYo0ki;=7pzl$>1$t;Ax)m`($4|l?VFKhJW15W7 zi4#{qUqTYCBD8m|taU8(JET;^+=VX3+F8Ur2*nR!wW|^O36l7qms+9XAI@wM$Aq3i z5?3#D!Zdl2IZ%^l9&Ql?`9L2+5`(S=>MSmA~nvEnXkpo>w`9;u8 zls^a^GgHRoLZ74jF6bX3KMUVaicBIF>Y{eJ(66vyk463$Xvl1NWns|2BjpP_^y4|W zI^bf_>VLKphJ=F!kz$qWGVVz41^MZ ztyo_DRp>8BL35a*EQ2CNA|DBjLW)K{4mt!W7Wo9|f(LOsBEJaw98wkXyP(S-!i0nT zgV6PB@aBiS&{Ig-z&9ad#Im&!jv(kkq%+719sVe8FXWS;XV;+s@@>$X^%&K-8lgQO zlPwnw%|sFxBXkXtI6(#UG}(WF7FFQY9Ay_l4{t>OCjnZKSzn2H9(kdML_%Sq7b$-U zT34<0nWp9^FeM{?Gjv)Frd#Cmpw+dqskcC{B8lS&UB3yFk2pT`5R&L_s7bj?AhgYl zLbz>&ezzG@DGJ<$=3C^Kt~>v52rk6;M?f`t8fIpttcNNi7WmH>U~@u)CZb{B(69Qx{vbs$-i=m z@>XVAHIc22L(!?-yw+y$z5pNm-1OI^mioDT7N*#-^S=i z{3WRP??dB|uYwk|qZ`C=pkf0p8m%a_k@7-KV#`c8go?c`kryiVsYG7rAj%6JM|q)Q z14zUO6`MaIFH~&kh`i7Plou-YVT4`iU763*GGfC-IE40~yx7zbyBESPRBT6xywH`D z7b^Awgk9(!nLn~|Di+q(F00vDPcJmS_}>S-j{J2sR^cq}$e(N2I-zUVvZq~o)a|L? z)3B#;Pt%^Ods_Fj?Wx#Xv$yG$=2u!?x%x`S0c-SnHoyl5@WYypVSF@L3)ZvWm}1R) ej9q6XNBVDISC|0-xp;&^)R$V1cvP@|u>S(U1^>zb diff --git a/native/WinFsNotifier/fileWatcher3.c b/native/WinFsNotifier/fileWatcher3.c index 84b97a1ee7f9..debd8cbb997b 100644 --- a/native/WinFsNotifier/fileWatcher3.c +++ b/native/WinFsNotifier/fileWatcher3.c @@ -29,6 +29,13 @@ static WatchRoot *firstWatchRoot = NULL; static CRITICAL_SECTION csOutput; +#define EVENT_BUFFER_SIZE (16*1024) + +#ifdef __PRINT_STATS +static UINT64 _total_ = 0, _post_ = 0; +static UINT32 _calls_ = 0, _max_events_ = 0; +#endif + // -- Utilities --------------------------------------------------- typedef struct { @@ -43,8 +50,7 @@ static void AppendString(PrintBuffer *buffer, const char *str) { if (buffer->text != NULL) { strcpy_s(newData, newSize, buffer->text); free(buffer->text); - } - else { + } else { newData[0] = '\0'; } buffer->text = newData; @@ -138,19 +144,17 @@ static void PrintChangeInfo(const char *rootPath, FILE_NOTIFY_INFORMATION *info) const char *event; if (info->Action == FILE_ACTION_ADDED || info->Action == FILE_ACTION_RENAMED_OLD_NAME) { event = "CREATE"; - } - else if (info->Action == FILE_ACTION_REMOVED || info->Action == FILE_ACTION_RENAMED_OLD_NAME) { + } else if (info->Action == FILE_ACTION_REMOVED || info->Action == FILE_ACTION_RENAMED_OLD_NAME) { event = "DELETE"; - } - else if (info->Action == FILE_ACTION_MODIFIED) { + } else if (info->Action == FILE_ACTION_MODIFIED) { event = "CHANGE"; - } - else { + } else { return; // unknown event } char utfBuffer[4 * MAX_PATH + 1]; - int converted = WideCharToMultiByte(CP_UTF8, 0, info->FileName, info->FileNameLength / sizeof(wchar_t), utfBuffer, sizeof(utfBuffer), NULL, NULL); + int wcsLen = info->FileNameLength / sizeof(wchar_t); + int converted = WideCharToMultiByte(CP_UTF8, 0, info->FileName, wcsLen, utfBuffer, sizeof(utfBuffer), NULL, NULL); utfBuffer[converted] = '\0'; EnterCriticalSection(&csOutput); @@ -175,6 +179,10 @@ static void PrintEverythingChangedUnderRoot(const char *rootPath) { FILE_NOTIFY_CHANGE_ATTRIBUTES | FILE_NOTIFY_CHANGE_SIZE | FILE_NOTIFY_CHANGE_LAST_WRITE) static DWORD WINAPI WatcherThread(void *param) { +#ifdef __PRINT_STATS + LARGE_INTEGER t1, t2, t3; + UINT32 nEvents = 0; +#endif WatchDrive *drive = (WatchDrive *)param; OVERLAPPED overlapped; @@ -184,14 +192,10 @@ static DWORD WINAPI WatcherThread(void *param) { const char *rootPath = drive->rootPath; HANDLE hRootDir = CreateFileA(rootPath, GENERIC_READ, CREATE_SHARE, NULL, OPEN_EXISTING, CREATE_FLAGS, NULL); - DWORD buffer_size = 1024 * 1024; - char *buffer = (char *)malloc(buffer_size); - - HANDLE handles[2]; - handles[0] = drive->hStopEvent; - handles[1] = overlapped.hEvent; + char buffer[EVENT_BUFFER_SIZE]; + HANDLE handles[2] = {drive->hStopEvent, overlapped.hEvent}; while (true) { - int rcDir = ReadDirectoryChangesW(hRootDir, buffer, buffer_size, TRUE, EVENT_MASK, NULL, &overlapped, NULL); + int rcDir = ReadDirectoryChangesW(hRootDir, buffer, sizeof(buffer), TRUE, EVENT_MASK, NULL, &overlapped, NULL); if (rcDir == 0) { drive->bFailed = true; break; @@ -202,12 +206,18 @@ static DWORD WINAPI WatcherThread(void *param) { break; } if (rc == WAIT_OBJECT_0 + 1) { +#ifdef __PRINT_STATS + QueryPerformanceCounter(&t1); +#endif DWORD dwBytesReturned; if (!GetOverlappedResult(hRootDir, &overlapped, &dwBytesReturned, FALSE)) { drive->bFailed = true; break; } +#ifdef __PRINT_STATS + QueryPerformanceCounter(&t2); +#endif if (dwBytesReturned == 0) { // don't send dirty too much, everything is changed anyway if (WaitForSingleObject(drive->hStopEvent, 500) == WAIT_OBJECT_0) @@ -216,19 +226,28 @@ static DWORD WINAPI WatcherThread(void *param) { // Got a buffer overflow => current changes lost => send RECDIRTY on root PrintEverythingChangedUnderRoot(rootPath); } else { - FILE_NOTIFY_INFORMATION *info = (FILE_NOTIFY_INFORMATION *) buffer; - while (true) { + FILE_NOTIFY_INFORMATION *info = (FILE_NOTIFY_INFORMATION *)buffer; + do { PrintChangeInfo(rootPath, info); - if (!info->NextEntryOffset) - break; - info = (FILE_NOTIFY_INFORMATION *)((char *) info + info->NextEntryOffset); - } + info = (FILE_NOTIFY_INFORMATION *)((char *)info + info->NextEntryOffset); +#ifdef __PRINT_STATS + nEvents++; +#endif + } while (info->NextEntryOffset != 0); } + +#ifdef __PRINT_STATS + QueryPerformanceCounter(&t3); + _post_ += t2.QuadPart - t1.QuadPart; + _total_ += t3.QuadPart - t1.QuadPart; + _calls_++; + _max_events_ = max(_max_events_, nEvents); +#endif } } + CloseHandle(overlapped.hEvent); CloseHandle(hRootDir); - free(buffer); return 0; } @@ -243,6 +262,7 @@ static void MarkAllRootsUnused() { static void StartRoot(WatchDrive *drive) { drive->hStopEvent = CreateEvent(NULL, FALSE, FALSE, NULL); drive->hThread = CreateThread(NULL, 0, &WatcherThread, drive, 0, NULL); + SetThreadPriority(drive->hThread, THREAD_PRIORITY_ABOVE_NORMAL); drive->bInitialized = true; } @@ -364,5 +384,19 @@ int main(int argc, char *argv[]) { MarkAllRootsUnused(); UpdateRoots(false); DeleteCriticalSection(&csOutput); + +#ifdef __PRINT_STATS + if (_calls_ > 0) { + LARGE_INTEGER fcy; + QueryPerformanceFrequency(&fcy); + _total_ = _total_ * 1000000 / fcy.QuadPart; + _post_ = _post_ * 1000000 / fcy.QuadPart; + fprintf(stderr, "!! TOTAL=%llu(%d) POST=%llu(%d) MAX.EVENTS=%u\n", + _total_, (int) (_total_ / _calls_), + _post_, (int) (_post_ / _calls_), + _max_events_); + } +#endif + return 0; } \ No newline at end of file