メモリ管理

サーバはメモリコンテキスト内でメモリの割り当てを行ないます。ある メモリコンテキストで割り当てられたメモリは、そのコンテキストを破 壊することによって、他のコンテキストで割り当てられたメモリに影響 を与えることなく開放できます。( palloc などによ り)割り当てられたメモリは全て、現在のコンテキストとして選ばれた コンテキスト内に作成されています。現在のコンテキストの外部に割り 当てられたメモリを開放(または、再割り当て)を行なおうとした場合、 予期できない結果を得ることになります。

メモリコンテキストの生成と切替えは SPI マネージャのもつメモリ管理 機能によって行なわれます。

SPI プロシージャは2つのメモリコンテキストを扱います。上位エグゼキュ ータのメモリコンテキストと(接続済みの場合)プロシージャメモリコン テキストです。

SPI マネージャにプロシージャが接続されるまでは、現在のメモリコンテキ ストは上位エグゼキュータコンテキストになっています。ですので、プロシ ージャ自体が pallocrepalloc 、または、SPI ユーティリティ関数を使っ て生成する割り当てメモリはこのコンテキストに作成されます。

SPI_connect が呼び出されると、現在のコンテキス トはプロシージャのコンテキストになります。 pallocrepalloc、または ( SPI_copytupleSPI_modifytupleSPI_pallocSPI_repalloc を除く)SPI ユーティリティ関数を使 って生成した割り当てメモリはこのコンテキストに作成されます。

プロシージャが( SPI_finish を使って)SPI マネー ジャーから切断されると、現在のコンテキストは上位エグゼキュータのコンテ キストに戻され、プロシージャメモリコンテキストに作成された割り当てメモ リは開放され、二度と使えなくなります。

上位エグゼキュータに何かを返したい場合、そのためのメモリを上位コンテ キストに割り当てなければなりません!

SPI は上位エグゼキュータに割り当てたメモリを自動的に開放する機能を 持ちません!

問い合わせが完了すると、SPI は問い合わせ実行中に割り当てたメモリを 自動的に開放します!