45.3. Gerenciamento de memória #

SPI_palloc — aloca memória no contexto do executor superior
SPI_repalloc — realoca memória no contexto do executor superior
SPI_pfree — libera a memória no contexto do executor superior
SPI_copytuple — faz a cópia de uma linha no contexto do executor superior
SPI_returntuple — prepara para retornar uma tupla como um Datum
SPI_modifytuple — cria uma linha substituindo os campos selecionados de uma determinada linha
SPI_freetuple — libera uma linha alocada no contexto do executor superior
SPI_freetuptable — libera um conjunto de linhas criado por SPI_execute ou uma função semelhante
SPI_freeplan — libera uma instrução preparada salva anteriormente

O PostgreSQL aloca memória dentro de contextos de memória, que fornecem um método conveniente de gerenciar alocações feitas em muitos locais diferentes que precisam permanecer por diferentes intervalos de tempo. Destruir o contexto libera toda a memória alocada nele. Assim, não é necessário controlar objetos individuais para evitar vazamentos de memória; em vez disso, apenas um número relativamente pequeno de contextos precisa ser gerido. A função palloc e funções relacionadas alocam memória no contexto corrente.

A função SPI_connect cria um novo contexto de memória e o torna o corrente. A função SPI_finish restaura o contexto de memória corrente anterior, e destrói o contexto criado por SPI_connect. Estas ações garantem que as alocações transitórias de memória feitas em uma função C sejam recuperadas na saída da função C, evitando vazamento de memória.

Entretanto, se a função C precisar retornar um objeto na memória alocada (como o valor de um tipo de dados passado por referência), não se pode alocar esta memória usando a função palloc, pelo menos não enquanto estiver conectado à SPI. Se for tentado, o objeto será desalocado por SPI_finish e a função C não funcionará de maneira confiável. Para resolver este problema, deve ser usada a função SPI_palloc para alocar memória para o objeto retornado. A função SPI_palloc aloca memória no contexto do executor superior, ou seja, o contexto de memória corrente quando a função SPI_connect foi chamada, que é precisamente o contexto certo para um valor retornado pela função C. Várias outras funções utilitárias descritas nesta seção também retornam objetos criados no contexto do executor superior.

Quando a função SPI_connect é chamada, o contexto privado da função C, criado por SPI_connect, torna-se o contexto corrente. Todas as alocações feitas pelas funções palloc, repalloc, ou funções utilitárias da SPI (exceto conforme descrito nesta seção) são feitas neste contexto. Quando uma função C se desconecta do gerenciador da SPI (via SPI_finish) o contexto corrente é restaurado para o contexto do executor superior, e todas as alocações feitas no contexto de memória da função C são liberadas não podendo mais ser usadas.