• R/O
  • SSH
  • HTTPS

ttssh2: Commit


Commit MetaInfo

Revision8359 (tree)
Time2019-11-04 00:23:12
Authorzmatsuo

Log Message

送信/受信バッファサイズを考慮して送信するようにした

Change Summary

Incremental Difference

--- branches/unicode_buf/teraterm/teraterm/sendmem.cpp (revision 8358)
+++ branches/unicode_buf/teraterm/teraterm/sendmem.cpp (revision 8359)
@@ -63,10 +63,6 @@
6363 //
6464 PComVar cv_;
6565 BOOL pause;
66- const BYTE *send_out_retry_ptr;
67- size_t send_out_retry_len;
68- const BYTE *send_echo_retry_ptr;
69- size_t send_echo_retry_len;
7066 } SendMem;
7167
7268 typedef SendMem sendmem_work_t;
@@ -146,9 +142,6 @@
146142
147143 p->send_left = p->send_len;
148144 p->send_index = 0;
149- p->send_out_retry_ptr = NULL;
150- p->send_echo_retry_ptr = NULL;
151-
152145 p->waited = FALSE;
153146 p->pause = FALSE;
154147
@@ -172,6 +165,26 @@
172165 EnableWindow(HVTWin, FALSE);
173166 }
174167
168+static void GetOutBuffInfo(const TComVar *cv_, size_t *use, size_t *free)
169+{
170+ if (use != NULL) {
171+ *use = cv_->OutBuffCount;
172+ }
173+ if (free != NULL) {
174+ *free = OutBuffSize - cv_->InBuffCount;
175+ }
176+}
177+
178+static void GetInBuffInfo(const TComVar *cv_, size_t *use, size_t *free)
179+{
180+ if (use != NULL) {
181+ *use = cv_->InBuffCount;
182+ }
183+ if (free != NULL) {
184+ *free = InBuffSize - cv_->InBuffCount;
185+ }
186+}
187+
175188 /**
176189 * 送信
177190 */
@@ -196,144 +209,118 @@
196209 }
197210 }
198211
199- // 送信バッファ(echo)できなかった分を再送
200- int r;
201- size_t sended_size = 0;
202- if (p->send_out_retry_ptr != NULL) {
203- if (p->type == SendMemTypeBinary) {
204- r = CommBinaryBuffOut(p->cv_, (PCHAR)p->send_out_retry_ptr, (int)p->send_out_retry_len);
212+ // 終端?
213+ if (p->send_left == 0) {
214+ // 終了, 送信バッファが空になるまで待つ
215+ size_t out_buff_use;
216+ GetOutBuffInfo(p->cv_, &out_buff_use, NULL);
217+
218+ if (p->dlg != NULL) {
219+ p->dlg->RefreshNum(p->send_index, p->send_len - out_buff_use);
205220 }
206- else {
207- // text (not binary)
208- r = CommTextOutW(p->cv_, (wchar_t *)p->send_out_retry_ptr, (int)(p->send_out_retry_len / sizeof(wchar_t)));
209- r *= sizeof(wchar_t);
221+
222+ if (out_buff_use == 0) {
223+ // 送信バッファも空になった
224+ EndPaste();
225+ return;
210226 }
211- sended_size = r;
212- p->send_out_retry_len -= r;
213- if (p->send_out_retry_len == 0) {
214- p->send_out_retry_ptr = NULL;
215- }
216- else {
217- p->send_out_retry_ptr += r;
218- }
219227 }
220- if (p->send_echo_retry_ptr != NULL) {
221- size_t echo_size = sended_size < p->send_echo_retry_len ? sended_size : p->send_echo_retry_len;
222- if (p->type == SendMemTypeBinary) {
223- r = CommTextEcho(p->cv_, (PCHAR)p->send_echo_retry_ptr, (int)echo_size);
228+
229+ // 送信できるバッファサイズ
230+ size_t buff_len;
231+ {
232+ size_t out_buff_free;
233+ GetOutBuffInfo(p->cv_, NULL, &out_buff_free);
234+ buff_len = out_buff_free;
235+ if (p->local_echo_enable) {
236+ // ローカルエコーが必要な場合は、入力バッファも考慮
237+ size_t in_buff_free;
238+ GetInBuffInfo(p->cv_, NULL, &in_buff_free);
239+ if (buff_len > in_buff_free) {
240+ buff_len = in_buff_free;
241+ }
224242 }
225- else {
226- r = CommTextEchoW(p->cv_, (wchar_t *)p->send_echo_retry_ptr, (int)(echo_size / sizeof(wchar_t)));
227- r *= sizeof(wchar_t);
228- }
229- p->send_echo_retry_len -= r;
230- if (p->send_echo_retry_len == 0) {
231- p->send_echo_retry_ptr = NULL;
232- }
233- else {
234- p->send_echo_retry_ptr += r;
235- }
236243 }
237- if (p->send_out_retry_ptr != NULL || p->send_echo_retry_ptr != NULL) {
238- // まだ全部送信できていない
244+ if (buff_len == 0) {
245+ // バッファに空きがない
239246 return;
240247 }
241248
242- // 送信
243- for (;;) {
244- // 終端?
245- if (p->send_left == 0) {
246- // 終了
247- EndPaste();
248- return;
249+ // 送信長
250+ BOOL need_delay = FALSE;
251+ size_t send_len;
252+ if (p->delay_per_char > 0) {
253+ // 1キャラクタ送信
254+ need_delay = TRUE;
255+ if (p->type == SendMemTypeBinary) {
256+ send_len = 1;
249257 }
250-
251- // 送信長
252- BOOL need_delay = FALSE;
253- size_t send_len;
254- if (p->delay_per_char > 0) {
255- // 1キャラクタ送信
256- need_delay = TRUE;
257- if (p->type == SendMemTypeBinary) {
258- send_len = 1;
259- }
260- else {
261- send_len = sizeof(wchar_t);
262- }
258+ else {
259+ send_len = sizeof(wchar_t);
263260 }
264- else if (p->delay_per_line > 0) {
265- // 1ライン送信
266- need_delay = TRUE;
261+ }
262+ else if (p->delay_per_line > 0) {
263+ // 1ライン送信
264+ need_delay = TRUE;
267265
268- // 1行取り出し(改行コードは 0x0a に正規化されている)
269- const wchar_t *line_top = (wchar_t *)&p->send_ptr[p->send_index];
270- const wchar_t *line_end = wcschr(line_top, 0x0a);
271- if (line_end != NULL) {
272- // 0x0a まで送信
273- send_len = ((line_end - line_top) + 1) * sizeof(wchar_t);
274- }
275- else {
276- // 改行見つからず、最後まで送信
277- send_len = p->send_left;
278- }
266+ // 1行取り出し(改行コードは 0x0a に正規化されている)
267+ const wchar_t *line_top = (wchar_t *)&p->send_ptr[p->send_index];
268+ const wchar_t *line_end = wcschr(line_top, 0x0a);
269+ if (line_end != NULL) {
270+ // 0x0a まで送信
271+ send_len = ((line_end - line_top) + 1) * sizeof(wchar_t);
279272 }
280273 else {
281- // 全力送信
274+ // 改行見つからず、最後まで送信
282275 send_len = p->send_left;
283276 }
284277
285- // 送信する
286- const BYTE *send_ptr = (BYTE *)&p->send_ptr[p->send_index];
287- p->send_index += send_len;
288- p->send_left -= send_len;
289- size_t sended_len;
290- if (p->type == SendMemTypeBinary) {
291- sended_len = CommBinaryBuffOut(p->cv_, (PCHAR)send_ptr, (int)send_len);
278+ // 送信できない
279+ if (buff_len < send_len) {
280+ return;
292281 }
293- else {
294- sended_len = CommTextOutW(p->cv_, (wchar_t *)send_ptr, (int)(send_len / sizeof(wchar_t)));
295- sended_len *= sizeof(wchar_t);
282+ }
283+ else {
284+ // 全力送信
285+ send_len = p->send_left;
286+ if (buff_len < send_len) {
287+ send_len = buff_len;
296288 }
297- if ((sended_len != 0) && (p->local_echo_enable)) {
298- // 送信できた分echoする
299- size_t echo_len = sended_len;
300- size_t echoed_len;
301- if (p->type == SendMemTypeBinary) {
302- echoed_len = CommTextEcho(p->cv_, (PCHAR)send_ptr, (int)echo_len);
303- }
304- else {
305- echoed_len = CommTextEchoW(p->cv_, (wchar_t *)send_ptr, (int)(echo_len / sizeof(wchar_t)));
306- sended_len *= sizeof(wchar_t);
307- }
308- if (echoed_len != echo_len) {
309- p->send_out_retry_ptr = send_ptr + echoed_len;
310- p->send_out_retry_len = echo_len - echoed_len;
311- }
289+ }
290+
291+ // 送信する
292+ const BYTE *send_ptr = (BYTE *)&p->send_ptr[p->send_index];
293+ p->send_index += send_len;
294+ p->send_left -= send_len;
295+ size_t sended_len;
296+ if (p->type == SendMemTypeBinary) {
297+ sended_len = CommBinaryBuffOut(p->cv_, (PCHAR)send_ptr, (int)send_len);
298+ if (p->local_echo_enable) {
299+ CommTextEcho(p->cv_, (PCHAR)send_ptr, (int)send_len);
312300 }
313- if (sended_len < send_len) {
314- // すべて送信できなかった
315- p->send_out_retry_ptr = send_ptr + sended_len;
316- p->send_out_retry_len = send_len - sended_len;
301+ }
302+ else {
303+ sended_len = CommTextOutW(p->cv_, (wchar_t *)send_ptr, (int)(send_len / sizeof(wchar_t)));
304+ if (p->local_echo_enable) {
305+ CommTextEchoW(p->cv_, (wchar_t *)send_ptr, (int)(send_len / sizeof(wchar_t)));
317306 }
318- if (p->send_out_retry_ptr != NULL || p->send_echo_retry_ptr != NULL) {
319- // 出力できなくなった(出力バッファがいっぱい?)
320- return;
321- }
307+ sended_len *= sizeof(wchar_t);
308+ }
322309
323- // ダイアログ更新
324- if (p->dlg != NULL) {
325- p->dlg->RefreshNum(p->send_index, p->send_len);
326- }
310+ // ダイアログ更新
311+ if (p->dlg != NULL) {
312+ size_t out_buff_use;
313+ GetOutBuffInfo(p->cv_, &out_buff_use, NULL);
314+ p->dlg->RefreshNum(p->send_index - out_buff_use, p->send_len);
315+ }
327316
328- if (need_delay) {
329- // waitに入る
330- p->waited = TRUE;
331- p->last_send_tick = GetTickCount();
332- // タイマーはidleを動作させるために使用している
333- const DWORD delay = p->delay_per_line > 0 ? p->delay_per_line : p->delay_per_char;
334- SetTimer(p->hWnd, p->timer_id, delay, NULL);
335- break;
336- }
317+ if (need_delay) {
318+ // waitに入る
319+ p->waited = TRUE;
320+ p->last_send_tick = GetTickCount();
321+ // タイマーはidleを動作させるために使用している
322+ const DWORD delay = p->delay_per_line > 0 ? p->delay_per_line : p->delay_per_char;
323+ SetTimer(p->hWnd, p->timer_id, delay, NULL);
337324 }
338325 }
339326
Show on old repository browser