include/klic/struct.h 中で、global_variabls として 定義されている構造体である。この構造体の実体は、各プロセスに1つ (よって、逐次版であれば、システム内に1つ)だけ存在する。
KLICでは、大域的に用いられるデータの殆どはこの構造体に格納されている。 一般的に大域な変数をアクセスするためには、そのアドレス、すなわち、 32bit計算機では32bit長即値を扱う必要があり、この処理は 通常効率があまり良くない(例えば、SPARCなどのRISCプロセッサ、つまり、 命令がすべて32bit長である場合には、即値のレジスタへの ロードだけで2命令になってしまう)。 そこで、大域データを構造体にいれておき、その構造体へのポインタをレジスタ上に 持ち、個々の構造体要素データに関しては、 offsetで(つまり、32bitよりも短いデータで) アドレス表現できるようにすることにより、大域データへのアクセスコストを 減らすことを念頭に置いている。
以下でこの構造体の説明を行う(各々の詳細は、個別におこなう)。
struct global_variables {
q *heapp0; /* ヒープ割付点 */
q * Volatile heaplimit0; /* heaplimit変数(詳細後述) */
struct goalrec *current_queue0; /* 実行中優先度のゴールスタック */
struct goalrec *resumed_goals0; /* リダクション中に生じた再開ゴール群 */
unsigned long current_prio0; /* 現在の優先度 */
unsigned long top_prio0; /* 実行可能ゴールでの最高優先度 (未使用) */
struct prioqrec prioq0; /* 「優先度ゴールスタック」のリストの先頭 */
q *heaptop0; /* 現在のヒープの先頭 */
q *heapbottom0; /* 現在のヒープ面中のシステムヒープの割付点 */
q *real_heaplimit0; /* heaplimitのマスター(詳細後述) */
unsigned long heapsize0, maxheapsize0, incrementsize0;
/* 現在の片面ヒープサイズ、最大ヒープサイズ、ヒープマージンサイズ (in word) */
unsigned long real_heapbytesize0; /* ヒープサイズ(byte) */
double maxactiveratio0; /* ヒープ中の最大アクティブセル比 */
unsigned long this_more_space0; /* 最小の空領域 */
q *new_space_top0, *old_space_top0; /* ヒープ新領域、旧領域の先頭 */
unsigned long new_space_size0, old_space_size0;
/* ヒープ新領域、旧領域のサイズ */
q **gcstack0; /* GCで用いるスタックの底 */
q **gcsp0; /* GCで用いるスタックの先頭 */
q **gcmax0; /* GCで用いるスタックの上限 */
unsigned long gcstack_size0; /* GCで用いるスタックのサイズ */
Volatile long interrupt_off0; /* 割り込みフラグ */
struct goalrec *interrupt_qp0; /* 未仕様 */
struct { /* 並列実装用の構造 */
/* parallel comm Imp. */
long my_num0;
long num_pes0;
union {
/* shared-memory Imp. */
struct {
long queued0;
struct ex_goalrec* ex_qp0;
long currid0;
long oldid0;
long shm_htop0;
long shm_hbyte0;
long dummy[10];
} shm;
/* dist-memory Imp. */
} aux;
} par;
char *program_name0; /* コマンド名称 */
int command_argc0; /* コマンド引数個数 */
char **command_argv0; /* コマンド引数 */
q* (**gc_hook_table0)(); /* GC時のフックの表 */
int gc_hooktab_size0;
int num_gc_hooks0;
q* (**after_gc_hook_table0)(); /* GC後のフックの表 */
int after_gc_hooktab_size0;
int num_after_gc_hooks0;
unsigned long /* 計測用のカウンタ */
suspensions0, resumes0, copied_susp0, cum_susps0, cum_resumps0;
struct suspended_goal_rec *suspended_goal_list0; /* デッドロック検出用の
中断ゴールリスト */
Const struct predicate *postmortem_pred0; /* post mortem 用の述語 */
q postmortem_args0;
long generic_argc0; /* ジェネリック・オブジェクトのインターフェース用の引数個数 */
q generic_arg0[MAXGENERICARGS]; /* ジェネリック・オブジェクトのインターフェース用の引数領域 */
q reasons0[MAXSUSPENSION]; /* サスペンションスタック領域 */
}
この構造体は各プロセッサ内では、globalsなる名称の変数として 保持されている。 構造体のこれらの要素は、以下のとりきめにより、include/klic/struct.h中で マクロ化されている。
これを行うマクロがdeclare_globalsである。 つまり、大域データにアクセスする関数に置いては、declare_globals をまず記述することが推奨される。
globals.heapp0 は、
heapp というマクロを利用することにより、glbl->heapp0 として参照することができる。