IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)

42.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.).