int score_runtime_resource(void);
void score_runtime_usage(void);
score_runtime_resource() はユーザプログラムまたはランタイムライブラリで実装されなければならないコールバック関数です。この関数は scrun(1) の SCore オプションでユーザが指定したリソースをチェックするのに使用されます。score_runtime_usage() はランタイムの使用法を表示するために実装されなければならないコールバック関数です。
scrun(1) がコマンドラインで指定されたユーザプログラムを、ユーザの指定したリソース要求を解析し、その要求が有効であるかどうかをチェックするために scrun が起動されたホスト上で呼び出します。これは、ランタイムがリソース要求をチェックすることができるように、(プログラマによって書かれた) score_runtime_resource() 関数が呼び出される score_initialize() 関数の中で行われます。この関数がゼロでない値を返した場合、ユーザプログラムの起動は中止され、そうでない場合には scrun が SCore-D へのログインを試みます。
SCore-D へのログインが成功した後、SCore-D は割り当てられたクラスタノード上でユーザプログラムを fork および exec します。ここで、score_initialize() が再び各ノード上で呼び出されます。全てのランタイムライブラリは、<score.h> で定義されている変数にアクセスしたり PM ライブラリを介して通信を行ったりする前に score_initialize() 関数を呼ばなければなりません。score_initialize() 関数では、SCore-D から渡された情報に従って PM コンテキストを初期化し、他のノードとの通信を可能にします。
#include <score.h>
void my_runtime_initialize(int argc, char **argv) {
score_initialize(argc, argv);
/* score_initialize() does not return, when this program is
invoked on a local host. */
/* When a user program is invoked on one or more cluster nodes,
the program can reach this point, and the runtime can
initialize itself. */
}
score_get_resource_request() を呼ぶことで得られます:
#include <score_resource.h>
int score_runtime_resource(void) {
scoreResourceRequest *rsrc = score_get_resource_request();
:
return( 0 );
}
また、リソース要求に制約を加えるための リソースマクロ があります。
score_become_idle() および score_become_busy() はユーザプロセスの実行状態を SCore-D に知らせます。ユーザプログラムが idle である場合には、たとえ実際にはビジーウェイトしているときでも、score_become_idle() を呼び出し、プロセスが busy になろうとしたら score_become_busy() を呼び出すことが望ましいです。ユーザプロセスの状態を正しく知らせることで、SCore-D はユーザ並列プロセス 全体の 状態を知ることができます。SCore-D は、プロセス全体が idle である場合にはあまりスケジュールせず、またプロセス全体がデッドロックしていると思われる場合にはプロセスを kill します。pmReleaseReceiveBuffer() を呼んでメッセージバッファを開放すること、およびそのタイミングは大変重要です。
void idle_loop( void ) {
caddr_t buf;
size_t size
while( pmReceive( score_pmnet[0], &buf, &size ) == ENOBUF ) {
score_become_idle();
}
score_become_busy();
process_received_message( buf, size );
pmReleaseReceiveBuffer( score_pmnet[0] );
return;
}
上の例のように、pmReleaseReceiveBuffer() でメッセージバッファを開放する前に、関数 score_become_busy() を呼ばなければなりません。そうでない場合、ユーザ並列プロセスが間違って SCore-D によってスケジュールされなかったり kill されたりする可能性があります。
#include <score_usage.h>
void score_runtime_usage(void) {
score_separate_usage("My-Runtime");
score_print_usage("magic", "NN", "magic number");
:
}
言語ランタイムの使用法を表示するためのこのサンプルコードは、以下のようなメッセージを生成します:
-- My-Runtime -- magic=NN magic number
scrun(1),
score_initialize(3),
score_runtime_resource(3),
score_become_idle(3),
score_become_busy(3),
resource macros