osSendMesg.htm 3.37 KB
<HTML>

<HEAD>

<TITLE>HTML 文書</TITLE>

<META NAME="GENERATOR" CONTENT="Internet Assistant for Microsoft Word 2.0j">
</HEAD>

<BODY>

<P>
<B><FONT FACE="Arial">osSendMesg(3P) <BR>
</FONT></B>
<P>
<B>関数名<BR>
</B>
<P>
osCreateMesgQueue, osSendMesg, osJamMesg, osRecvMesg
<P>
→ メッセージングと同期機能<BR>

<P>
<B>構文<BR>
</B>
<P>
#include &lt;ultra64.h&gt;
<P>
void osCreateMesgQueue(OSMesgQueue *mq, OSMesg *msg,
s32 count);
<P>
void osSendMesg(OSMesgQueue *mq, OSMesg msg, s32
flag);
<P>
void osJamMesg(OSMesgQueue *mq, OSMesg msg, s32 flag);
<P>
s32 osRecvMesg(OSMesgQueue *mq, OSMesg *msg, s32
flag);<BR>

<P>
<B>説明<BR>
</B>
<P>
メッセージ待ち行列は大いにフレキシブルなコミュニケーションと同期メカニズムを供給します。その機能はスレッドとイベント(第一割り込み)の間のようにスレッド中に有効です。完全なイベントのコンパイルリストを使用するためにosSetEventMesg(3P)を参照してください。
<BR>

<P>
osCreateMesgQueueコールは与えられたOSMesgQueueを構成するmqを空の状態に初期化します。引数msgはこの待ち行列にメッセージを書き込むために使用されるOSMesg列を指します。また、countはホールドできる与えられた待ち行列のメッセージ総数(列のサイズ)を指定します。
<BR>

<P>
osSendMesgコールは与えられたメッセージ待ち行列mqの最後にメッセージmsgをコピーします。引数flagはこれを送る操作をブロックするモードを指定します。もしflagがM_BLOCKにセットされていれば、ルーチンはメッセージ待ち行列がいっぱいになるとブロックします。そして呼出スレッドは書き込みのために待ち行列が空のスレッドになるまでCPUを明け渡します。このスレッドはほかの同じ優先順位のスレッドの後ろにメッセージ待ち行列と結びつけられたリストにリンクされた優先順位の待ち行列に入れられます。soSendMesgコールはコールを送ることをブロックするために常に0を返すでしょう。M_BLOCKにflagをセットすることはメッセージ待ち行列がいっぱいの時にosSendMesgが直ちに-1の返値をコールすることを許可します。さもないと、メッセージは伝達されてしまい、そのコールは0の返値を返してしまいます。その上、もし最高優先順位のスレッドがブロックされていれば、osSendMesgコールは待ち行列が空でないために待っていたosRecvMesg中でブロックされていたそのスレッドを呼び覚ますことになります。
<BR>

<P>
osJamMesgコールはメッセージmsgが与えられたメッセージ待ち行列mqの前にコピーされることをのぞいてはosSendMesgと似た働きをします。このコールは優先順位の高いメッセージを作成することに使用されるでしょう。
<BR>

<P>
osRecvMesgコールはメッセージ待ち行列mq中の最初のメッセージをmsgによって指定されたアドレス内にコピーします。もしNULLのmsgがosRecvMesgにパスされれば、待ち行列中のメッセージは破棄されます。これはあなたがメッセージの内容を気にしていないような場合に、実際に同期イベントが起きたときに限り便利です。もしflagがM_BLOCKにセットされていれば、ルーチンは空のメッセージ待ち行列上でブロックします。これは現在実行中のスレッドが待ち行列を読むための有効なメッセージがあるまでCPUを明け渡すということを意味しています。このスレッドは同じ優先順位のほかのスレッドの後ろのメッセージ待ち行列に結びついたリストにリンクされた優先順位上の待ち行列に入れられます。osRecvMesgコールはコールを受けることをブロックするために常に0を返します。M_NOBLOCKにflagをセットすることはメッセージ待ち行列が空の時には直ちに-1の返値を返すためにosRecvMesgコールを許可します。さもないとメッセージは受け取られ、コールは0の返値を返します。ついにosRecvMesgコールはメッセージ待ち行列が有効になるのを待っているosSendMesgまたはosJamMesg中でブロックされていたもっとも優先順位の高いスレッドを(それが実際にブロックされていたなら)再開するでしょう。
<BR>

</BODY>

</HTML>