昨日書いて、毎回の事ながらやはり気が変わって消してしまった文書を、
更に気が変わったので再び書いてみることにしょう。


以前に50000バイト問題と私が勝手に読んでいる問題についてここに書きました。
自分のコードでは再現しないと思っていたのですが、
昨日自分のコードでも運良く?それが再現し、原因らしきものが分かったので紹介しておく。
これがバグなのか仕様なのかは未だ分かりませんが。


あるSocketに大きなデータを流し込む場合、
その受け側が滞りなくデータを読み続けないと、
Socket>>sendData:はwaitForSendDoneのwait処理で止まってしまう。
これは恐らく受信バッファーのサイズが固定なのか、或いは上限があるからでしょう。


このような送信待ち状態にある場合でも、通常なら、
受信側がデータを読み込み、次の受信のためのバッファーを確保しさえすれば、
送信側の送信完了待ち状態は即座に解除され、結果として期待するようなデータの送受信が行われるようです。


問題は、送信側で、送信に用いたSocketに対して、同時に受信処理を行っている場合です。
この場合、受信側が幾らデータを読み込んでも一向に送信完了待ち状態が解除されないようなのです。


名前から推察するに、
SocketのprimitiveOnlySupportsOneSemaphoreがtrueになっているのが関係しそうですが、
このような振る舞いが仕様なのかバグなのかは知りません。


本当に送受信が非同期であることを意図している場合には、明らかに問題となりそうですが、
そうでないなら、とりあえずの回避策として、送信時に受信プロセスをサスペンドしてしまうというのがあるかもしれない。
送受信プロセスを細かく切り替えるとか、データの優先度で実行する処理を選ぶというのは、ちょっと厄介そうだし。



って、書いてから思った。
逆だ。送受信の同期を想定していると困りそう。