41.3. Gestion de la mémoire
PostgreSQL™ alloue de la
mémoire dans des contextes mémoire qui
donnent une méthode pratique pour gérer les allocations faîtes dans
plusieurs endroits qui ont besoin de vivre pour des durées
différentes. Détruire un contexte libère toute la mémoire qui y était
allouée. Donc, il n'est pas nécessaire de garder la trace des objets
individuels pour éviter les fuites de mémoire ; à la place, seul un
petit nombre de contextes doivent être gérés. palloc et les fonctions liées allouent de la mémoire
du contexte « courant ».
SPI_connect crée un nouveau contexte
mémoire et le rend courant. SPI_finish
restaure le contexte mémoire précédant et détruit le contexte créé
par SPI_connect. Ces actions garantissent
que les allocations temporaires de mémoire faîtes dans votre
procédure soient réclamées lors de la sortie de la procédure, évitant
les fuites de mémoire.
En revanche, si votre procédure a besoin de renvoyer un objet dans de
la mémoire allouée (tel que la valeur d'un type de donné passé par
référence), vous ne pouvez pas allouer cette mémoire en utilisant
palloc, au moins pas tant que vous êtes
connecté à SPI. Si vous essayez, l'objet sera désalloué par
SPI_finish et votre procédure ne
fonctionnera pas de manière fiable. Pour résoudre ce problème,
utilisez SPI_palloc pour allouer de la
mémoire pour votre objet de retour. SPI_palloc alloue de la mémoire dans le
« contexte de mémoire courant »,
c'est-à-dire le contexte de mémoire qui était courant lorsque
SPI_connect a été appelée, ce qui est
précisément le bon contexte pour une valeur renvoyée à partir de
votre procédure.
Si SPI_palloc est appelé pendant que la
procédure n'est pas connectée à SPI, alors il agit de la même manière
qu'un palloc normal. Avant qu'une procédure
ne se connecte au gestionnaire SPI, toutes les allocations faîtes par
la procédure via palloc ou par une fonction
utilitaire SPI sont faîtes dans le contexte de mémoire courant.
Quand SPI_connect est appelée, le contexte
privé de la procédure, qui est créée par SPI_connect, est nommé le contexte courant. Toute
allocation faîte par palloc, repalloc ou une fonction utilitaire SPI (à part pour
SPI_copytuple, SPI_returntuple, SPI_modifytuple, et SPI_palloc) sont faîtes dans ce contexte. Quand une
procédure se déconnecte du gestionnaire SPI (via SPI_finish), le contexte courant est restauré au
contexte de mémoire courant et toutes les allocations faîtes dans le
contexte de mémoire de la procédure sont libérées et ne peuvent plus
être utilisées.
Toutes les fonctions couvertes dans cette section peuvent être
utilisées par des procédures connectées comme non connectées. Dans
une procédure non connectée, elles agissent de la même façon que les
fonctions serveur sous-jacentes (palloc,
etc.).