このセクションでは、リソースプールインタフェースのコード例を示します。
sysconf(3C) は、システム全体の CPU 数に関する情報を提供します。次の例は、特定のアプリケーションのプール pset に定義された CPU 数の確認の粒度を示しています。
この例の重要なポイントは次のとおりです。
pvals[] は NULL 終端配列になります。
pool_query_pool_resources() は、アプリケーションのプール my_pool から pvals 配列型 pset に一致するすべてのリソースのリストを返します。プールは pset リソースのインスタンスを 1 つしか持てないため、各インスタンスは常に nelem で返されます。reslist[] には、唯一の要素である pset リソースが含まれます。
pool_value_t *pvals[2] = {NULL}; /* pvals[] should be NULL terminated */ /* NOTE: Return value checking/error processing omitted */ /* in all examples for brevity */ conf_loc = pool_dynamic_location(); conf = pool_conf_alloc(); pool_conf_open(conf, conf_loc, PO_RDONLY); my_pool_name = pool_get_binding(getpid()); my_pool = pool_get_pool(conf, my_pool_name); pvals[0] = pool_value_alloc(); pvals2[2] = { NULL, NULL }; pool_value_set_name(pvals[0], "type"); pool_value_set_string(pvals[0], "pset"); reslist = pool_query_pool_resources(conf, my_pool, &nelem, pvals); pool_value_free(pvals[0]); pool_query_resource_components(conf, reslist[0], &nelem, NULL); printf("pool %s: %u cpu", my_pool_ name, nelem); pool_conf_close(conf);
次の例では、アプリケーションのプール pset 内で定義されているすべてのリソースプールが一覧表示されています。
この例の重要なポイントは次のとおりです。
動的 conf ファイルを読み取り専用の PO_RDONLY で開きます。pool_query_pools() は pl のプールのリストおよび nelem のプール数を返します。要素から pval 値に pool.name プロパティーを取得するには、各プールに対して pool_get_property() を呼び出します。
pool_get_property() は pool_to_elem() を呼び出して libpool エンティティーを不透明な値に変換します。pool_value_get_string() は不透明なプール値から文字列を取得します。
conf = pool_conf_alloc(); pool_conf_open(conf, pool_dynamic_location(), PO_RDONLY); pl = pool_query_pools(conf, &nelem, NULL); pval = pool_value_alloc(); for (i = 0; i < nelem; i++) { pool_get_property(conf, pool_to_elem(conf, pl[i]), "pool.name", pval); pool_value_get_string(pval, &fname); printf("%s\n", name); } pool_value_free(pval); free(pl); pool_conf_close(conf);
この例の重要なポイントは次のとおりです。
pool_query_pool_resources() は、rl のすべてのリソースのリストを取得します。pool_query_pool_resources() の最後の引数が NULL のため、すべてのリソースが返されます。各リソースについて、name、load、および size プロパティーが読み取られ、出力されます。
strdup() への呼び出しは、ローカルメモリーを割り当て、get_string() によって返される文字列をコピーします。get_string() への呼び出しは、get_property() への次の呼び出しによって解放されるポインタを返します。strdup() への呼び出しが含まれていない場合、文字列を次に参照した際に、セグメンテーション違反によってアプリケーションにエラーが発生する可能性があります。
printf("pool %s\n:" pool_name); pool = pool_get_pool(conf, pool_name); rl = pool_query_pool_resources(conf, pool, &nelem, NULL); for (i = 0; i < nelem; i++) { pool_get_property(conf, pool_resource_to_elem(conf, rl[i]), "type", pval); pool_value_get_string(pval, &type); type = strdup(type); snprintf(prop_name, 32, "%s.%s", type, "name"); pool_get_property(conf, pool_resource_to_elem(conf, rl[i]), prop_name, pval); pool_value_get_string(val, &res_name); res_name = strdup(res_name); snprintf(prop_name, 32, "%s.%s", type, "load"); pool_get_property(conf, pool_resource_to_elem(conf, rl[i]), prop_name, pval); pool_value_get_uint64(val, &load); snprintf(prop_name, 32, "%s.%s", type, "size"); pool_get_property(conf, pool_resource_to_elem(conf, rl[i]), prop_name, pval); pool_value_get_uint64(val, &size); printf("resource %s: size %llu load %llu\n", res_name, size, load); free(type); free(res_name); } free(rl);
次の例では、pset の pool.comment プロパティーを設定します。また、この例では pool.newprop に新規プロパティーも作成します。
この例の重要なポイントは次のとおりです。
静的構成ファイルで PO_RDWR を使用して pool_conf_open() への呼び出しを行う場合は、呼び出し元のが root である必要があります。
このユーティリティーの実行後にこれらの変更を pset にコミットするには、pooladm -c コマンドを発行します。ユーティリティーに変更をコミットさせるには、ゼロ以外の第 2 引数を指定して pool_conf_commit() を呼び出します。
pool_set_comment(const char *pool_name, const char *comment) { pool_t *pool; pool_elem_t *pool_elem; pool_value_t *pval = pool_value_alloc(); pool_conf_t *conf = pool_conf_alloc(); /* NOTE: need to be root to use PO_RDWR on static configuration file */ pool_conf_open(conf, pool_static_location(), PO_RDWR); pool = pool_get_pool(conf, pool_name); pool_value_set_string(pval, comment); pool_elem = pool_to_elem(conf, pool); pool_put_property(conf, pool_elem, "pool.comment", pval); printf("pool %s: pool.comment set to %s\n:" pool_name, comment); /* Now, create a new property, customized to installation site */ pool_value_set_string(pval, "New String Property"); pool_put_property(conf, pool_elem, "pool.newprop", pval); pool_conf_commit(conf, 0); /* NOTE: use 0 to ensure only */ /* static file gets updated */ pool_value_free(pval); pool_conf_close(conf); pool_conf_free(conf); /* NOTE: Use "pooladm -c" later, or pool_conf_commit(conf, 1) */ /* above for changes to the running system */ }
プールのコメントを変更して新規プールプロパティーを追加するもう 1 つの方法は、poolcfg(1M) を使用する方法です。
poolcfg -c 'modify pool pool-name (string pool.comment = "cmt-string")' poolcfg -c 'modify pool pool-name (string pool.newprop = "New String Property")'