22.3. メモリ管理

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

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

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

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

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

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

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

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

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