_C_Quickpool_Init() — 高速プール・メモリー・マネージャーの初期化

フォーマット

#include <stdlib.h>
int _C_Quickpool_Init(unsigned int numpools, unsigned int *cell_sizes, unsigned int *num_cells);

言語レベル

Extended

スレッド・セーフ

はい

説明

_C_Quickpool_Init() 関数が呼び出されると、同じ活動化グループ内のメモリー・マネージャー関数 (malloccallocrealloc、および free) へのすべての後続の呼び出しは、高速プール・メモリー・マネージャーを使用します。このメモリー・マネージャーは、一部のアプリケーションのパフォーマンスを改善します。

高速プール・メモリー・マネージャーは、メモリーを一連のプールに分割します。各プールは同じサイズの多くのセルに分割されます。 プールの数、各プールのセルのサイズ、および各プール・エクステントのセル数は、_C_Quickpool_Init() 関数を使用して設定されます。環境変数を使用してこのサポートを構成することもできます (セクション環境変数を参照してください)。

例えば、ユーザーが、それぞれのプールが 64 のセルを含む、4 つのプールを定義すると仮定します。 最初のプールにはサイズが 16 バイトのセルがあり、2 番目のプールにはサイズが 256 バイトのセルがあり、3 番目のプールにはサイズが 1024 バイトのセルがあり、そして 4 番目のプールにはサイズが 2048 バイトのセルがあります。ストレージの要求が行われると、メモリー・マネージャーは、その要求をまず 1 つのプールに割り当てます。メモリー・マネージャーは、要求のストレージのサイズと所定のプールのセルのサイズとを比較します。

この例では、最初のプールは 1 バイトから 16 バイト間のサイズの要求を満たし、2 番目のプールは 17 バイトから 256 バイトのサイズの要求を、3 番目のプールは 257 バイトから 1024 バイトのサイズを、そして 4 番目のプールは 1025 バイトから 2048 バイトのサイズを満たします。 最大セル・サイズよりも大きな要求はすべて、デフォルト・メモリー・マネージャーにより割り振られます。

プールに割り当てられてから、プールのフリー・キューが検査されます。 各プールには、解放されまだ再割り振りされていないセルを含むフリー・キューがあります。 フリー・キューにセルがある場合は、そのセルはフリー・キューから除去され、戻されます。それ以外の場合は、セルは現行のプールのエクステントから取り出されます。 エクステントとは、1 ブロックとして割り当てられるセルの集合です。 最初は、プールにはエクステントがありません。

プールに対して最初の要求が発生すると、1 つのエクステントがそのプールについて割り振られ、要求はこのエクステントから満たされます。 そのエクステントがすべて使用されるまで、このプールに対する後続の要求も、そのエクステントによって満たされます。エクステントがいっぱいになると、プールに新しいエクステントが割り振られます。 新しいエクステントの割り振りができない場合、メモリー障害が存在していると見なされます。デフォルト・メモリー・マネージャーを使用してストレージを割り振るための試みが行われます。この試行が正常に行われない場合は、NULL 値が戻されます。

numpools
高速プール・メモリー・マネージャーで使用するプールの数。このパラメーターには、1 から 64 の間の値を指定できます。
cell_sizes
符号なし整数値の配列。配列のエントリー数は、numpools パラメーターに指定した数と同数です。各エントリーは、所定のプールの 1 つのセル内のバイト数を指定します。 これらの値は 16 バイトの倍数である必要があります。この値が 16 バイトの倍数でない数に指定された場合、そのセル・サイズは 16 バイトの倍数に一番近い数に切り上げられます。 最小有効値は 16 バイトで最大有効値は 4096 バイトです。
num_cells
符号なし整数値の配列。配列のエントリー数は、numpools パラメーターに指定した数と同数です。各エントリーは、該当するプールの単一エクステント内のセル数を指定します。 各値には任意の非負数を指定できますが、アーキテクチャーによる制約のために各エクステントの合計サイズは制限される場合があります。値ゼロは、実装で大きな値を選択する必要があることを示します。

以下は前述の例に対しての、_C_Quickpool_Init() の呼び出しです。

unsigned int cell_sizes[4] = { 16, 256, 1024, 2048 };
unsigned int cells_per_extent[4] = { 64, 64, 64, 64 };
rc = _C_Quickpool_Init(4,                       /* number of pools            */
                       cell_sizes,              /* cell sizes for each pool   */
                       cells_per_extent);       /* extent sizes for each pool */

戻り値

以下のリストは、_C_Quickpool_Init() 関数の戻り値を示しています。
0
Success
-1
代替メモリー・マネージャーが、この活動化グループ用にすでに使用可能になっています。
-2
制御構造のストレージの割り振り中にエラーが発生しました。
-3
無効なプール数が指定されました。
-4
_C_Quickpool_Init() が、無効な活動化グループから呼び出されました。
-5
_C_Quickpool_Init() の実行中に予期しない例外が発生しました。

次の例では _C_Quickpool_Init() を使用して、高速プール・メモリー割り振りを使用可能にします。
#include <stdlib.h>
#include <stdio.h>
int main(void) {
  char *p;
  unsigned int cell_sizes[2]       = { 16, 64 };
  unsigned int cells_per_extent[2] = { 16, 16 };

  if (_C_Quickpool_Init(2, cell_sizes, cells_per_extent) {
    printf("Error initializing Quick Pool memory manager.\n");
    return -1;
  }
  if ((p = malloc(10)) == NULL) {
    printf("Error during malloc.¥n");
    return -2;
  }
  free(p);
  printf("Test successful!¥n");
  return 0;
}
/*****************Output should be similar to:*****************
Test successful!
*******************************************************************/