(toppers-users 1724) Re: TINET: echos.c

ABE Tsukasa abe @ jo.tomakomai-ct.ac.jp
2004年 11月 2日 (火) 14:19:35 JST


株式会社アライドテレシス開発センター 黒津様

苫小牧高専、情報工学科の阿部です。

>echos.c の 234行あたりに、
>
>			/*
>			 *  一度バッファにデータを移す。直接送信バッファに
>			 *  書き込もうとしても、デッドロックすることがある。
>			 */
>			memcpy(buffer, rbuf, rblen);
>
>とありますが、 デッドロックはどのような条件下で起きるのか、
>教えてください。 添付のパッチのように変更して、実験してみましたが、
>デッドロック状態にはなりません。たぶん条件が緩いのだとおもいます。
>デッドロックの再現条件がありましたら、教えてください。

まず、echos.c は、TINET の開発の初期から存在するため、
その頃は、デッドロックしてましたが、現在はしない可能性もあります。
また、この部分は、

  (1) tcp_rcv_buf、受信バッファの獲得
  (2) tcp_rel_buf、受信バッファの開放
  (3) tcp_get_buf、送信バッファの獲得
  (4) tcp_snd_buf、バッファ内のデータの送信

の順で API を呼び出しているため、デッドロックは起こりません。
これを、

  (1) tcp_rcv_buf、受信バッファの獲得
  (3) tcp_get_buf、送信バッファの獲得
  (4) tcp_snd_buf、バッファ内のデータの送信
  (2) tcp_rel_buf、受信バッファの開放

にすると、デッドロックが起こる可能性があります。
したがって、コメントも、このような構成になっていた時の
ものが、そのまま残っていたようです。次期リリースで削除します。

>また、もしこのコメント通りならば、268行目は、
>
>				memcpy(sbuf, rbuf + soff, slen);
>
>ではなく、
>
>				memcpy(sbuf, buffer + soff, slen);
>
>ではないのでしょうか。

API の呼び出し順が古いときのコードがそのまま残っていて、
確かに誤っています。これも次期リリースで修正します。

最後に、echos は、私自身使用することが少なく、バグを取りきれていないと思います。
できれば、tinet/netapp にある tcp_echo_srv1.c か tcp_echo_srv2.c を
参考にしていただければ幸いです。
ただし、tcp_echo_srv1.c も同じ所に誤りがありますし、
ノンブロッキングコールでは、タイミングにより正しく動作しない場合もありますので、
現在見直しています。

それでは、今後ともよろしくお願いいたします。 

--
.\" 苫小牧工業高等専門学校 情報工学科 教授 阿部 司
.\" E-mail: abe @ jo.tomakomai-ct.ac.jp  TEL/FAX: 0144-67-8937