%% $OpenXM: OpenXM/doc/OpenXM-specs/control.tex,v 1.1 2000/01/20 08:52:46 noro Exp $
//&jp \section{コントロールメッセージ (SMObject/TCPIP/Control)}
//&eg \section{Control message (SMObject/TCPIP/Control)} (This section has not been translated.)
/*&jp
\begin{enumerate}
\item
サーバは {\tt SM\_control\_reset\_connection}
メッセージを受信したら, 現在の計算を中断する.
中断操作は細心の注意をもって行なわないといけない.
サンプルサーバ ({\tt oxmain.c})では, コントロールメッセージの
処理は別のプロセスがおこなっており, SIGUSR1 割り込みをスタックマシンへ
かける.
もしサーバがメッセージの通信中であれば, このコントロールメッセージ
をすぐには実行せず, メッセージ通信を終了するのを待つ.
当然, メッセージを発信中に, このメッセージを送信してもいけない.
(Java 風にいえば, すべての メッセージは synchronized object である.)
また, たとえば file IO なども, 中断をうけてはならない, synchronized な
操作であろう.
クライアントがサーバに controlResetConnection コントロールメッセージを
おくったら, サーバは, 現在の受信バッファをすべてクリアし,
クライアントへ
{\tt OX\_SYNC\_BALL}
を送る.
クライアントは, コントロールメッセージをおくったあと,
待機モードに入り, {\tt OX\_SYNC\_BALL}
をうけとるまですべてのメッセージを読み飛ばす.
クライアントは {\tt OX\_SYNC\_BALL} をうけとったら,
サーバに {\tt OX\_SYNC\_BALL} を送る.
サーバは, 最初の {\tt OX\_SYNC\_BALL} を投げたあと,
待機モードに入り,
{\tt OX\_SYNC\_BALL}
をうけとるまですべてのメッセージを読み飛ばす.
%% 最後に, サーバ
%% はすべての操作が終了したことを通知するため,
%% クライアントに
%% {\tt OX\_SYNC\_BALL} を投げる.
\\ Request:
\begin{tabular}{|c|c|} \hline
{\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_reset\_connection} \\
\hline
\end{tabular}
\\ Result:
\begin{tabular}{|c|c|} \hline
{\tt int32 OX\_DATA} & {\tt CMO\_INT32} {\rm result} \\
\hline
\end{tabular}
@@@
\item
サーバはこのメッセージを受信したらただちにコントロールメッセージへの
返答をおくり, すべてのファイルをクローズして終了する.
\\ Request:
\begin{tabular}{|c|c|} \hline
{\tt int32 OX\_COMMAND} & {\tt int32 SM\_control\_kill} \\
\hline
\end{tabular}
\\ Result:
Empty \\
\end{enumerate}
\medbreak
\noindent
{\bf 例}: (シリアル番号は省略してある.)\
\begin{verbatim}
0 0 2 01 (OX_COMMAND)
0 0 4 06 (SM_control_reset_connection)
\end{verbatim}
Reset に対する返事.
\begin{verbatim}
0 0 2 02 (OX_DATA)
0 0 0 2 (CMO_INT32)
0 0 0 0 ( 0 )
\end{verbatim}
第1のチャンネルでは次の {\tt OX\_SYNC\_BALL} が交換されて同期が
取られる.
\begin{verbatim}
0 0 2 03 (OX_SYNC_BALL)
\end{verbatim}
*/