45.3. Gestión de memoria #

SPI_palloc — asigna memoria en el contexto superior del ejecutor
SPI_repalloc — reasigna memoria en el contexto superior del ejecutor
SPI_pfree — libera memoria en el contexto superior del ejecutor
SPI_copytuple — hace una copia de una fila en el contexto superior del ejecutor
SPI_returntuple — se prepara para devolver una tupla como un Datum
SPI_modifytuple — crea una fila reemplazando campos seleccionados de una fila dada
SPI_freetuple — libera una fila asignada en el contexto superior del ejecutor
SPI_freetuptable — libera un conjunto de filas creado por SPI_execute o una función similar
SPI_freeplan — libera una sentencia preparada guardada previamente

PostgreSQL asigna memoria dentro de contextos de memoria, los cuales proporcionan un método conveniente para gestionar asignaciones realizadas en muchos lugares diferentes que necesitan vivir durante distintos periodos de tiempo. Destruir un contexto libera toda la memoria asignada en él. Por lo tanto, no es necesario hacer un seguimiento de los objetos individuales para evitar fugas de memoria; en su lugar, solo se deben gestionar un número relativamente pequeño de contextos. palloc y las funciones relacionadas asignan memoria del contexto actual.

SPI_connect crea un nuevo contexto de memoria y lo convierte en el actual. SPI_finish restaura el contexto de memoria actual anterior y destruye el contexto creado por SPI_connect. Estas acciones aseguran que las asignaciones de memoria transitorias realizadas dentro de su función C se recuperen al salir de la función C, evitando fugas de memoria.

Sin embargo, si su función C necesita devolver un objeto en memoria asignada (como el valor de un tipo de datos de paso por referencia), no puede asignar esa memoria utilizando palloc, al menos no mientras esté conectado a SPI. Si lo intenta, el objeto será desasignado por SPI_finish, y su función C no funcionará de manera confiable. Para resolver este problema, utilice SPI_palloc para asignar memoria para su objeto de retorno. SPI_palloc asigna memoria en el contexto superior del ejecutor, es decir, el contexto de memoria que estaba actual cuando se llamó a SPI_connect, el cual es precisamente el contexto adecuado para un valor devuelto por su función C. Varias de las otras funciones de utilidad descritas en esta sección también devuelven objetos creados en el contexto superior del ejecutor.

Cuando se llama a SPI_connect, el contexto privado de la función C, creado por SPI_connect, se convierte en el contexto actual. Todas las asignaciones realizadas por palloc, repalloc o funciones de utilidad de SPI (excepto lo descrito en esta sección) se realizan en este contexto. Cuando una función C se desconecta del administrador de SPI (a través de SPI_finish), el contexto actual se restaura al contexto superior del ejecutor, y todas las asignaciones realizadas en el contexto de memoria de la función C se liberan y no se pueden utilizar más.