• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision7950 (tree)
Time2019-08-14 00:09:07
Authoryutakapon

Log Message

SCPファイル受信中、リストが上限閾値を超えた場合、recvを呼び出さないようにした。
#34056

Change Summary

Incremental Difference

--- branches/scp_flowctrl/ttssh2/ttxssh/pkt.c (revision 7949)
+++ branches/scp_flowctrl/ttssh2/ttxssh/pkt.c (revision 7950)
@@ -267,8 +267,17 @@
267267 // パケットの受信
268268 int amount_read;
269269
270- amount_read = recv_data(pvar, READAMOUNT);
270+ // SCPファイル受信処理を一時停止中ならば、recv()をしない。
271+ if (pvar->recv_suspended) {
272+ // それまでに受信したデータサイズをTera Term側に返す。
273+ return amount_in_buf;
271274
275+ }
276+ else {
277+ amount_read = recv_data(pvar, READAMOUNT);
278+
279+ }
280+
272281 if (amount_read == SOCKET_ERROR) {
273282 if (amount_in_buf == 0) {
274283 return SOCKET_ERROR;
--- branches/scp_flowctrl/ttssh2/ttxssh/ssh.c (revision 7949)
+++ branches/scp_flowctrl/ttssh2/ttxssh/ssh.c (revision 7950)
@@ -8558,6 +8558,10 @@
85588558 ShowWindow(c->scp.progress_window, SW_HIDE);
85598559
85608560 cancel_abort:
8561+ // SCPの受信処理が終了した場合は、recv()のブロックを解除する。
8562+ // これをやらないと、Tera Termが固まったままになってしまう。
8563+ pvar->recv_suspended = FALSE;
8564+
85618565 // チャネルのクローズを行いたいが、直接 ssh2_channel_send_close() を呼び出すと、
85628566 // 当該関数がスレッドセーフではないため、SCP処理が正常に終了しない場合がある。
85638567 // (2011.6.1 yutaka)
@@ -8647,7 +8651,12 @@
86478651 // キューに詰んだデータの総サイズが下限閾値を下回った場合、
86488652 // SSHサーバからの受信を再開するように指示を出す。
86498653 if (c->scp.pktlist_cursize <= SCPRCV_LOW_WATER_MARK) {
8650- pvar->recv_suspended = FALSE;
8654+ // recv()のブロックを解除する。
8655+ if (pvar->recv_suspended) {
8656+ pvar->recv_suspended = FALSE;
8657+ // FD_READメッセージを投げて recv() の再開を促す。
8658+ PostMessage(pvar->NotificationWindow, WM_USER_COMMNOTIFY, pvar->socket, MAKELPARAM(FD_READ, 0));
8659+ }
86518660 }
86528661
86538662 logprintf(LOG_LEVEL_NOTICE,
--- branches/scp_flowctrl/ttssh2/ttxssh/ssh.h (revision 7949)
+++ branches/scp_flowctrl/ttssh2/ttxssh/ssh.h (revision 7950)
@@ -828,7 +828,7 @@
828828
829829 // SCP受信処理におけるフロー制御の閾値
830830 // 適用先 scp_t.filercvsize
831-#define SCPRCV_HIGH_WATER_MARK (16 * 1024 * 1024) // 16MB
831+#define SCPRCV_HIGH_WATER_MARK (1 * 1024 * 1024) // 16MB
832832 #define SCPRCV_LOW_WATER_MARK (0) // 0MB
833833
834834 typedef struct scp {
Show on old repository browser