[B-Free memo 24]


ポートマネージャ
----------------


$Date: 2011/12/27 17:13:36 $
$Revision: 1.1 $

作者：内藤 隆一



1. この文書の内容

  この文書は、B-Free プロジェクトの POSIX サーバに使用するメッセージバッ
ファ管理用マネージャ：ポートサーバについて記述したものです。

  [内容]

  ポートマネージャの機能
  メッセージフォーマット


  [単語一覧]

  ポートマネージャ
  中心核
  メッセージバッファ


2. ポートマネージャの機能


2.1 ポートマネージャの役割

  ポートマネージャとは、ITRON のもつタスク間通信機能のひとつであるメッ
セージバッファの ID を管理するためのマネージャです。任意のメッセージバッ
ファ ID とポート名とを結びつける機能をもっています。

  具体的にはポートマネージャは次のように働きます。
  POSIX プロセスサーバの要求受けつけ用のポートは、"posix.process" とい
う名前をもっています。POSIX プロセスサーバへ通信を行いたいタスクは、ポー
トマネージャに対して posix.process という名前をもつメッセージバッファ
の ID を検索する要求を発行します。ポートマネージャは、あらかじめ POSIX 
プロセスサーバが登録しておいたメッセージバッファ ID を返します。


2.2 ポートマネージャの機能

  ポートマネージャは、特定 ID (11)をもつメッセージバッファを確保してい
ます。このメッセージポートはポートマネージャへの要求受けつけに用います。

  ポートマネージャへのメッセージは、次の 3 種類があります。

  1) NULL_PORT		何もしない
  2) REGIST_PORT	メッセージバッファの登録を行います。
			ポート名とメッセージバッファ ID を指定します。
  3) UNREGIST_PORT	メッセージバッファの抹消
			指定したポート名の情報を削除します。
  4) FIND_PORT		メッセージバッファの参照
			要求元が指定したポート名に対応するメッセージバッ
			ファID を返します。


  それぞれのメッセージのフォーマットは、付録 A. に示します。

  また、ポートマネージャに対する要求を簡略化するために、ライブラリ関数
を用意しています。このライブラリ関数は、ポートマネージャに対するメッセー
ジの送受信を行います。

 1) regist_port (PORT_NAME name, ID port)
    メッセージバッファ ID の登録

 2) unregist_port (PORT_NAME name)
    メッセージバッファ ID の抹消

 3) find_port (PORT_NAME name, ID &port)
    メッセージバッファ ID の検索


A. メッセージフォーマット

A.1 要求メッセージ

  ポートマネージャに送るメッセージはヘッダ部分とボディ部分に分かれています。

  <ヘッダ部分>

  struct port_message_header_t
  {
    W	type;	/* REGIST_PORT/UNREGIST_PORT/FIND_PORT のいずれかの値 */
		/* が入る(もしくは、NULL_PORT が入ることもあるが、ポー */
		/* トマネージャは、NULL_PORT のメッセージは処理せず、 */
		/* 単に無視する。                                     */

    W	size;	/* メッセージのサイズが入る。サイズにはこのヘッダ部分 */
		/* も入る。					      */
	
    ID	rport;	/* 返答するためのメッセージバッファ。ポートマネージャ  */
		/* に対してメッセージを送ったときに使ったメッセージバッ*/
		/* ファは返答には使用しない (他のタスクも同じメッセー  */
		/* ジバッファを使用するため)。その代わり、rport で指定 */
		/* したメッセージバッファを使用する。                  */
  };

  <ボディ部分>

  ボディ部分は、要求の種類によって内容が異なっている 3 つの構造体の共
