(toppers-users 1723) TINET: echos.c

Motoya Kurotsu kurotsu @ allied-telesis.co.jp
2004年 11月 2日 (火) 13:29:04 JST


こんにちは、少し前から、TINET のコードを読んでいます。

echos.c の 234行あたりに、

			/*
			 *  一度バッファにデータを移す。直接送信バッファに
			 *  書き込もうとしても、デッドロックすることがある。
			 */
			memcpy(buffer, rbuf, rblen);

とありますが、 デッドロックはどのような条件下で起きるのか、
教えてください。 添付のパッチのように変更して、実験してみましたが、
デッドロック状態にはなりません。たぶん条件が緩いのだとおもいます。
デッドロックの再現条件がありましたら、教えてください。

また、もしこのコメント通りならば、268行目は、

				memcpy(sbuf, rbuf + soff, slen);

ではなく、

				memcpy(sbuf, buffer + soff, slen);

ではないのでしょうか。

diff -Nur 1.2.1/echos/echos.c 1.2.1.v1/echos/echos.c
--- 1.2.1/echos/echos.c	2004-07-21 08:25:36.000000000 +0900
+++ 1.2.1.v1/echos/echos.c	2004-11-02 13:07:20.000000000 +0900
@@ -235,13 +235,6 @@
 			 *  一度バッファにデータを移す。直接送信バッファに
 			 *  書き込もうとしても、デッドロックすることがある。
 			 */
-			memcpy(buffer, rbuf, rblen);
-
-			if ((error = tcp_rel_buf((INT)exinf, rlen)) < 0) {
-				syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) REL] error: %s",
-				                   itron_strerror(error));
-				break;
-				}
 
 			soff = 0;
 			while (rlen > 0) {
@@ -277,6 +270,12 @@
 				rlen -= slen;
 				soff += slen;
 				}
+
+			if ((error = tcp_rel_buf((INT)exinf, rblen)) < 0) {
+				syslog(LOG_NOTICE, "[TCP ECHO SRV (NBLK) REL] error: %s",
+				                   itron_strerror(error));
+				break;
+				}
 			}
 	err_fin:
 
-- 
黒津基弥
システム研究開発部
株式会社アライドテレシス開発センター