import "exp/nacl/srpc"

このパッケージは、Native Clientのsimple RPC(SRPC)を実装しています。

パッケージファイル

client.go msg.go server.go

Add関数

func Add(name, fmt string, handler Handler)

Addは、ハンドラを名前付きメソッドとして登録します。fmtは、Native Clientのフォーマット文字列で、アルファベット文字で表されるパラメータの型のリストと、その後ろにコロン、その後ろに戻り値の型を表すアルファベット文字のリストで構成されます。フォーマットに使用する文字と、動的な型との対応を下に示します。

b	bool
C	[]byte
d	float64
D	[]float64
h	int	// ファイルデスクプリタ(ハンドル)
i	int32
I	[]int32
s	string

Enabled関数

func Enabled() bool

Enabledは、Native Clientランタイムで、SRPCが有効であるときにtrueを返します。

Serve関数

func Serve(fd int) os.Error

Serveは、ファイルデスクプリタfdから、新しいSRPC接続を受け付け、その接続にRPCの回答を行います。imc_acceptシステムコールに失敗したときは、fdをクローズし、エラーを返します。

ServeRuntime関数

func ServeRuntime() os.Error

ServeRuntimeは、Native Clientに組み込まれたランタイムによりRPCサービスを行います。この関数は、Addを使ってすべてのメソッドを登録した後に、mainから一度だけ呼び出さなくてはなりません。

Client型

Clientは、クライアント側のSRPC接続を表します。

type Client struct {
    // contains unexported fields
}

NewClient関数

func NewClient(fd int) (c *Client, err os.Error)

NewClientは、ファイルデスクプリタfdを使用する新しいクライアントをアロケートします。

(*Client) NewRPC関数

func (c *Client) NewRPC(done chan *RPC) *RPC

NewRPCは、クライアント接続上に新しいRPCを作成します。

Errno型

Errnoは、SRPCのステータスコードです。

type Errno uint32
const (
    OK Errno = 256 + iota
    ErrBreak
    ErrMessageTruncated
    ErrNoMemory
    ErrProtocolMismatch
    ErrBadRPCNumber
    ErrBadArgType
    ErrTooFewArgs
    ErrTooManyArgs
    ErrInArgTypeMismatch
    ErrOutArgTypeMismatch
    ErrInternalError
    ErrAppError
)

(Errno) String関数

func (e Errno) String() string

Handler型

Handlerは、SRPCメソッド用のハンドラです。このハンドラは、argから引数を読み込み、配列の上限サイズをチェックし、戻り値をretに書き込み、Errnoステータスコードを返します。

type Handler interface {
    Run(arg, ret []interface{}, size []int) Errno
}

RPC型

RPCは、クライアントによって発行されたRPCを表します。

type RPC struct {
    Ret   []interface{} // 戻り値
    Done  chan *RPC     // 届いた事を知らせるチャネル
    Errno Errno         // ステータスコード
    // contains unexported fields
}

(*RPC) Call関数

func (r *RPC) Call(name string, arg []interface{}) (ret []interface{}, err Errno)

Callは、コンビニエンスラッパーで、RPCリクエストを開始し、それが終わるのを待って結果を返します。これは、次のように実装されています。

r.Start(name, arg)
<-r.Done
return r.Ret, r.Errno

(*RPC) Start関数

func (r *RPC) Start(name string, arg []interface{})

Startは、与えられた引数とともにnameで指定したメソッドにRPCリクエストを発行します。rは、他の実行中のリクエストで使用されていてはなりません。RPCの終了を待つため、r.Doneチャネルから受信し、その後、r.Ratとr.Errnoをチェックしてください。

バグ

Addのフォーマット文字列のところは、interface{}型で渡された関数をリフレクションによってパラメータ型を解析するように書き換えます。