コア・クライアント: メインループの論理 |
![]() Last modified 7:09 PM UTC, June 09 2004 |
コア・クライアントのメインループは、下記の関数を繰り返し呼びます。
bool CLIENT_STATE::do_something() { bool action=false; if (check_suspend_activities()) return false; action |= net_xfers->poll(); action |= http_ops->poll(); action |= file_xfers->poll(); action |= active_tasks->poll(); action |= scheduler_rpcs->poll(); action |= start_apps(); action |= pers_xfers->poll(); action |= handle_running_apps(); action |= handle_pers_file_xfers(); action |= garbage_collect(); write_state_file_if_needed(); return action; }
この関数は必要に応じて新しい活動を開始させるとともに、 現在の活動が完了するのを監視します。 この関数は、スリープを伴うループ(コマンドラインプログラム)から、 あるいは、イベントループ(GUIプログラム)のタイマーハンドラのいずれかから、 繰り返し呼ばれるはずのものです。 何らかの変化があると、この関数はtrueを返します。 その場合には、 スリープすることなくもう一度この関数を呼ばなければいけません。
呼びだされる様々な関数は以下のとおりです。
check_suspend_activities は、 ユーザの好みの設定(user preference)が[BOINCに]仕事をさせてはいけない と指定しているような条件がおきていないかどうか、たとえば、 最新のマウスやキーボード入力があったかどうか、または、バッテリーで 動作していないか、といった条件をチェックします。
net_xfers->poll(), http_ops->poll(), file_xfers->poll() および pers_xfers->poll() という関数は、種々のFSM層が起こす内部遷移を管理します。
start_apps() 関数は、あるアプリケーションを開始 することができるかどうかを検査します。 つまり、 CPU slot に空きがあり、入力ファイルが全部揃っている リザルトもあるという条件を調べます。 もし条件が満たされていれば、そのアプリケーションを開始します。
handle_running_apps() 関数は、走っていたアプリケーションが 終了したかどうかを調べ、もしそうなら、後始末をします。
handle_pers_file_xfers() 関数は、新しいファイル転送を 必要に応じて開始します。
garbage_collect() 関数は、 廃棄できるオブジェクトがないか検査します。 たとえば、あるファイルが non-sticky訳注1 で、 かつ、どんなワークユニットやリザルトからも参照されていないなら、 FILE_INFO とその実体である ファイルを削除することができます。 あるリザルト[の計算] が完了して、[サーバから]確認を得たなら、 その RESULT オブジェクトは削除することができます。
write_state_file_if_needed(): 上述の関数のどれかが、client_state.xml に書き出すべき状態変化 (たとえば、今回のコア・クライアントの実行[の途中経過] が消え去らないよう残す 必要があるような、[意味ある] 状態変化)を起こしたときは、その関数は、 client_state_dirty というフラグをセットします。 関数 write_state_file_if_needed() は、このフラグが立つと、 client_state.xml [へ状態を] 書き出します。