svnno****@sourc*****
svnno****@sourc*****
2014年 6月 18日 (水) 00:38:04 JST
Revision: 5610 http://sourceforge.jp/projects/ttssh2/scm/svn/commits/5610 Author: yutakapon Date: 2014-06-18 00:37:55 +0900 (Wed, 18 Jun 2014) Log Message: ----------- チケット #33822 UTIL_sock_buffered_write 関数にコメントを付与した。 まだ調査中だが、やはり実装がおかしいような感じなので、完全調査完了後、 是正を行う予定。 Ticket Links: ------------ http://sourceforge.jp/projects/ttssh2/tracker/detail/33822 Modified Paths: -------------- trunk/ttssh2/ttxssh/util.c -------------- next part -------------- Modified: trunk/ttssh2/ttxssh/util.c =================================================================== --- trunk/ttssh2/ttxssh/util.c 2014-06-07 15:24:54 UTC (rev 5609) +++ trunk/ttssh2/ttxssh/util.c 2014-06-17 15:37:55 UTC (rev 5610) @@ -64,6 +64,19 @@ return total_sent; } +/* Tera Term\x82\xAA\x93\xAE\x8D삵\x82Ă\xA2\x82\xE9PC\x8F\xE3\x82\xCC X \x83T\x81[\x83o\x83v\x83\x8D\x83O\x83\x89\x83\x80\x82ɑ\xB5\x82āA\x83f\x81[\x83^\x82𑗂\xE9\x81B + * \x88\xEA\x93x\x82ő\x97\x82\xEA\x82Ȃ\xA2\x8Fꍇ\x82́A\x83\x8A\x83\x93\x83O\x83o\x83b\x83t\x83@\x82Ɋi\x94[\x82\xB5\x81A\x92x\x89\x84\x94z\x91\x97\x82\xB7\x82\xE9\x81B + * + * pvar: \x8B\xA4\x97L\x83\x8A\x83\\x81[\x83X + * buf: \x83\x8A\x83\x93\x83O\x83o\x83b\x83t\x83@ + * blocking_write: \x93\xAF\x8A\xFA\x8C^\x82̃p\x83P\x83b\x83g\x91\x97\x90M\x8A\x94 + * socket: \x94\xFA\x8C^\x82̃\\x83P\x83b\x83g\x83n\x83\x93\x83h\x83\x8B + * data: \x83f\x81[\x83^ + * len: \x83f\x81[\x83^\x92\xB7 + * + * return TRUE: \x91\x97\x90M\x90\xAC\x8C\xF7 + * FALSE: \x91\x97\x90M\x83G\x83\x89\x81[ + */ BOOL UTIL_sock_buffered_write(PTInstVar pvar, UTILSockWriteBuf FAR * buf, UTILBlockingWriteCallback blocking_write, SOCKET socket, const char FAR * data, @@ -77,9 +90,14 @@ int first_copy_start; int first_copy_amount; + // \x8F\x89\x89\xF1\x8CĂяo\x82\xB5\x8E\x9E\x82́A\x82\xA9\x82Ȃ炸\x89\xBA\x8BL if \x95\xB6\x82ɓ\xFC\x82\xE9\x81B /* Fast path case: buffer is empty, try nonblocking write */ if (buf->datalen == 0) { #if 1 + // \x82܂\xB8\x82\xCD non-blocking \x82Ńp\x83P\x83b\x83g\x91\x97\x90M\x82\xB7\x82\xE9\x81B\x88\xEA\x93x\x82ł\xE0 WSAEWOULDBLOCK \x83G\x83\x89\x81[\x82ɂȂ\xC1\x82\xBD\x82\xE7\x81A + // \x8A\x94\x82́u\x91\x97\x90M\x8Dς݃f\x81[\x83^\x92\xB7\x81v\x82\xF0\x95Ԃ\xB7\x81B + // \x82\xBD\x82Ƃ\xA6\x82AX \x83T\x81[\x83o\x83v\x83\x8D\x83O\x83\x89\x83\x80\x82Ƃ\xB5\x82\xC4"xterm"\x82\xF0\x8BN\x93\xAE\x82\xB5\x82Ă\xA2\x82\xBD\x8Fꍇ\x81Axterm\x82̒[\x96\x96\x93\xE0\x82ɉ\xBD\x82\xA9 + // \x95\xB6\x8E\x9A\x82\xF0\x95\\x8E\xA6\x82\xB5\x91\xB1\x82\xAF\x82Ă\xA2\x82\xE9\x8F\xF3\x91ԂŁA\x92[\x96\x96\x82̃E\x83B\x83\x93\x83h\x83E\x82\xF0\x83h\x83\x89\x83b\x83O\x82\xB7\x82\xE9\x82ƁA\x8A\x94\x82\xCD 0 \x82\xF0\x95Ԃ\xB5\x82Ă\xAD\x82\xE9\x81B int sent_amount = send_until_block(pvar, socket, data, len); if (sent_amount < 0) { @@ -106,10 +124,40 @@ #endif } + // \x8F\x89\x89\xF1\x8CĂяo\x82\xB5\x8E\x9E\x82\xCC non-blocking \x91\x97\x90M\x82ŁA\x82\xB7\x82ׂđ\x97\x82\xE8\x90ꂽ\x82\xE7\x81A\x91\xA6\x8D\xC0\x82ɐ\xAC\x8C\xF7\x82ŕԂ\xE9\x81B if (len == 0) { return TRUE; } + // \x83\x8A\x83\x93\x83O\x83o\x83b\x83t\x83@(buf)\x82Ɏc\x91\xB6\x82\xB5\x82Ă\xA2\x82\xE9\x83f\x81[\x83^\x82ƁA\x90V\x8BK\x91\x97\x90M\x83f\x81[\x83^\x82𑫂\xB5\x82\xC4(desiredlen)\x81A + // \x8C\xBB\x8D݂̃o\x83b\x83t\x83@\x92\xB7(curlen)\x82\xAA\x91\xAB\x82\xE8\x82邩\x82\xF0\x8Cv\x8EZ\x82\xB7\x82\xE9\x81B + // + // (1)\x83f\x81[\x83^\x82\xAA\x90擪\x82Ɋi\x94[\x82\xB3\x82\xEA\x82Ă\xA2\x82\xE9\x83P\x81[\x83X + // + // <----- buflen -------------> + // buf->bufdata -> +--------------------------+ + // |XXXXXXX | + // +--------------------------+ + // <------> + // buf->datalen + // ^ + // | + // buf->datastart + // + // + // (2)\x83f\x81[\x83^\x82\xAA\x97\xBC\x92[\x82Ɋi\x94[\x82\xB3\x82\xEA\x82Ă\xA2\x82\xE9\x83P\x81[\x83X + // + // <----- buflen -------------> + // buf->bufdata -> +--------------------------+ + // |XXXX XXXX| + // +--------------------------+ + // <---> <--> + // (a) (b) + // (a)+(b) = buf->datalen + // ^ + // | + // buf->datastart + // /* We blocked or the buffer has data in it. We need to put this data into the buffer. First, expand buffer as much as possible and necessary. */