From 49dc726dd1ba5b22161146b6709ad6c71e97a9d2 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Torbj=C3=B6rn=20Svensson?= Date: Fri, 7 Aug 2020 12:21:16 +0200 Subject: [PATCH] Bug 521515: Use channel object for native stream access MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit On Linux and mac, a simple int will do for accessing streams (file descriptor). On Windows, a HANDLE is used. This is in reality a pointer and on 64 bit JVM, the pointer will not fit in an int. To not force a change to the API everytime a different platform has a different requirement for accessing streams, use a common interface and specific classes that is known by the native part. The java part of the function block should just pass the object back to the native code when needing to reference an open stream. Change-Id: Ibc3ff5c85735dac6a0ce8e9a1f25b839d7e9aab9 Signed-off-by: Torbjörn Svensson --- .../os/linux/aarch64/libspawner.so | Bin 24528 -> 24632 bytes .../os/linux/x86_64/libspawner.so | Bin 23760 -> 23840 bytes .../os/macosx/x86/libspawner.jnilib | Bin 19856 -> 24012 bytes .../os/macosx/x86_64/libspawner.jnilib | Bin 19960 -> 20032 bytes .../native_src/include/Spawner.h | 18 ++--- .../native_src/include/SpawnerInputStream.h | 32 +++++--- .../native_src/include/SpawnerOutputStream.h | 16 ++-- .../native_src/unix/io.c | 68 ++++++++++------ .../native_src/unix/spawner.c | 50 ++++++------ .../native_src/win/Win32ProcessEx.c | 37 +++++++-- .../native_src/win/iostream.c | 75 ++++++++++-------- .../src/org/eclipse/cdt/utils/pty/PTY.java | 6 +- .../eclipse/cdt/utils/spawner/Spawner.java | 40 ++++++++-- .../cdt/utils/spawner/SpawnerInputStream.java | 27 ++++--- .../utils/spawner/SpawnerOutputStream.java | 23 +++--- .../os/win32/x86_64/spawner.dll | Bin 330516 -> 331062 bytes .../os/win32/x86_64/starter.exe | Bin 398414 -> 398414 bytes 17 files changed, 235 insertions(+), 157 deletions(-) diff --git a/core/org.eclipse.cdt.core.linux.aarch64/os/linux/aarch64/libspawner.so b/core/org.eclipse.cdt.core.linux.aarch64/os/linux/aarch64/libspawner.so index 386a513709a3527f2056a2c3c82e45e0b1cd8ae7..f0d076d9ff65551f5de89a7f98e89a3cb736657f 100755 GIT binary patch delta 6162 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 G&-q^z(1pPO delta 5393 zcmb_gdvH|M89!$?Ay1NpBrZuvHVfprA)8HT0zu6U!4MJu|l!x^Jrgj$? ztA&i_a%goNTXz?wkXj29s%`}d13t%EnmSl$s~e=)I?~G6scw>O`uom3Hzq6kS9fO5 zx#xSo&UfxTFAeaMM|p1vU#XYYCihe``Rl1Zct;J-6w9|ge)@s5cMI2SdAhwMJ9X7l zBaikU;)mmxY952o99yi6O=l^rd9DF@Lm~EX1Kv|)01hkoMg>n4p@a_SZifNB2T=Nb ztgx5QGS+j%g2eiqPPOVafUH*OJX9`rC02MdXB+U%0Mlq@qYxIQU?9%`ysH$ zmP0cQbgDw{SMti;20RXH`rU&++0~OHm#jp=7b$T)uKu%0&)N73;<22n>=i7+nQzcv ztVI~pBGyk9MJ!kcGQ^o2hd7;+%In4X9EZ1&MUGbEU&}z}o9^#mA^$=xf<#>GjA!iu zhZZ3jcaDuc?gyQ}+Q1FO0hepwZXq1_{j~ri-z+i`jNLr5wICCv|QSpki z&AS@}(eC3a;V!1RX52Cxu0x$wh3DH<|gc+PV}Pz@+=Lkt-6u5Oh#L z=KB}=LT9b4FEAT)^;+mwGNcx8B`1!_o#AZ@fhK?$+UAfwm;rp4<+P)2Y~?kE_fs=G_cNg)}E&pKc6`MvSFv=YRGl-@v5wEI;R zkt1J;2zfX%`hSQTRlk?QM&Y8cHDaz;VIzYYwa`DHNS3y;T!pPI2>hg|$$k6HM!z%3 z=oh79B3w9+zbmqe=3f(z*EwS8WK(2F!d7cv9+E~m__c~1)wtY@$GLtZq|sh;apdDe zu76Lhe@WfMYSCAXik}zddVEQ`%#eSIzI}?X?JT-2Wh!iq>tnJcv`8N~NefQU%+^uy zaZ$eaJqgl6_hP2}kO*#y(h|@CEPcllCW_1GI}ciF`n^irePr|+qnM5*!YCXN4-pMQ zNsff6knYz)Hv>k6WfUBWDV%VdoAy`2)ibuvH8$3s1lVU*R+fMn;VKJT zGs>Frj53kCkn9g2&~kUd=RDxz;cpOl6V?t`INjHFO59cASe}p7BrgXN_1}#c2HInB zEJ=Tja4^^wi_?mU*@x==XZO%x}sK_s!#V?44((BWjhz-^87L0U{ioViS z{D|OX-{vR8cgp5x`IC%V8%P?jwW*^bSXNZq3cZpMr!F#bpy1q+NCx`;5a8%PAus0f ziYQ1mimNkOjFn|w_9@wnCi|qM^-UjuWeZ0{nJeG>x?;cO((JOJK8z`-Q%amqiQ7w# z;shb{hSE?x=v?;_4T4Sy8At}qW#FCI6+z%s3>;`>s4SMEb0thbn0#e%qrH!a^RE1w zCnQP>)nLAai_%7G^5mlb#fYdY&skkgswUR3mZJZ87^XpbA#kQy3{j=>>;>#!z*CJ~ zz--o71<6rqGq!Dt{-!usp3!tOFjUCI-8Dg?pSHUy?CSxiYLLek=)OyIv>7l{!8eYG z&~6R+cPvG92WTxC{_d$^L{)SCJ0W`;DKD`xVK#E&bg`LH-rQEYi+ zSe&nz#rs8)+reKHr5HaFOWm_AHw}yR?i$OSVX@a;W!X6_&bW)}u7I>?_v@2SigcWt z>BjNGJ5%*AI@K)HFJ6x$PMfxc+t`*3!=kP--}^9`k6@#_(fe1Z80!M`K|9qM*6A^L z2i6+!=?Xs8vIUl2d@tmg+rYLz2j?o zjY^-Ye+VLr)i;Q$8T>#jt*S139tM-c)M@=NY8Teap^|~3m7GFmj)*|jJg?7S4_XZN zmq18FHAIBnwwXM4FuV*hY5=_~JXP8x-vNMMN%&kA!M6{DvtG{9bidWAKLe$Ea14=wy?cSO8WJ!{ETKu5c^{kEKKgJWwdcMjl9+dLJ)-u7%{%pUDNDo^KV_c2*qcXZv? z<-UD`d+Ca+Hm|v5<2|=;Sl|E0c^4AoMKO`HXum~@rt;3m7}x=d7SwB zKrW`T8H(D(y+J0InqT22)YNHyRh#gWB->Ky5q*n`b~R6#Nr5wQ#{4H~6~V=m%|%`3 zv9#dxxKhQ$rl|k^HSi0PJ(E4rfQJdcVF|xDcJhkJaI0`GwexhbV5yrI3U0OYS{mb9 z&}RyShi7?x^J(#k9`i{{eVihuHuC diff --git a/core/org.eclipse.cdt.core.linux.x86_64/os/linux/x86_64/libspawner.so b/core/org.eclipse.cdt.core.linux.x86_64/os/linux/x86_64/libspawner.so index 656a9c8bb8686ce96b41b77cb28b34223551392a..dddd4fbc72c4e3fbcbf8a338692e56641492b502 100755 GIT binary patch delta 6717 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 XFBJ&Z!FO$5G&!SOUyboMHYNT)8X9r= delta 5718 zcmai23v?9K8J?ZILm-JE*}SuPk{5Ys9## zxKKH#>WQ?ru^z28)CL+Mk+g}Ps6j1_tac=j{FO{U6`| z-~0df&g^YHWEwbVYDpIds&{1;1zHLO{#XijtvQ@nm8Xw9X^+kpdRVz>=gjixcR#cp zxIJh8@N+}mWt;EpF8hzUebiLpv#2J=P&CM`UV?Cw5F}J(>Wl*hf0s$;Z%@$~I}HAP z27he=+vc}0F*9E0F94gKK|}nwg%5=UHtaVm`d7wC)tN%7;Z)0Dnf^J}l0=I%Cw}zXVEi2ujr%|1@xR8g3rQ()n$M{&G>*Pt^Td1p`kQ zH-NUr>YA^?Aw4k$kiP+Rug(^ZfRf`4F*;+Kq5rJmV0yOBFTt3eI{Zk#B8m@%RL&0) zggnE+$@KOg2V4lgxdn1rX=sy``c_$~-X|-SEftEiqe7`{RI4qrDuu{O^CpMGp$zP3 zt^;LX$3{gD`oK)BZt3mkXs^@>J%`-XFdzhPe-Rv6MN9;y9G8_|ZTD436{!mvUC`L3YqYp&tcQjbDt%Dt z6Y3rce)BDg8X8>)s6wqAs<26;2n8`#_hAlQOVx(Rr360bD{|cvqDY-h4V}WK9JLyX z(tr{|t!!K3txDsHXbk*SX+jb0fh~5w7Q1(g-K0lBleRWS`tr~R^fhW|J4my`0=brD z3160K1W~_()iotpn2B?0jG;1{v$01pC_^Ui1i#;;i}XL(5cn(EkUX2 z@LcDknXa(@m^G&JtT;B#bc|KUW{E4Wux+t-q_lj)K{Op#BajBLRO!?^N2_J!wA?hh zp1mN*$_?S5DnMkRY{!Y-^xQV->3@6Mf~%6wPk>6slS3 zX=>?ic+fq^H1K!NvDKMmV+D*HW4`rRg@%snIW`oG9K*f71kMbiEM4iESy^$5n}R} ztURgGRKT81%9G7AjMK-xU@bsGuItB@>QPl1MI5mc|KCws0=z)KUy|IwdaoB92*E4Zl0y0um@IZ_BpAGsIIq=)eLB z+OA7%MM{kI)J2D*xoeX}wn>EfjnkUZ(ssl!IGmtuH? zUh3K>h#h+#FBrT41$&4pWpvt>n3U>HSXFYX&fBG)t(rD84$Y(5Cqzy_IB=20q{XF% z!mr(olY~yQR(%=Xr zFU=|ye>l!YX2m5322w`Co1!fsMk!vy&UTez_j#6?o@ku`CqSvvq;v2_3;8K<_1ehf z#sbww5oU?#cZ_?WZ&C=XgUpcJXUsiB|B?<9oW!xoo^zFVRw zKJH?k?t+dVxcHH~i?0xy)5SAm>}qB2Z}=0MH&r zZ2ESHKs`Oe7tXf6uvi-_xiEztuD(gSFfJs@j3QrX0-VB zC{r?1#b2LeuVdvvVnOR}QP;yT7Cw_?bsWFzCl@>M^ zCOA@g0rT>hZRZ8N$Ic$lDiLoQV+XTx#06t)I4e#pwKMW8O z2zxKjEdFwYJ(-;)zGY{xWv4~G1X%r>i#~I_ou4`JBWx@?-C8$7nVo2Am=HGm@zmJ2 z(7U`>dlz;n4lE3ff}q!N4JW02rOr^nxGo+Wh8Q1I4*MKK9}HQMrciWKLcIafOIrA1 za@ZqqK1`v&0`V2azgK4uvlnKkhactP&^uco&-6Z8Kg|9;J61UhUX0Ta+6s zp48aGxhX4s!uW2ImF`2~C|X_<*b141QA?qMDGbM>f&j71fLO*SrVnj7+YwmYvPb&i)YPb65!BJpJ9{eHQAry)|TIYaZv2eEP4jd3hQ0^EDo^#fb>08E4#7 zd$pa=u$RG>J67n8xe#8CP^8+$GwkKOB=PWRs)9MGuzcreZ~`K_C@a^FU>d@32nEnI z>W{B?|D$AtXHD(K+T2Ih<(A(mZMy$~^>vS|`)T_t`TsCkyC5{VV=-|PCpnsryPz6&^=cij+t0v0Uv$^pa(#!KtsQFIO;$Tg6;wR29(K3)WP!!ezI)JJc9~_OdjQ?N zm)Rn8KSnohimfS*4wyi<1bGN)-&OpOZ+mO;RxdVnhb-3Qv@e)@+`HWKc7tZ(g`0%+ z9=9GkKUi?yqR`m+cwrMovi#EU_Kl?{Ost@6W)ywTn*j4@uC9c?k^C8A`DNxPJNhIQ z@^miVMf|x+Qj;J1Tr#t~vdDm7tceNWv8=WJ>X*+!ib8}4p>4i}lw40K_=Mtl zV^qia(*@7eZQ;l^-oDJ+zw-7NZ%^^|GPO|w*o1`adHr(}`&=|fr5RGsJDQ~=HLc-o zBX4)}_IJEJ#M=RCqfQ$Lp4U!^%(TdC%47Lx7f_pDkHVlxJTJ7C;@v@f*R7bbDtpMP zw#|@w-WI(EehALQ*XLVYt4N)8L*MgStJBc;T=_m8;b**^;O#V)_ye;kj@qbvTzODz ziHW)szPr&~$90;h&EIF}cwQ3jH~5~Hgl!!8EknB2fOH~{b7UW?nfxeY#lC$bCJ2iR zzUNKc6Kq3;IchJY-*rK_pD?4|G;BR@>$*tla~#qnUe_17UVzXVrqA5jPLW>dG<+=4 zx@Z|Xe=Q5GOo&T2xSltf4}u>G)R}BoWq14f#pnFmYwj5m#r0;kV0liUv$$(=*p}r* zq0ZyTNxxuEt~9g3<&mMz1IbBym}y0BXk@+~gOmEV&tEZ5oW28pNa%^iuaMbRWd+n! Wa)z*lb+0N8_*a!ay1-1U68;M*aU$*j diff --git a/core/org.eclipse.cdt.core.macosx/os/macosx/x86/libspawner.jnilib b/core/org.eclipse.cdt.core.macosx/os/macosx/x86/libspawner.jnilib index b61cab931e081954eca46e160a8bb755cc5fbf53..99547975b6c3704a354bfb80723dad7f6af8b0f4 100755 GIT binary patch delta 4562 zcmai24^UG_8sGN_8X!VYz=Xe1<9{Id=MG=ISA7ZBGjbQSlI{fJKj7at0}H z)+ls2+nX}e%$45Q)@gBYdR)(T(v~UA4cE)GPGzQaj%l$69j=#Yy>{lT=6<_L5N$j6 zhVS>j-Tij=+i!p0zAT;3OCx`gIyc2xN%*mLZCe{}N+ra*m=IHH*Kan*zqXN(Z_)bN z#;$ia$M+Tz@<)k~-a&#apz{X6UE#jLNu_=En;U;EI{!LiUquw$-a`Z z=lM}p7()nu$FMGGAuEuLVtPFct*lhu$V)mDP(B41rTnV%htqZ#0DQF#18)#unLV+OwY4cU;9H;xoRK-md zvwFG}^CrEatWb4kwalzho6K7HtD`nIX4R|v%qjGD+y;#XtT%JA4f~=h0gp34lDxv# z5jc$4c{_|tq1d%_J}ouSW-XTP;;x52q_!*Gu7}X-y;KTRm61qv+jv)}mhK->i_Dlz zgK4zzLC1qMJfsZr=y;riF-hJ7Vivw9)&^?RQu_#P9;VJg+WOYSJgMzl z_L;PKkUIT8u%*hN$1kbM;8Zu($tn{K%%@99a9@aaG_fQ4MZ3-+kRq^coUBy2il9%P z6k8C$`e>J6&V1S&-1N12x`l`JbTYRT`fmq&pg&Rm%l+?7zL3LSPAHYDa@ef|k6f3- zPU&8iE3=tpUZ%V~o7v{wmZf-ROJpv-2vxbl*$LA6sr!9121NYsW+$i&Gf)}qyhxQk z!On|!v-7gL|AK1kRqZ~txkq(A$73`;q>RBUurNwScpVy20^!OL7k|$p znBOhvJERN)5scv2c~X-neQTQ|+Tk zr}KqJVPcMRthi%CyHhO_E&q4r%@2 zkn3j+c|PjEKH)%l*qWz63r`My@=gCp3QT&OlVJBf?pGR#>t6qdF-+8de7Pe2yF2;l z{E*bq=E+$+<13k<%7i#Uf}X)#!GWY4H@fnO@_?Ge9`b1NY<21*Uodo0ZL6nM`{ZQX zZJvTRsB(joZ6XDEF=%?CeE)j~#SNmeneEc=S#H)A3~)Fr zXJ&x2Sq}N(WcHt|3h591k7NfV*`3T*m@43nYO0dw==;AiWlDH6-Qo@Mlkxqlhd_q(3~&lXxR;OyIhsPT9>ZY{sN~m?L3sgUSIk*?U87qZP^ytJ(s<+ z>>>HoT$Z@}U%Yf{`5xY@bcMxbB_y;|FEB-*L13mplR&e;6#{bw76@D~uux!;K&!xF zfe#AYC2+UEGJ$&q?h{yH#pg4$v|1Dn3#=8`Ah1bbi@;WaZh>tAI|QB)*eS4E;Bx|d z1o{N_3cMijBJgmZPzkW#weopsYyGi97DrWWO+%x@QdQk#X>O{iZL~BtR6bSbIA+-s zew*!eH7(l@SJu@zYDrN|T}{(gvZ7?=BZQ@|&M7IWJ6>5^Q*EjW8<^@39C1`N5qn+b zfm(;Dsor$R(KORoRa@EENDfw$l34}^YwD^^2dn!FS64``r9{T@M5I_EN&Mh6_rcc<;ylmMz#*XBr%iUwFJuf@< z>ZhU5dG>N%Mr_%5DCB2Z`3u>2o+ftvXQ9w4)@8A{3ZPZdTEzW%C{*$j?fcN)HxUZmkM~S}rCswhR?YjjLdMbl(d_nFIoV`25vji5XeCuS22C*-jU?$Kc~m z_CoaRNlS*@{S7;7St}9tjwMI#yTLxQta9}g67nWw5b^3tJ?5yaE+E&Ws@nQS zM*$g=VhA!bhWHg0+-_LD18VRA*cFg7a(P43336UWV+pF=djP&NZcxrF#knQp2Y9W6 z*B(R}#J9>l$1gXG%f48*rXVN>Y@=!#tFcR`uL~mF`NNq&7nh80u`sU=$-f^7KHWXq+$&rTOtkawct)fH=#pmw0>p( zyUKhy4#6Stlcclj4?Jt!25mb8%Mb~6S8FV9HL)*u=Jwl5@-+F8Q?9IjM@_Ax*wI); i%F7NPtAA?SiJw;Jzoq+tLHcVm$MiI0HY5I0T4x{~ruuB2{(*>{u zX)KV%vJDA_@rMabH8bu1|+<;Yc4j#lK$s%%nZk1B^N@~A2s6?r7vqsSLj`KsD_D~%A9DDn&nRHC*{ zW2}liB*F$&*{a9`sywLZ?W#PWl-TuGO6*4TL{xc5sp#)?zO1-W`3xJ1iL;oM z9J_M-zhR2Yt$DNmsK}G-S24?4PHA36p12~9^Cqsy-q~bK!>_H`McD?^uETSThw>6IkW6lL*qJuFNBF5X+>@ss*P5)S@JPYO0-#S)&3Az?g1<} z4|JK;#z__xzoeygE-OiGoR~K_4O7GP+qq~|c^uRBe;-p8^9^KrdFC_7ROK<%c~$Ke zySrFzoY`C0Aj#N0-IZe@4P zKcg=tuovU4v@L)!hHB3L%OZx%X>C!3N`!AF9SA{%7lVAybvTs&h>37E2%4Ww|Hv@DC#KM@I98pQOzY!Vdtw^h62}JNrN*(}!@D2L?!&tl%Ph7u>mcqS zZ0PL`V$Dpdb8gLgVp+LuDLop?zH4iwx1sIF&d*M!yon&L@@8 za5H<5ltYuuY*lhz$f`(NJKAOM+m=OS;1X@S9KFBd(m{xjMWh_D%r)j$T~qTL`v&Vz z*)qR&WCpIx+1hUYV{h4)(*qXfw{N9~aCfIB$G#rJ)pF)G`oqyUqdG^rx_e^Sq0}dr zjH0N^{UP|x99}wtDz{Tzyk=2ag7FqFe)Yo`b|9@?3Ss^9WM=y`beiZDsivGR>l4>I?2MTj`WN8PKipvz&~YnNKvdjYZDsi$+FEg@Mcym zy<%diE2|{SaK}ooL?4(~+3G5c=GUta(A>!3M2A&E%JQ>w>Fvfc%Gu{k37uIc}4;HXH>vqzAEntPY zf9KxH^^fpc&#hnG;vhszH3^OuY!+-4oFv#TI9+g-V29uw!Fhu71s4e}5xhx{3qB*bM{uv;KEeHh2Lum- z4-W~GfQNsPcTQrR8*RgPHdaa&1Ceks6DgHYiNAbs*9x3SXWz=Vt|O%jFLJ^Y|+97fCtLc|+4`kj|CEXdm`A!(#gA;W}QD7^ugQUefZe7 zHzycs?rGW&*-HhhB`vyHa?gWcSm(bBqtknaI!fb+lr@JnD6_$}ZCt^rfPC%^-M zVm9GGERY0b069P*unpJ)lmiEWdf*wL9e4rg0e%b&0Ha!K;4r^YaL`# z(vj9Q9-Gc)9x*Rp!A&$v9pn_PtZz6*en54^oyn``fM(W#JjHDF-mI3P5}v!2=i;qN zpRTSWf1@?E2P^AppCI>mwe2YL?Eu~5i%i^$`wSjh@1t>KQ+G4zJ|!g!W0^g)_8| z_DQh#{veJ&l=UPZijF|e5R|+#V9!9!`?wv3Q_7DFmv1D3s_-Q!3fKhqdUG%zx8i8P zb|dEVfbEGOWF_i}x{C;@4A}gHbq8#(iI7V{8-uzZu-$0$%f|!G44!jFjDk1hNg^bQ z+xWcmzZ$kczT1vxcEGN}HaG&dV;Lcv0(NN%AzK6X4D3C@e9Q24*J2vQpZ0M8*K7h{ nWuHBIHa;E}e@}j0DH|@?_f367WzDg=n#%g89)G&Jp_cpyxk$a* diff --git a/core/org.eclipse.cdt.core.macosx/os/macosx/x86_64/libspawner.jnilib b/core/org.eclipse.cdt.core.macosx/os/macosx/x86_64/libspawner.jnilib index 5761b5e501050faef28f611a3f2f11124245a5b7..73c5622ac60578b087ea50b265a0f4a29c591d5d 100755 GIT binary patch delta 4661 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 C2H+k5 delta 3622 zcmZu!eNa@_6@Tw7OLmd{fMsEE!CmA-z!erJ8cmIY?$f6(iXRv?AP|j3$5f(XsFQWq zK{7m_OxB#3A+|A_X`7*)CZ%re;54>WZM8F<3EH%w(P^>S=z}30YmITV&Gy`nmHg2= z^M1d3KJIzv-h1xdx5M8TAAC=Y_GU*d0&QESGmctLoLZbUF^fs}83_|7#+PJ`l{4ul zBI7YwC@#r9R>`Dix%OBk91|Bi6SJ8*jgdfP3I1ht!voRl)VZ~ZTZzo9isW@FKBgWt zFeb8rjE(n8?V|L+0#e!sbGib8P=^jVGH;qZdne;&ejF~g@2T*lP z_6D>@S5RxV*Icht{}$AqSvM1m8MD2kMnO=t&=p1Nj0M%ZLG|tSWHK30PwqhK?b!|u z86}p1@m?I5Figs4LWghE%%G)5tu|ZgdOw$sa2k4i9S!FyV-zog^-bRv!&& z^}S?@0oyN|y#Y0+B%n5xnDn=>OjMdz_j!_?VC$n<6=F1v1gq~?MNJ;1ow_tlzQKB? znm^!+a8)q(h%5c^6k>|j*qDCK&Qfnhi$)VwG|Or)d7&9&j42DRsy$7ZxveLM+F`J$fT z5(Jy47JiedNPo%$vt_^Z&pbG6`H^%x7fP*O>36xX!ul)eQzN9=I>H;2?#Zs2;X3s~ zP%GSkOHr@6gKF~~MGcKAYUhZeHeONG`r)7|4+YiwL0l4CAWTQ))q+yzU{Jl5yjpWz z{S-G8mx8PzSuBMu0&y9_1yJP}mP$XSj-?_;35PGs$8kcWN(NFz&`0bVzFzCRqW}0m zXjJ9?ZbFs;$;WZC|Ljg}_8qd>a<8o?12fd*UZwj|*K@eN@8Wf^b7z&!a}@Oge3Z4m z>U~tHa-utwz``I`Va-V$2@pkK!el#2IW_L=)blBza8PvuEyyd9Q4QO&A zpvog!2$!vMSlQnAp`Moww;YOe)dBvT8tIG!w&zrV;_#UMjyD+2+Y7JdxZo?N6{Ado zIk(!0Q6@3U$65$aZRZt?a!H>Jjk(nZnqSBjX9PQ}9ZkfJ$=`fb}ZRZ6%PfDNj2GY4FS%AB_(B!IR;f`pbgdWEe-u(b~h@SMmXYShI z?DWmzQ($#}BDFZ+wtIy*1F8#3bAN#&u;e2=HN4{b=7lVStIM{M9cfrSUg8Mmkt#rozi<55GyG+&!9J`F_ZyUOD>sr z(<{O_Xol0JHR5s@DV0SDa?9Qmx4`+bMbc^$JSwXR`%Qw7ES*d7Ns99+E}-}{#YGes zQ>>-9lwyG5a*7JYRTP61*HCPrxSrxhikm2Irnogssfpq?imeo%r?`XSPKxamcT?O$ z@jDbdDDIh=d>*OwGg##-GjC2XdtA)IEXFAJvQDj%W(sDaXOs9&%2rV6v67i}Os*KF;$w*K%IPc_Zg-oZC6?Ily@h=gpj- z=e&pWLC%rN_)9gfSzk}LovH0Kgrjb($4D_ktP}x1$`SB4McVg5+YZ0*iMV~w-u*B5 zg&U$li28_I6&hdOx9b2Zzf4&lqIIN-46R11UpOwcbR77u@TP=={HTsBK!`3R4omR> zpy{mCcA&jQfP2e4nK7AIR}fIZ6L6MCS7Lu;6++@!wj6>Gb&sXRq>h+0Y={{AQOO?_ z{m>f73HRd{c`Y8NdsyODEc`p%|Z#tRD({(=^!5K{kvPH?%Ed?8}H$mKEe7XsT?T(-NI{B>%40h3Lb zF-f?!h{;(*#ydLoU&ur48*yn$m_r30&``=`KbK=Onfxs-M~j)foXd7Tem$3kg7}2| vdnt?LNfw7J0Qo=Xh8I@?Nv4)$oKHIV{9iAFS7?EcmR82+tx6d1;-u|=GdTxU diff --git a/core/org.eclipse.cdt.core.native/native_src/include/Spawner.h b/core/org.eclipse.cdt.core.native/native_src/include/Spawner.h index 10750f2e202..2608be657dd 100644 --- a/core/org.eclipse.cdt.core.native/native_src/include/Spawner.h +++ b/core/org.eclipse.cdt.core.native/native_src/include/Spawner.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2010 QNX Software Systems and others. + * Copyright (c) 2002, 2020 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -27,10 +27,10 @@ extern "C" { /* * Class: org_eclipse_cdt_utils_spawner_Spawner * Method: exec0 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)I + * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;)I */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jintArray); + (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jobjectArray); /* * Class: org_eclipse_cdt_utils_spawner_Spawner @@ -43,10 +43,10 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec1 /* * Class: org_eclipse_cdt_utils_spawner_Spawner * Method: exec2 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[ILjava/lang/String;IZ)I + * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;Ljava/lang/String;IZ)I */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2 - (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jintArray, jstring, jint, jboolean); + (JNIEnv *, jobject, jobjectArray, jobjectArray, jstring, jobjectArray, jstring, jint, jboolean); /* * Class: org_eclipse_cdt_utils_spawner_Spawner @@ -64,15 +64,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_raise JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_waitFor (JNIEnv *, jobject, jint); -// #define DEBUG_MONITOR - -int interruptProcess(int pid); - - #ifdef __cplusplus } #endif - -// #define DEBUG_MONITOR - #endif diff --git a/core/org.eclipse.cdt.core.native/native_src/include/SpawnerInputStream.h b/core/org.eclipse.cdt.core.native/native_src/include/SpawnerInputStream.h index 653c5659524..6ecf61b96a4 100644 --- a/core/org.eclipse.cdt.core.native/native_src/include/SpawnerInputStream.h +++ b/core/org.eclipse.cdt.core.native/native_src/include/SpawnerInputStream.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2007 QNX Software Systems and others. + * Copyright (c) 2002, 2020 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -15,34 +15,40 @@ * * This is a part of JNI implementation of spawner *******************************************************************************/ - /* DO NOT EDIT THIS FILE - it is machine generated */ #include -/* Header for class com_qnx_tools_utils_spawner_SpawnerInputStream */ +/* Header for class org_eclipse_cdt_utils_spawner_SpawnerInputStream */ -#ifndef _Included_com_qnx_tools_utils_spawner_SpawnerInputStream -#define _Included_com_qnx_tools_utils_spawner_SpawnerInputStream +#ifndef _Included_org_eclipse_cdt_utils_spawner_SpawnerInputStream +#define _Included_org_eclipse_cdt_utils_spawner_SpawnerInputStream #ifdef __cplusplus extern "C" { #endif -#undef com_qnx_tools_utils_spawner_SpawnerInputStream_SKIP_BUFFER_SIZE -#define com_qnx_tools_utils_spawner_SpawnerInputStream_SKIP_BUFFER_SIZE 2048L -/* Inaccessible static: skipBuffer */ +#undef org_eclipse_cdt_utils_spawner_SpawnerInputStream_MAX_SKIP_BUFFER_SIZE +#define org_eclipse_cdt_utils_spawner_SpawnerInputStream_MAX_SKIP_BUFFER_SIZE 2048L /* - * Class: org_elipse_cdt_utils_spawner_SpawnerInputStream + * Class: org_eclipse_cdt_utils_spawner_SpawnerInputStream * Method: read0 - * Signature: (I[BI)I + * Signature: (Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;[BI)I */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0 - (JNIEnv *, jobject, jint, jbyteArray, jint); + (JNIEnv *, jobject, jobject, jbyteArray, jint); /* * Class: org_eclipse_cdt_utils_spawner_SpawnerInputStream * Method: close0 - * Signature: (I)I + * Signature: (Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;)I */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0 - (JNIEnv *, jobject, jint); + (JNIEnv *, jobject, jobject); + +/* + * Class: org_eclipse_cdt_utils_spawner_SpawnerInputStream + * Method: available0 + * Signature: (Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;)I + */ +JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_available0 + (JNIEnv *, jobject, jobject); #ifdef __cplusplus } diff --git a/core/org.eclipse.cdt.core.native/native_src/include/SpawnerOutputStream.h b/core/org.eclipse.cdt.core.native/native_src/include/SpawnerOutputStream.h index fb3e0354e88..5491f3f91c6 100644 --- a/core/org.eclipse.cdt.core.native/native_src/include/SpawnerOutputStream.h +++ b/core/org.eclipse.cdt.core.native/native_src/include/SpawnerOutputStream.h @@ -1,5 +1,5 @@ /******************************************************************************* - * Copyright (c) 2002, 2007 QNX Software Systems and others. + * Copyright (c) 2002, 2020 QNX Software Systems and others. * * This program and the accompanying materials * are made available under the terms of the Eclipse Public License 2.0 @@ -17,28 +17,28 @@ *******************************************************************************/ /* DO NOT EDIT THIS FILE - it is machine generated */ #include -/* Header for class com_qnx_tools_utils_spawner_SpawnerOutputStream */ +/* Header for class org_eclipse_cdt_utils_spawner_SpawnerOutputStream */ -#ifndef _Included_com_qnx_tools_utils_spawner_SpawnerOutputStream -#define _Included_com_qnx_tools_utils_spawner_SpawnerOutputStream +#ifndef _Included_org_eclipse_cdt_utils_spawner_SpawnerOutputStream +#define _Included_org_eclipse_cdt_utils_spawner_SpawnerOutputStream #ifdef __cplusplus extern "C" { #endif /* * Class: org_eclipse_cdt_utils_spawner_SpawnerOutputStream * Method: write0 - * Signature: (I[BI)I + * Signature: (Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;[BI)I */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0 - (JNIEnv *, jobject, jint, jbyteArray, jint); + (JNIEnv *, jobject, jobject, jbyteArray, jint); /* * Class: org_eclipse_cdt_utils_spawner_SpawnerOutputStream * Method: close0 - * Signature: (I)I + * Signature: (Lorg/eclipse/cdt/utils/spawner/Spawner/IChannel;)I */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0 - (JNIEnv *, jobject, jint); + (JNIEnv *, jobject, jobject); #ifdef __cplusplus } diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/io.c b/core/org.eclipse.cdt.core.native/native_src/unix/io.c index 94f03d63935..03dc08d4827 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/io.c +++ b/core/org.eclipse.cdt.core.native/native_src/unix/io.c @@ -21,15 +21,44 @@ /* Header for class _org_eclipse_cdt_utils_spawner_SpawnerInputStream */ /* Header for class _org_eclipse_cdt_utils_spawner_SpawnerOutputStream */ -/* - * Class: org_eclipse_cdt_utils_spawner_SpawnerInputStream - * Method: read0 - * Signature: (I)I - */ +static void ThrowByName(JNIEnv *env, const char *name, const char *msg) +{ + jclass cls = (*env)->FindClass(env, name); + + if (cls != 0) /* Otherwise an exception has already been thrown */ + (*env)->ThrowNew(env, cls, msg); + + /* It's a good practice to clean up the local references. */ + (*env)->DeleteLocalRef(env, cls); +} + +static int channelToFileDesc(JNIEnv * env, jobject channel) +{ + if (channel == 0) { + ThrowByName(env, "java/io/IOException", "Invalid channel object"); + return -1; + } + + jclass cls = (*env)->GetObjectClass(env, channel); + if (cls == 0) { + ThrowByName(env, "java/io/IOException", "Unable to get channel class"); + return -1; + } + + jfieldID fid = (*env)->GetFieldID(env, cls, "fd", "I"); + if (fid == 0) { + ThrowByName(env, "java/io/IOException", "Unable to find fd"); + return -1; + } + + jint fd = (*env)->GetIntField(env, channel, fid); + return fd; +} + JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv * env, jobject jobj, - jint jfd, + jobject channel, jbyteArray buf, jint buf_len) { @@ -40,7 +69,7 @@ Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv * env, data = (*env)->GetByteArrayElements(env, buf, 0); data_len = buf_len; - fd = jfd; + fd = channelToFileDesc(env, channel); status = read( fd, data, data_len ); (*env)->ReleaseByteArrayElements(env, buf, data, 0); @@ -62,28 +91,19 @@ Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0(JNIEnv * env, } -/* - * Class: org_eclipse_cdt_utils_spawner_SpawnerInputStream - * Method: close0 - * Signature: (I)I - */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0(JNIEnv * env, jobject jobj, - jint fd) + jobject channel) { + int fd = channelToFileDesc(env, channel); return close(fd); } -/* - * Class: org_eclipse_cdt_utils_spawner_SpawnerOutputStream - * Method: write0 - * Signature: (II)I - */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv * env, jobject jobj, - jint jfd, + jobject channel, jbyteArray buf, jint buf_len) { @@ -94,7 +114,7 @@ Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv * env, data = (*env)->GetByteArrayElements(env, buf, 0); data_len = buf_len; - fd = jfd; + fd = channelToFileDesc(env, channel); status = write(fd, data, data_len); (*env)->ReleaseByteArrayElements(env, buf, data, 0); @@ -103,15 +123,11 @@ Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0(JNIEnv * env, } -/* - * Class: org_eclipse_cdt_utils_spawner_SpawnerOutputStream - * Method: close0 - * Signature: (I)I - */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0(JNIEnv * env, jobject jobj, - jint fd) + jobject channel) { + int fd = channelToFileDesc(env, channel); return close(fd); } diff --git a/core/org.eclipse.cdt.core.native/native_src/unix/spawner.c b/core/org.eclipse.cdt.core.native/native_src/unix/spawner.c index 623b1382cf8..3968e2a91c4 100644 --- a/core/org.eclipse.cdt.core.native/native_src/unix/spawner.c +++ b/core/org.eclipse.cdt.core.native/native_src/unix/spawner.c @@ -86,16 +86,10 @@ static void free_c_array(char **c_array) } -/* - * Class: org_eclipse_cdt_utils_spawner_Spawner - * Method: exec2 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[ILorg/eclipse/cdt/utils/pty/PTY;)I - */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2 - (JNIEnv *env, jobject jobj, jobjectArray jcmd, jobjectArray jenv, jstring jdir, jintArray jchannels, + (JNIEnv *env, jobject jobj, jobjectArray jcmd, jobjectArray jenv, jstring jdir, jobjectArray jchannels, jstring jslaveName, jint masterFD, jboolean console) { - jint *channels = (*env)->GetIntArrayElements(env, jchannels, 0); const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); const char *pts_name = (*env)->GetStringUTFChars(env, jslaveName, NULL); char **cmd = NULL; @@ -103,7 +97,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2 int fd[3]; pid_t pid = -1; - if (channels == NULL) + if (jchannels == NULL) goto bail_out; cmd = alloc_c_array(env, jcmd); @@ -127,12 +121,15 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2 if (pid < 0) goto bail_out; - channels[0] = fd[0]; - channels[1] = fd[1]; - channels[2] = fd[2]; + jobject cls = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$UnixChannel"); + jmethodID constructor = (*env)->GetMethodID(env, cls, "", "(I)V"); + for (jsize i = 0; i < 3; i++) { + jobject chan = (*env)->NewObject(env, cls, constructor, fd[i]); + (*env)->SetObjectArrayElement(env, jchannels, i, chan); + } + bail_out: - (*env)->ReleaseIntArrayElements(env, jchannels, channels, 0); (*env)->ReleaseStringUTFChars(env, jdir, dirpath); (*env)->ReleaseStringUTFChars(env, jslaveName, pts_name); if (cmd) @@ -183,26 +180,30 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec1(JNIEnv * env, jobject jobj, return pid; } -/* - * Class: org_eclipse_cdt_utils_spawner_Spawner - * Method: exec0 - * Signature: ([Ljava/lang/String;[Ljava/lang/String;Ljava/lang/String;[I)I - */ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv * env, jobject jobj, jobjectArray jcmd, jobjectArray jenv, jstring jdir, - jintArray jchannels) + jobjectArray jchannels) { - jint *channels = (*env)->GetIntArrayElements(env, jchannels, 0); const char *dirpath = (*env)->GetStringUTFChars(env, jdir, NULL); char **cmd = NULL; char **envp = NULL; int fd[3]; pid_t pid = -1; + jclass channelClass = NULL; + jmethodID channelConstructor = NULL; - if (channels == NULL) + if (jchannels == NULL) + goto bail_out; + + channelClass = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$UnixChannel"); + if (channelClass == 0) + goto bail_out; + + channelConstructor = (*env)->GetMethodID(env, channelClass, "", "(I)V"); + if (channelConstructor == 0) goto bail_out; cmd = alloc_c_array(env, jcmd); @@ -220,17 +221,16 @@ Java_org_eclipse_cdt_utils_spawner_Spawner_exec0(JNIEnv * env, jobject jobj, print_array(envp); fprintf(stderr, "dirpath: %s\n", dirpath); #endif - pid = exec0(cmd[0], cmd, envp, dirpath, fd); if (pid < 0) goto bail_out; - channels[0] = fd[0]; - channels[1] = fd[1]; - channels[2] = fd[2]; + for (jsize i = 0; i < 3; i++) { + jobject chan = (*env)->NewObject(env, channelClass, channelConstructor, fd[i]); + (*env)->SetObjectArrayElement(env, jchannels, i, chan); + } bail_out: - (*env)->ReleaseIntArrayElements(env, jchannels, channels, 0); (*env)->ReleaseStringUTFChars(env, jdir, dirpath); if (cmd) free_c_array(cmd); diff --git a/core/org.eclipse.cdt.core.native/native_src/win/Win32ProcessEx.c b/core/org.eclipse.cdt.core.native/native_src/win/Win32ProcessEx.c index 7b6bcc13699..433c06f1174 100644 --- a/core/org.eclipse.cdt.core.native/native_src/win/Win32ProcessEx.c +++ b/core/org.eclipse.cdt.core.native/native_src/win/Win32ProcessEx.c @@ -70,6 +70,8 @@ static int copyTo(wchar_t * target, const wchar_t * source, int cpyLenght, int // Use this function to clean project descriptor and return it to the pool of available blocks. static void cleanUpProcBlock(pProcInfo_t pCurProcInfo); +int interruptProcess(int pid); + // Signal codes typedef enum { @@ -106,7 +108,7 @@ static int nCounter = 0; // We use it to build unique synchronization object nam extern "C" #endif JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec2 - (JNIEnv * env, jobject process, jobjectArray cmdarray, jobjectArray envp, jstring dir, jintArray channels, jstring slaveName, jint fdm, jboolean console) + (JNIEnv * env, jobject process, jobjectArray cmdarray, jobjectArray envp, jstring dir, jobjectArray channels, jstring slaveName, jint fdm, jboolean console) { return -1; } @@ -133,7 +135,7 @@ void ensureSize(wchar_t** ptr, int* psize, int requiredLength) extern "C" #endif JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 - (JNIEnv * env, jobject process, jobjectArray cmdarray, jobjectArray envp, jstring dir, jintArray channels) + (JNIEnv * env, jobject process, jobjectArray cmdarray, jobjectArray envp, jstring dir, jobjectArray channels) { HANDLE stdHandles[3]; PROCESS_INFORMATION pi = {0}, *piCopy; @@ -169,6 +171,28 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 wchar_t inPipeName[PIPE_NAME_LENGTH]; wchar_t outPipeName[PIPE_NAME_LENGTH]; wchar_t errPipeName[PIPE_NAME_LENGTH]; + jclass channelClass = NULL; + jmethodID channelConstructor = NULL; + + if (channels == NULL) + { + ThrowByName(env, "java/io/IOException", "Channels can't be null"); + return 0; + } + + channelClass = (*env)->FindClass(env, "org/eclipse/cdt/utils/spawner/Spawner$WinChannel"); + if (channelClass == 0) + { + ThrowByName(env, "java/io/IOException", "Unable to find channel class"); + return 0; + } + + channelConstructor = (*env)->GetMethodID(env, channelClass, "", "(J)V"); + if (channelConstructor == 0) + { + ThrowByName(env, "java/io/IOException", "Unable to find channel constructor"); + return 0; + } nCmdLineLength= MAX_CMD_SIZE; szCmdLine= (wchar_t *)malloc(nCmdLineLength * sizeof(wchar_t)); @@ -406,7 +430,6 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 } else { - int file_handles[3]; HANDLE h[2]; int what; @@ -434,10 +457,10 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_Spawner_exec0 ret = (long)(pCurProcInfo -> uid); // Prepare stream handlers to return to java program - file_handles[0] = (int)stdHandles[0]; - file_handles[1] = (int)stdHandles[1]; - file_handles[2] = (int)stdHandles[2]; - (*env)->SetIntArrayRegion(env, channels, 0, 3, (jint *)file_handles); + for (jsize i = 0; i < 3; i++) { + jobject chan = (*env)->NewObject(env, channelClass, channelConstructor, (jlong)stdHandles[i]); + (*env)->SetObjectArrayElement(env, channels, i, chan); + } // do the cleanup so launch the according thread // create a copy of the PROCESS_INFORMATION as this might get destroyed diff --git a/core/org.eclipse.cdt.core.native/native_src/win/iostream.c b/core/org.eclipse.cdt.core.native/native_src/win/iostream.c index 7fcfaf90d18..19aca37ccb5 100644 --- a/core/org.eclipse.cdt.core.native/native_src/win/iostream.c +++ b/core/org.eclipse.cdt.core.native/native_src/win/iostream.c @@ -29,20 +29,39 @@ void ThrowByName(JNIEnv *env, const char *name, const char *msg); #define BUFF_SIZE (1024) +static HANDLE channelToHandle(JNIEnv * env, jobject channel) +{ + if (channel == 0) { + ThrowByName(env, "java/io/IOException", "Invalid channel object"); + return NULL; + } + + jclass cls = (*env)->GetObjectClass(env, channel); + if (cls == NULL) { + ThrowByName(env, "java/io/IOException", "Unable to get channel class"); + return NULL; + } + + jfieldID fid = (*env)->GetFieldID(env, cls, "handle", "J"); + if (fid == NULL) { + ThrowByName(env, "java/io/IOException", "Unable to find handle"); + return NULL; + } + + jlong handle = (*env)->GetLongField(env, channel, fid); + return (HANDLE)handle; +} + /* Inaccessible static: skipBuffer */ -/* - * Class: SpawnerInputStream - * Method: read0 - * Signature: (I)I - */ #ifdef __cplusplus extern "C" #endif JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_read0 - (JNIEnv * env, jobject proc, jint fd, jbyteArray buf, jint len) + (JNIEnv * env, jobject proc, jobject channel, jbyteArray buf, jint len) { jbyte tmpBuf[BUFF_SIZE]; int nBuffOffset = 0; + HANDLE handle = channelToHandle(env, channel); #ifdef DEBUG_MONITOR _TCHAR buffer[1000]; #endif @@ -84,7 +103,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea { DWORD nNumberOfBytesToRead = min(len - nBuffOffset, BUFF_SIZE); DWORD nNumberOfBytesRead; - if(0 == ReadFile((HANDLE)fd, tmpBuf, nNumberOfBytesToRead, &nNumberOfBytesRead, &overlapped )) + if(0 == ReadFile(handle, tmpBuf, nNumberOfBytesToRead, &nNumberOfBytesRead, &overlapped )) { int err = GetLastError(); @@ -92,7 +111,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea { // asynchronous i/o is still in progress // check on the results of the asynchronous read - if(GetOverlappedResult((HANDLE)fd, &overlapped, + if(GetOverlappedResult(handle, &overlapped, &nNumberOfBytesRead, TRUE)) err = 0; // if there was a problem ... @@ -151,7 +170,7 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea { // Is there data left in the pipe? DWORD bytesAvailable = 0; - if (!PeekNamedPipe((HANDLE)fd, NULL, 0, NULL, &bytesAvailable, NULL) + if (!PeekNamedPipe(handle, NULL, 0, NULL, &bytesAvailable, NULL) || bytesAvailable == 0) // No bytes left break; @@ -168,24 +187,20 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_rea } -/* - * Class: SpawnerInputStream - * Method: close0 - * Signature: (I)I - */ #ifdef __cplusplus extern "C" #endif JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_close0 - (JNIEnv * env, jobject proc, jint fd) + (JNIEnv * env, jobject proc, jobject channel) { int rc; + HANDLE handle = channelToHandle(env, channel); #ifdef DEBUG_MONITOR _TCHAR buffer[1000]; _stprintf(buffer, _T("Close %i\n"), fd); OutputDebugStringW(buffer); #endif - rc = (CloseHandle((HANDLE)fd) ? 0 : -1); + rc = (CloseHandle(handle) ? 0 : -1); #ifdef DEBUG_MONITOR _stprintf(buffer, _T("Closed %i\n"), fd); OutputDebugStringW(buffer); @@ -197,38 +212,34 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_clo extern "C" #endif JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerInputStream_available0 - (JNIEnv * env, jobject proc, jint fd) + (JNIEnv * env, jobject proc, jobject channel) { DWORD nAvail = 0; + HANDLE handle = channelToHandle(env, channel); - if (0 == PeekNamedPipe((HANDLE)fd, NULL, 0, NULL, &nAvail, NULL)) { + if (0 == PeekNamedPipe(handle, NULL, 0, NULL, &nAvail, NULL)) { // error return 0; } return nAvail; } -/* - * Class: SpawnerOutputStream - * Method: write0 - * Signature: (I[BI)I - */ #ifdef __cplusplus extern "C" #endif JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_write0 - (JNIEnv * env, jobject proc, jint fd, jbyteArray buf, jint len) + (JNIEnv * env, jobject proc, jobject channel, jbyteArray buf, jint len) { jbyte tmpBuf[BUFF_SIZE]; int nBuffOffset = 0; - + HANDLE handle = channelToHandle(env, channel); while(len > nBuffOffset) { DWORD nNumberOfBytesToWrite = min(len - nBuffOffset, BUFF_SIZE); DWORD nNumberOfBytesWritten; (*env)->GetByteArrayRegion(env, buf, nBuffOffset, nNumberOfBytesToWrite, tmpBuf); - if(0 == WriteFile((HANDLE)fd, tmpBuf, nNumberOfBytesToWrite, &nNumberOfBytesWritten, NULL)) + if(0 == WriteFile(handle, tmpBuf, nNumberOfBytesToWrite, &nNumberOfBytesWritten, NULL)) { char * lpMsgBuf; FormatMessage( @@ -252,25 +263,21 @@ JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_wr return 0; } -/* - * Class: SpawnerOutputStream - * Method: close0 - * Signature: (I)I - */ #ifdef __cplusplus extern "C" #endif JNIEXPORT jint JNICALL Java_org_eclipse_cdt_utils_spawner_SpawnerOutputStream_close0 - (JNIEnv * env, jobject proc, jint fd) + (JNIEnv * env, jobject proc, jobject channel) { int rc; + HANDLE handle = channelToHandle(env, channel); #ifdef DEBUG_MONITOR _TCHAR buffer[1000]; _stprintf(buffer, _T("Close %i\n"), fd); OutputDebugStringW(buffer); #endif - FlushFileBuffers((HANDLE)fd); - rc = (CloseHandle((HANDLE)fd) ? 0 : -1); + FlushFileBuffers(handle); + rc = (CloseHandle(handle) ? 0 : -1); #ifdef DEBUG_MONITOR _stprintf(buffer, _T("Closed %i\n"), fd); OutputDebugStringW(buffer); diff --git a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/pty/PTY.java b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/pty/PTY.java index a92f5a06ace..4080fa25b8c 100644 --- a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/pty/PTY.java +++ b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/pty/PTY.java @@ -20,6 +20,7 @@ import java.io.IOException; import org.eclipse.cdt.internal.core.natives.CNativePlugin; import org.eclipse.cdt.internal.core.natives.Messages; import org.eclipse.cdt.utils.spawner.Spawner; +import org.eclipse.cdt.utils.spawner.Spawner.IChannel; import org.eclipse.core.runtime.Platform; /** @@ -223,7 +224,8 @@ public class PTY { * @noreference This method is not intended to be referenced by clients. * @since 5.6 */ - public int exec_pty(Spawner spawner, String[] cmdarray, String[] envp, String dir, int[] chan) throws IOException { + public int exec_pty(Spawner spawner, String[] cmdarray, String[] envp, String dir, IChannel[] chan) + throws IOException { if (isWinPTY) { return exec2(cmdarray, envp, dir, chan, slave, master, console); } else { @@ -250,7 +252,7 @@ public class PTY { /** * Native method when executing with a terminal emulation (winpty only). */ - native int exec2(String[] cmdarray, String[] envp, String dir, int[] chan, String slaveName, int masterFD, + native int exec2(String[] cmdarray, String[] envp, String dir, IChannel[] chan, String slaveName, int masterFD, boolean console) throws IOException; /** diff --git a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/Spawner.java b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/Spawner.java index c5249b99cb0..ee16552777f 100644 --- a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/Spawner.java +++ b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/Spawner.java @@ -65,7 +65,7 @@ public class Spawner extends Process { int pid = 0; int status; - final int[] fChannels = { -1, -1, -1 }; + final IChannel[] fChannels = { null, null, null }; boolean isDone; OutputStream out; InputStream in; @@ -363,7 +363,7 @@ public class Spawner extends Process { Reaper reaper = new Reaper(cmdarray, envp, dirpath) { @Override - int execute(String[] cmd, String[] env, String dir, int[] channels) throws IOException { + int execute(String[] cmd, String[] env, String dir, IChannel[] channels) throws IOException { return pty.exec_pty(Spawner.this, cmd, env, dir, channels); } @@ -429,7 +429,7 @@ public class Spawner extends Process { /** * Native method use in normal exec() calls. */ - native int exec0(String[] cmdarray, String[] envp, String dir, int[] chan) throws IOException; + native int exec0(String[] cmdarray, String[] envp, String dir, IChannel[] chan) throws IOException; /** * Native method use in no redirect meaning to streams will created. @@ -440,8 +440,8 @@ public class Spawner extends Process { * Native method when executing with a terminal emulation. * @noreference This method is not intended to be referenced by clients. */ - public native int exec2(String[] cmdarray, String[] envp, String dir, int[] chan, String slaveName, int masterFD, - boolean console) throws IOException; + public native int exec2(String[] cmdarray, String[] envp, String dir, IChannel[] chan, String slaveName, + int masterFD, boolean console) throws IOException; /** * Native method to drop a signal on the process with pid. @@ -464,6 +464,34 @@ public class Spawner extends Process { } } + /** + * @since 6.0 + */ + public static interface IChannel { + } + + /** + * @since 6.0 + */ + public static class WinChannel implements IChannel { + final long handle; + + public WinChannel(long handle) { + this.handle = handle; + } + } + + /** + * @since 6.0 + */ + public static class UnixChannel implements IChannel { + final int fd; + + public UnixChannel(int fd) { + this.fd = fd; + } + } + // Spawn a thread to handle the forking and waiting // We do it this way because on linux the SIGCHLD is // send to the one thread. So do the forking and @@ -482,7 +510,7 @@ public class Spawner extends Process { fException = null; } - int execute(String[] cmdarray, String[] envp, String dir, int[] channels) throws IOException { + int execute(String[] cmdarray, String[] envp, String dir, IChannel[] channels) throws IOException { return exec0(cmdarray, envp, dir, channels); } diff --git a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/SpawnerInputStream.java b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/SpawnerInputStream.java index 5e8e2926cc1..27533cc5fda 100644 --- a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/SpawnerInputStream.java +++ b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/SpawnerInputStream.java @@ -18,16 +18,17 @@ import java.io.IOException; import java.io.InputStream; import org.eclipse.cdt.internal.core.natives.Messages; +import org.eclipse.cdt.utils.spawner.Spawner.IChannel; class SpawnerInputStream extends InputStream { - private int fd; + private IChannel channel; /** * From a Unix valid file descriptor set a Reader. * @param fd file descriptor. */ - public SpawnerInputStream(int fd) { - this.fd = fd; + public SpawnerInputStream(IChannel channel) { + this.channel = channel; } /** @@ -48,7 +49,7 @@ class SpawnerInputStream extends InputStream { */ @Override public int read(byte[] buf, int off, int len) throws IOException { - if (fd == -1) { + if (channel == null) { return -1; } if (buf == null) { @@ -60,7 +61,7 @@ class SpawnerInputStream extends InputStream { } byte[] tmpBuf = off > 0 ? new byte[len] : buf; - len = read0(fd, tmpBuf, len); + len = read0(channel, tmpBuf, len); if (len <= 0) return -1; @@ -76,21 +77,21 @@ class SpawnerInputStream extends InputStream { */ @Override public void close() throws IOException { - if (fd == -1) + if (channel == null) return; - int status = close0(fd); + int status = close0(channel); if (status == -1) throw new IOException(Messages.Util_exception_closeError); - fd = -1; + channel = null; } @Override public int available() throws IOException { - if (fd == -1) { + if (channel == null) { return 0; } try { - return available0(fd); + return available0(channel); } catch (UnsatisfiedLinkError e) { // for those platforms that do not implement available0 return super.available(); @@ -102,11 +103,11 @@ class SpawnerInputStream extends InputStream { close(); } - private native int read0(int fileDesc, byte[] buf, int len) throws IOException; + private native int read0(IChannel channel, byte[] buf, int len) throws IOException; - private native int close0(int fileDesc) throws IOException; + private native int close0(IChannel channel) throws IOException; - private native int available0(int fileDesc) throws IOException; + private native int available0(IChannel channel) throws IOException; static { System.loadLibrary("spawner"); //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/SpawnerOutputStream.java b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/SpawnerOutputStream.java index 01863b491f0..a6e51e824da 100644 --- a/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/SpawnerOutputStream.java +++ b/core/org.eclipse.cdt.core.native/src/org/eclipse/cdt/utils/spawner/SpawnerOutputStream.java @@ -16,19 +16,22 @@ package org.eclipse.cdt.utils.spawner; import java.io.IOException; import java.io.OutputStream; +import org.eclipse.cdt.utils.spawner.Spawner.IChannel; + /** * @noextend This class is not intended to be subclassed by clients. * @noinstantiate This class is not intended to be instantiated by clients. */ public class SpawnerOutputStream extends OutputStream { - private int fd; + private IChannel channel; /** * From a Unix valid file descriptor set a Reader. - * @param fd file descriptor. + * @param channel file descriptor. + * @since 6.0 */ - public SpawnerOutputStream(int fd) { - this.fd = fd; + public SpawnerOutputStream(IChannel channel) { + this.channel = channel; } /** @@ -45,7 +48,7 @@ public class SpawnerOutputStream extends OutputStream { } byte[] tmpBuf = new byte[len]; System.arraycopy(b, off, tmpBuf, off, len); - write0(fd, tmpBuf, len); + write0(channel, tmpBuf, len); } /** @@ -66,12 +69,12 @@ public class SpawnerOutputStream extends OutputStream { */ @Override public void close() throws IOException { - if (fd == -1) + if (channel == null) return; - int status = close0(fd); + int status = close0(channel); if (status == -1) throw new IOException("close error"); //$NON-NLS-1$ - fd = -1; + channel = null; } @Override @@ -79,9 +82,9 @@ public class SpawnerOutputStream extends OutputStream { close(); } - private native int write0(int fd, byte[] b, int len) throws IOException; + private native int write0(IChannel channel, byte[] b, int len) throws IOException; - private native int close0(int fd); + private native int close0(IChannel channel); static { System.loadLibrary("spawner"); //$NON-NLS-1$ diff --git a/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/spawner.dll b/core/org.eclipse.cdt.core.win32.x86_64/os/win32/x86_64/spawner.dll index 710097dfc910a6d4c2e78f4145c2c84ba575e934..179f3b1c88a4b771399b8c2c9f396f2376cf6e7c 100755 GIT binary patch delta 22407 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 QJwM2MrTQti@5hwrv delta 39 xcmV+?0NDS|s2I+u7?6kp=Kzt4P6DT)f!c-I0fpKEh1vs!+60B#1-04+bQ5>$5;6b)