Annotation of OpenXM/src/ox_toolkit/README, Revision 1.3
1.1 ohara 1: # Author: 小原功任 @ 金沢大学理学部計算科学教室
2: # URI: http://omega.s.kanazawa-u.ac.jp/ohara/
1.3 ! ohara 3: # $OpenXM: OpenXM/src/ox_toolkit/README,v 1.2 1999/12/15 01:59:58 ohara Exp $
1.1 ohara 4:
5: ☆ libox.a マニュアル。
6:
7: libox.a を利用するには次のヘッダファイルをインクルードする必要があります。
8:
9: #include <oxtag.h>
10: #include <ox.h>
11: #include <parse.h>
12:
13: 各構造体および関数の宣言はそれぞれのヘッダファイルを見てください。
14: ここでは基本的な考え方について説明します。
15:
16: まず、すべての CMO データはそのデータ型に対応した new 関数によって生成
17: します。たとえば CMO_ZZ 型のオブジェクトは new_cmo_zz() 関数によって生
18: 成されます。
19:
20: CMO データを送受信するには、CMO の種類によらず send_cmo(),
21: receive_cmo() を用います。これらの関数は OX ヘッダを扱いませんので、OX
22: メッセージを送受信するときには send_ox_tag(), receive_ox_tag() をその
23: 前に呼ぶ必要があります。
24:
1.2 ohara 25: 1. データ型
1.1 ohara 26:
1.2 ohara 27: このツールキットで定義されている各構造体の生成については次節を参照せよ。
28:
29: 1.1 CMO (Common Math Object)
1.1 ohara 30: 次のデータ型(構造体)が用意されている。
31:
32: cmo
33: cmo_null
34: cmo_int32
35: cmo_datum
36: cmo_string
37: cmo_mathcap
38: cmo_list
39: cmo_monomial32
40: cmo_zz
41: cmo_qq
42: cmo_zero
43: cmo_dms_generic
44: cmo_ring_by_name
45: cmo_distributed_polynomial
46: cmo_indeterminate
47: cmo_error2
48:
49: このうち cmo 型はいわば抽象基底クラスに相当するものであり、この型のオ
1.2 ohara 50: ブジェクトを明示的には生成されない。このクラスはポインタ型のキャストの
51: ために用意されている。また cmo_distributed_polynomial は cmo_list の派
52: 生クラスであると思ってもよい。
53:
54: 1.2 OX オブジェクト
55: 次のデータ型(構造体)が用意されている。
56:
57: ox
58: ox_command
59: ox_data
60:
61: このうち、ox 型は抽象基底クラスなので、オブジェクトをつくってはいけない。
62:
63: 2. オブジェクトの生成
64:
65: オブジェクトを生成するために、new 関数群が用意されている。それぞれの関
66: 数はオブジェクトを生成して、そのオブジェクトへのポインタを返す。
1.1 ohara 67:
68: new_cmo_null();
69: new_cmo_int32(int i);
70: new_cmo_string(char* s);
71: new_cmo_mathcap(cmo* ob);
72: new_cmo_list();
73: new_cmo_monomial32();
74: new_cmo_monomial32_size(int size);
75: new_cmo_zz();
76: new_cmo_zz_size(int size);
77: new_cmo_zz_set_si(int integer);
78: new_cmo_zz_noinit();
79: new_cmo_zero();
80: new_cmo_distributed_polynomial();
81: new_cmo_dms_generic();
82: new_cmo_ring_by_name(cmo* ob);
83: new_cmo_indeterminate(cmo* ob);
84: new_cmo_error2(cmo* ob);
85:
1.2 ohara 86: 3. 高水準 API
87:
88: 高水準 API は「OpenXM クライアント」から利用することを前提に設計されている。
89:
90: 3.1 通信の開始
91:
92: 通信を開始する場合には、次の関数のいずれかを利用する。
93:
94: ox_file_t ox_start(char* host, char* prog1, char* prog2);
95: ox_file_t ox_start_insecure_nonreverse(char* host, short portControl, short portStream);
96:
97: 第一の関数は、ローカルマシン上に OpenXM サーバを起動し、そのサーバとの
98: 間に"reverse モード"で通信路を開設する。通信に使われるポート番号は自動
99: 的に生成される。host はローカルマシンのホスト名(あるいは "localhost")、
100: prog1 はコントロールサーバの実行ファイル名、
101: prog2 は計算サーバの実行ファイル名でなければならない。
102:
103: 第二の関数は、リモートマシン上に既に起動されている OpenXM サーバとの間に
104: 通信路を開設する。通信に使われるポート番号は明示的に与えなければならない。
105: host はリモートマシンのホスト名、
106: portControl はコントロールサーバとの通信のためのポート番号、
107: portStream は計算サーバとの通信のためのポート番号である。
108:
109: それぞれの関数はサーバ(正確には二つのサーバの組)の識別子を返す。
110: この識別子は高水準 API の各関数で利用される。
111:
112: 3.2 通信の終了
113:
114: 通信の終了のためには次の二つの関数が用意されている。
115:
116: void ox_close(ox_file_t sv);
117: void ox_shutdown(ox_file_t sv);
118:
119: 第一の関数はコントロールサーバに SM_control_kill を送ることによって、
120: サーバを終了させる。第二の関数は計算サーバに SM_shutdown を送ることに
121: よって、サーバを終了させる(予定)。
122:
123: 3.3 SM コマンドの送信
124:
125: void ox_push_cmd(ox_file_t sv, int sm_code);
126:
127: サーバにスタックマシンコマンドを送る。コマンドはコマンド番号で与える。
1.1 ohara 128:
1.2 ohara 129: 3.4 CMO の送受信
130:
131: void ox_push_cmo(ox_file_t sv, cmo *c);
132: cmo* ox_pop_cmo(ox_file_t sv);
133: char* ox_popString(ox_file_t sv);
134:
135: ox_push_cmo は cmo を送信、ox_pop_cmo は cmo を受信する。ox_popString
136: は cmo を文字列形式に変換して受信するが、変換の結果はサーバによって異
137: なる。
138:
139: 3.5 スタック処理
140:
141: int ox_pops(ox_file_t sv, int num);
142:
143: スタック上の num 個のオブジェクトを廃棄する。
144:
145: 3.6
146:
147: int ox_flush(ox_file_t sv);
148:
149: 通信路を flush する(実際には何もしない)。
150:
151: 3.7
152:
153: void ox_reset(ox_file_t sv);
154:
155: 計算を中断する。
156:
157: 3.8
158:
159: void ox_execute_string(ox_file_t sv, char* str);
160:
161: サーバのローカル言語で書かれた命令を評価し、結果をスタックに積む。
162:
163: 3.9
164:
165: int ox_cmo_rpc(ox_file_t sv, char *function, int argc, cmo *argv[]);
166:
167: function(argv[1], ...) を計算し、結果をスタックに積む。
168:
169: 3.10
170:
171: cmo_mathcap* ox_mathcap(ox_file_t sv);
172:
173: Mathcap を受け取る。現在は Mathcap の処理はユーザプログラムに任されている。
174: いずれこの関数は廃止される予定。
1.1 ohara 175:
1.2 ohara 176: 4. 低水準 API
1.1 ohara 177:
1.3 ! ohara 178: 低水準 API はファイルディスクリプタを直接利用する。
1.1 ohara 179:
1.3 ! ohara 180: 4.1 通信に使われるバイトオーダの決定
! 181:
! 182: int decideByteOrderServer(int fd, int order);
! 183:
! 184: このツールキットは、サーバが開始されるときにはすでに通信路が設定されて
! 185: いるが、その通信路に用いるバイトオーダの決定は行われていないと仮定して
! 186: いる。詳しくは、高山-野呂, "OpenXM の設計と実装" を参照せよ。
! 187:
! 188: (注意) クライアント側でのバイトオーダの設定は、高水準 API で自動的に行われる。
! 189:
! 190: 4.2
! 191:
! 192: int send_int32(int fd, int integer);
! 193:
! 194: fd に 32bit 整数を書き込む。
! 195:
! 196: int receive_int32(int fd);
! 197:
! 198: fd から 32bit 整数を読み込む。
! 199:
! 200: 4.3
! 201:
! 202: int send_cmo(int fd, cmo* m);
! 203:
! 204: fd に cmo を書き込む。
! 205:
! 206: cmo* receive_cmo(int fd);
! 207:
! 208: fd から cmo を読み込む。
! 209:
! 210: 4.4
! 211:
! 212: int next_serial();
! 213:
! 214: シリアルナンバを生成する。
! 215:
! 216: 4.5
! 217:
! 218: int send_ox_tag(int fd, int tag);
! 219:
! 220: fd に OX メッセージのヘッダ(tag+id)を書き込む。
! 221: シリアル番号は自動的に生成される。
! 222:
! 223: int receive_ox_tag(int fd);
! 224:
! 225: fd から OX メッセージのヘッダ(tag+id)を読み込む。
! 226:
! 227: 4.6
! 228:
! 229: int send_ox(int fd, ox* m);
! 230: int send_ox_cmo(int fd, cmo* m);
! 231: void send_ox_command(int fd, int sm_command);
! 232:
! 233: ox メッセージを送信する。
FreeBSD-CVSweb <freebsd-cvsweb@FreeBSD.org>