[ttssh2-commit] [10561] 送信時にエラーが発生することがあった

Back to archive index
scmno****@osdn***** scmno****@osdn*****
2023年 2月 2日 (木) 22:31:50 JST


Revision: 10561
          https://osdn.net/projects/ttssh2/scm/svn/commits/10561
Author:   zmatsuo
Date:     2023-02-02 22:31:49 +0900 (Thu, 02 Feb 2023)
Log Message:
-----------
送信時にエラーが発生することがあった

- write() error 4317,0x10dd 識別操作子が無効です。
- 書き込みが完了済みなのに、完了結果を取得しようとしていた
  - 不要な GetOverlappedResult() を呼び出していた

Modified Paths:
--------------
    branches/ttcomtester/tools/ttcomtester/device_com.cpp
    branches/ttcomtester/tools/ttcomtester/main.cpp

-------------- next part --------------
Modified: branches/ttcomtester/tools/ttcomtester/device_com.cpp
===================================================================
--- branches/ttcomtester/tools/ttcomtester/device_com.cpp	2023-02-02 11:44:19 UTC (rev 10560)
+++ branches/ttcomtester/tools/ttcomtester/device_com.cpp	2023-02-02 13:31:49 UTC (rev 10561)
@@ -272,8 +272,8 @@
 /**
  *	\x83y\x83\x93\x83f\x83B\x83\x93\x83O\x8F\xF3\x91Ԃ\xF0\x83`\x83F\x83b\x83N\x82\xB7\x82\xE9
  *
- *	@param	writed				\x8F\x91\x82\xAB\x8D\x9E\x82܂ꂽ\x83o\x83C\x83g\x90\x94
- *								0	\x93ǂݍ\x9E\x82܂\xEA\x82Ă\xA2\x82Ȃ\xA2
+ *	@param		writed				\x8F\x91\x82\xAB\x8D\x9E\x82܂ꂽ\x83o\x83C\x83g\x90\x94
+ *									0	\x93ǂݍ\x9E\x82܂\xEA\x82Ă\xA2\x82Ȃ\xA2
  *	@return	ERROR_SUCCESS		\x93ǂݍ\x9E\x82\xF1\x82\xBE (\x83y\x83\x93\x83f\x83B\x83\x93\x83O\x8F\xF3\x91ԏI\x97\xB9)
  *	@return	ERROR_IO_PENDING	\x93ǂݍ\x9E\x82ݑ҂\xBF(\x90\xB3\x8F\xED)
  *	@return	etc					\x83G\x83\x89\x81[
@@ -385,6 +385,10 @@
 	}
 #endif
 
+	if (writed != NULL) {
+		*writed = 0;
+	}
+
 	p->write_left = (DWORD)buf_len;
 	DWORD writed_;
 	BOOL r = WriteFile(h, buf, (DWORD)buf_len, &writed_, &p->wol);
@@ -391,13 +395,12 @@
 	if (!r) {
 		err = GetLastError();
 		if (err == ERROR_IO_PENDING) {
-			p->write_requested = true;
 			//const DWORD timeout_ms = INFINITE;
 			const DWORD timeout_ms = 0;
 			DWORD wait = WaitForSingleObject(p->wol.hEvent, timeout_ms);
 			if (wait == WAIT_TIMEOUT) {
 				// \x82܂\xBE\x91\x97\x90M\x82\xB5\x82Ă\xA2\x82Ȃ\xA2
-				*writed = 0;
+				p->write_requested = true;
 				return ERROR_IO_PENDING;
 			}
 			else if (wait == WAIT_OBJECT_0) {
@@ -405,26 +408,16 @@
 				r = GetOverlappedResult(h, &p->wol, &writed_, FALSE);
 				if (r) {
 					// \x8F\x91\x82\xAB\x8D\x9E\x82݊\xAE\x97\xB9
-					*writed = writed_;
-					return ERROR_SUCCESS;
+					goto write_complete;
 				}
 				else {
 					err = GetLastError();
 					p->state = comdata_t::STATE_ERROR;
-					*writed = 0;
 					return err;
 				}
 			}
-			else if (wait == WAIT_ABANDONED) {
-				// \x82ǂ\xF1\x82ȂƂ\xAB\x94\xAD\x90\xB6\x82\xB7\x82\xE9? event\x88ُ\xED?
+			else {	// wait == WAIT_ABANDONED || WAIT_FAILED
 				p->state = comdata_t::STATE_ERROR;
-				*writed = 0;
-				return ERROR_INVALID_OPERATION;
-			}
-			else {
-				// WAIT_FAILED
-				p->state = comdata_t::STATE_ERROR;
-				*writed = 0;
 				DWORD e = GetLastError();
 				return e;
 			}
@@ -431,21 +424,23 @@
 		}
 		else {
 			p->state = comdata_t::STATE_ERROR;
-			*writed = 0;
 			DWORD e = GetLastError();
 			return e;
 		}
 	}
-	else {
-		if (writed != NULL) {
-			*writed = writed_;
-		}
-		p->write_left -= writed_;
-		if (p->write_left != 0) {
-			p->write_requested = true;
-		}
-		return ERROR_SUCCESS;
+
+	// \x8F\x91\x82\xAB\x8D\x9E\x82݊\xAE\x97\xB9
+write_complete:
+	if (writed != NULL) {
+		*writed = writed_;
 	}
+	p->write_left -= writed_;
+	if (p->write_left != 0) {
+		// \x82\xB7\x82ׂď\x91\x82\xAB\x8D\x9E\x82ݍς݂ł͂Ȃ\xA2,pending
+		p->write_requested = true;
+		return ERROR_IO_PENDING;
+	}
+	return ERROR_SUCCESS;
 }
 
 static DWORD ctrl(device_t *device, device_ctrl_request request, ...)

Modified: branches/ttcomtester/tools/ttcomtester/main.cpp
===================================================================
--- branches/ttcomtester/tools/ttcomtester/main.cpp	2023-02-02 11:44:19 UTC (rev 10560)
+++ branches/ttcomtester/tools/ttcomtester/main.cpp	2023-02-02 13:31:49 UTC (rev 10561)
@@ -486,7 +486,7 @@
 				else {
 					if (state == STATE_OPEN) {
 						if (write_pending) {
-							printf("writing..\n");
+							printf("writing(pending)..\n");
 						}
 						else {
 							char send_text[2];
@@ -494,9 +494,10 @@
 							send_text[0] = (char)c;
 							DWORD e = ope->write(dev, send_text, 1, &sent_len);
 							if (e == ERROR_SUCCESS) {
-								printf("send %02x, %zu byte\n", c, sent_len);
+								printf("send %02x, sent %zu byte\n", c, sent_len);
 							}
 							else if (e == ERROR_IO_PENDING) {
+								printf("send %02x, sent %zu byte pending\n", c, sent_len);
 								write_pending = true;
 							}
 							else {


ttssh2-commit メーリングリストの案内
Back to archive index