From af3d792c7844b682cec53d0ef60c14bea2306409 Mon Sep 17 00:00:00 2001 From: krakjoe Date: Sat, 30 Nov 2013 00:16:24 +0000 Subject: [PATCH] improvements to jui, use nonblocking i/o in stdout thread --- tutorials/java/dist/phpdbg-ui.jar | Bin 37486 -> 37975 bytes tutorials/java/src/phpdbg/ui/DebugSocket.java | 133 ++++++++++++------ 2 files changed, 87 insertions(+), 46 deletions(-) diff --git a/tutorials/java/dist/phpdbg-ui.jar b/tutorials/java/dist/phpdbg-ui.jar index bc4c39cc6cd299f453eea24068e7ff1ef11eac99..b98dace3e2381ea5e2c855cccd8e12ac878fc19d 100644 GIT binary patch delta 4147 zcma)933yc175?v=rE00wqPA)gqv?O&Ofm%J`OasgPolCrF>R(Ir?FCTrJ`!OO_M^=jE5ah;AN zT(34iP-i!&?Tt$OCLKS-&1(6P#4S2*#gBEQVWV1F6+@dk+oWSNEQQ^sN4VbZ!5up8 z#7{hE*D(QGblioXs%5L4DOfc&~dJ^Fa|r-@_<@? zt{5Iv%R|Zd1s+buE;)H4U}F zx+{WBq2S^=b5={EIZGh|}SO87aMiN1nYCH`vQHN0-%4JH33{>FqhnJXK@W@VAYTL#|7I|4#C@ONY!XLttwfp-o3 zQz>{4?^tgnXGaXYkJlysW#B`6WZ>WU4>MrkV|=2PPX%)NT&iZ7#H!@tB}{B`kphMgLSq^Y;b6SNDO>^tF;%A*)RdX_9mlT1zzX3ODEum0 z%xt{wcr%8O!efXe1}Bn*VeOurk!pw(99M~Y*AN3R+xj$lh~+nOt?ZH#YrRoAH6F<6 z)?>z1`K8-7dkfSq9D$5JM-oMC9X5to`O}juf68Giqbl8c&j{>&Kc!k&x27J9u;LpU z&3cAfGUBXtXP5qvuV=8EFwtMKwtn(Jt|7Ox-UgX*PRlhiHF9pRSp8Qc zI3wy{9g`Idv#|%4oE}-?y6K@)%|peJxX{ziM^uwzXV)G)Cj=Lw;c@->(a4VQDb zlY1B8c;9}Ah|k{%%@^o|!&lk~r_bx`gv;kR0Cy*39D00*kTj3%dMA>1Q&ht@xen)J z5-6d%5yX5L06#JifET57dnBo47>DyPgIr@{Ch;wNn>!k}LlKB5R7IoNL=}g_##CfZ z%p|V7FXoR!kgJN|PI4=*^L+Dap7ia5CkkT=a{9b>+TMG3k{m^f|40Ws)BQ&RUArmg zl=B4#QTIRrhDU4!(^+{S$L|My$o9jdhRKnoZW-=Rtd9~*-6)IaXOG8ex zlm)E^`QVJ4M{^K;_U89y#pPv+lX*AQjN2JYj5CT?j6J4?KlSW81;Dn&GjHH$5kc z+&CUcpy_#0L~=_>$&aF-RBde}io&>35k-;L$qP#^cM*DBT|7{B+k3(t$eSMDZ9$q6 zprUj3U`P~0JFx2jhSeOv@acg=IJbW&B~gr+6JS`rIRSr!zWe9&>1knOjll`kXkfpjN1r zYZD14YE?GO(grCy`-EL1GC_hGlpb%NfB+#t_0WtiW5i3Ll}KZ#2y~ zi7>jcT4Z32@S;T&;cDT-HKGjb#06L{s<1)S;5u<7t{2O3gII|h#Twis*5PJx8(PH{ zw27_QEViRvbYP2!?89B63tPprxSPqjO+1g=#WCC=j+5a889v8dnj2fSbllC@+qFV$ z(E_ARAnj6Yv*$x28$HB07jR~1jC(yJT*ygwj8kM0zDwFvJjg(U5Ol1Z;nu=Q_eNt$ zgfYA5`4TK;rm$VLvXZO?GH+;fY^^(5D?EzSVob=e zircca1G&~mt@a19mDiT5yvVl$R(%COz7+?1;&1#D8|CT2)Q zM$+stBxQ~sSz8xuZa&kgVW$?<%p3%$Uw*GgggZ7!(<-kmOg%%uD&Cx{-F}T#x!LC~ IYf}RM13xwKuK)l5 delta 3653 zcma)9dr(!!8UO9x3x|6+T;OtfTmj`F3Ks|}Y7E9mKuHLK#8-maSj4Mfc!*#uR=w3G zwT;n&$EH=&+8P?7(Z(0oB$`k|lXTin(_|)-cC^ztPG|a0O(tzRHPzbR?!EZPXqq!~ z_WSm?-?!gyzumLD=ffA}rG6P#U*m9^KnzfMbW>kkzN6ykreo7y5K7t?M2?oxGEd19 zcgYP=9x9cM_ddD#--&>F(_#1ZWd?uq-`Cy%P>NrhSc0V{itsfT3h|gKmYMiE8kM$O z6-@?Kn2Z@vm6fV(m8v$IXu)a|kE2x;Z6;gW71p7uYfN-vt4Ybh(NhM#V_=(!@8WwdJdN$D z`)3U7FtF3W_fJfBrHLqKb4ORVeW^Ir&T?hi^UXq|*FYbQ?5E7hg;6c-Yu0rOB+psh z_(Wq#OGiny0_JzG4K%h*7l>Nk(;es%kV`7;$I8aoeX%JXQZTT~fNfx|X0Y4#T3H1K zeqiBQ{LsQw{K&!tOtf$pN(}6=uowF*Oh$=?DJZd*S;@hvc+SEklv?;Peqx~ll?Hk( z>{s%q7Jh~U7M@4Hg`eXE3j?UM@FETxIAq}^9JX*o8T#Yb-LOE-6iuonjR0>_3kvgtE#}>>`wJ2-6oax zId`tzKEY+5kN4aEaDQ+jI-y!Dbgv3@-;{5G)ck@wOoWTm)6&|wyfq-;%zvn05e4UH zg@BR2q@udIpqi7_)Y{P%uxk@f2a(P7Q3QcvM8Tuxf$PYlCPhmop0YwsiI$udN+<27 z;%-PxV{ISnY5`947Z!yePC@#M2jTGhoP%)s9j_p25YZ87_)jCI!G8*_L72zDg(`6m zeMiG!nF$xhz>O?;$twdn7|SI*fn^z6Cx@e8I__nS@h}7Tk%`h~qMSV`O)+<9O^wBg z`>89wt^ZgBT-t?b@5kl-GRH*C1ksU=a+rkEe0J&U&Sa9lyAf!VW+QdE7e=}o>) z?U@L*T+J-Z=SKQMh_ho;vVtmU;m8x{KN0F1@p7`#n5G(mYlZw!(zt z!i0l*MSOvAoM!Cy#SQ!1Lq3ac&zHqtXI7SQ=dmVe&qQCsurHBrEoBMeXm@l8#?w~i z$D@2anqgAd$9v~6UhR_X^A7uxhkQvxzIcAuc`r}&qW!YM|J zY|3nrrz9@pYETqnoG2BwqMi-)Vu6yXK`dsyP!wsoLIlND*0+jnS}qn#6|O8rFL$J{ z94}6a-;4KX_n!Db%Y)*GILH1kimPfs5N3!7{wVd(@xMgo_9U z@OP|a!rO2a9m0tBSnEjZRraYzEdb zFRiiyZL*4Ob!=P0wv}w_ru}-f%O2uei0>r6hxh>TL&O+VGN@!w`4R7ZY71Y=6S0O_ zspd&1na3t(uZCF<4zMzZ>61*-G}JMP4vrY8XDS89lSXYGweuqw!-iWEIG-18oC%^4 zQ?6i)K8^Hga0L!luHs<>^9?NUUPjzi#28p;U{ONGWw`2iY6L$=^cCb>_lmAC@W{>G zD4^;ZKP(r|8b;#Cf~R>0f3w_oCitSe;plBqH_KzHF9NaOSq{y|D~{!QdDi|rsbtCPt=Mxusu~P2R80Wa`1o0zOQ$h z0_>jNnOdIiouuU_y;HQz@2hs-`oCib`=;xr*Zb1tyFRMpPLt=*L_ "); - main.getOutputField().appendANSI(command); - main.getOutputField().appendANSI("\n"); + OutputStream output = socket.getOutputStream(); + + synchronized(this) { + wait(); + + if (!quit) { + command = main.getInputField().getText(); + /* send command to stdin socket */ + if (command != null) { + if (main.isEchoing()) { + main.getOutputField().appendANSI("remote> "); + main.getOutputField().appendANSI(command); + main.getOutputField().appendANSI("\n"); + } + output.write( + command.getBytes()); + output.write("\n".getBytes()); + output.flush(); + } + main.getInputField().setText(null); } - output.write( - command.getBytes()); - output.write("\n".getBytes()); - output.flush(); } - main.getInputField().setText(null); - } else { - InputStream input = getInputStream(); - /* get data from stdout socket */ - byte[] bytes = new byte[1]; - do { - if (input.available() == 0) { - wait(400); - continue; - } - - if (input.read(bytes, 0, 1) > -1) { - main.getOutputField() - .appendANSI(new String(bytes)); - } - } while (!quit); + } while (!quit); + } catch (IOException ex) { + if (!quit) { + main.messageBox(ex.getMessage(), MessageType.ERROR); } - } while(!quit); + } + } else { + /* + * The writer thread will use non-blocking i/o consuming + * resources only when there is data to read + */ + Selector selector = Selector.open(); + SocketChannel channel = SocketChannel.open(); + + channel.connect( + new InetSocketAddress(this.host, this.port)); + channel.configureBlocking(false); + channel.register(selector, OP_READ); + + while (!quit) { + selector.select(); + + Iterator iter = selector.selectedKeys().iterator(); + + while (iter.hasNext()) { + if (!quit) { + SocketChannel ready = (SocketChannel) (iter.next().channel()); + ByteBuffer bytes = ByteBuffer.allocate(128); + + if (ready != null) { + if (ready.read(bytes) != -1) { + bytes.flip(); + + main.getOutputField() + .appendANSI(new String(bytes.array())); + + } + } + + iter.remove(); + } + } + } } } catch (IOException | InterruptedException ex) { if (!quit) { main.messageBox(ex.getMessage(), MessageType.ERROR); } } finally { - try { - close(); - } catch (IOException ex) { /* naughty me */ } finally { - synchronized(main) { - if (main.isConnected()) { - main.setConnected(false); - } - } + synchronized(main) { + if (main.isConnected()) { + main.setConnected(false); + } } } }