用体となっています。
  
  union port_message_body_t
  {
    struct regist_port_t	regist;		/* 登録するときに使用 */
  				                /* する情報。         */

    struct unregist_port_t	unregist;	/* 登録を抹消するとき */
						/* に使用する情報。   */

    struct find_port_t		find;		/* 登録したメッセージ */
						/* バッファを検索する */
						/* ときに使用する情報。*/
  };

  各々の要求に対応する構造体は次のように定義しています。


 <メッセージ登録処理を行うときに使用する構造体>

  struct regist_port_t
  {
    PORT_NAME	name;	/* ポートの名前； この名前はシステムグローバル */
			/* でなければいけない。もし、すでに同じ名前が  */
			/* 登録されていたときにはエラーとなる。        */

    ID		port;	/* 登録するメッセージバッファの ID が入る。メッ */
			/* セージバッファの ID は、すでに登録されてい   */
			/* ても構わない。ポートマネージャは特にメッセー */
			/* ジバッファが重複して登録されているかのチェッ */
			/* クは行わない。                               */
  			/* 残念ながら、ポートマネージャは、メッセージ   */
			/* ポートを適当に割り当てることはしない。       */

    ID		task;	/* ポートマネージャに対してリクエストを送った */
			/* タスクの ID 。この値は、削除するときに識別 */
			/* するために使用する。これは、登録したタスク */
			/* とは別のタスクが不正にメッセージバッファ情 */
			/* 報を削除することを防ぐために使用するための */
			/* 値である。                                 */
  };



  <メッセージバッファの抹消処理を行うときに使用する構造体>

  struct unregist_port_t
  {
    PORT_NAME name;	/* 登録テーブルから抹消するメッセージバッファ */
			/* の名前。登録するときに使用した名前を指定す */
			/* る。*/

    ID task;		/* 抹消処理を要求したタスクの ID 。この値は、 */
  			/* メッセージバッファを登録したタスクと同じタ */
			/* スクかどうかを判別するために使用する。     */
  };


 <メッセージバッファの ID を検索するときに使用する構造体>

  struct find_port_t
  {
    PORT_NAME	name;	/* 検索するポートの名前; メッセージバッファを */
			/* 登録するときに使用した名前を指定する。     */
  };


A.2 返答メッセージ

  ポートマネージャからの返答メッセージは次のように定義しています。
  返答メッセージのフォーマットは一種類だけです。


  struct recv_port_message_t
  {
    PORT_MANAGER_ERROR 	error;	/* ポートマネージャの処理が正常に終っ */
				/* たかを示す。エラー番号が入る。もし、 */
				/* エラーとなったときには、次の要素  */
				/* port は、意味がなくなる。         */

    ID			port;	/* メッセージバッファの ID 。         */
                                /* 登録処理ではこの値は特に必要としな */
				/* いが、いちおう登録したときのメッセー */
				/* ジバッファの ID が入る。           */
				/* ポートマネージャから登録を抹消する */
				/* ときにも、同様に登録したときのメッ */
				/* セージバッファの ID が入る。 抹消し */
				/* た後ではメッセージバッファは使えな */
				/* くなることが考えられるので、登録処 */
				/* 理よりも意味がない値である。       */
  			        /* 一番この値を使用するのは、メッセー */
				/* ジバッファ ID を検索する処理のとき */
				/* だろう。                           */
  };



B. ポートマネージャで定義している型

  ポートマネージャ定義している独自の型は以下のとおりです。

 <ポートマネージャからの返答；エラー番号>

 ポートマネージャへ要求を送ったときには、この中に指定した値のどれか
 が必ず返る。

  typedef enum port_manager_error_t
  {
    E_PORT_OK,			/* 正常 */

    E_PORT_DUPLICATION,		/* 登録しようとしたメッセージバッファ */
				/* の名前はすでに登録されている。     */

    E_PORT_NOTFOUND,		/* 登録テーブルから検索しようとしたメッ */
				/* セージバッファは存在しなかった。     */

    E_PORT_FULL,		/* 登録するための空きエントリがなかっ */
				/* た。                               */

    E_PORT_INVALID,		/* 登録したタスクと抹消要求を出したタ */
				/* スクが異なっていた (権限のチェック) */

    E_PORT_SYSTEM		/* システムコールでエラーが発生した。 */
  } PORT_MANAGER_ERROR;


 <メッセージバッファを識別するためにつける名前の型>

  typedef B	PORT_NAME[PORT_NAME_LEN + 1];




<履歴>

$Log: port-manager.text,v $
Revision 1.1  2011/12/27 17:13:36  liu1
Initial Version.

Revision 1.1  1995-01-21 13:06:26  night
はじめての登録。

