PostgreSQLLa base de données la plus sophistiquée au monde.
Documentation PostgreSQL 16.6 » Programmation serveur » Interface de programmation serveur » Gestion de la mémoire

47.3. Gestion de la mémoire #

SPI_palloc — alloue de la mémoire dans le contexte de mémoire courant
SPI_repalloc — ré-alloue de la mémoire dans le contexte de mémoire courant
SPI_pfree — libère de la mémoire dans le contexte de mémoire courant
SPI_copytuple — effectue une copie d'une ligne dans le contexte de mémoire courant
SPI_returntuple — prépare le renvoi d'une ligne en tant que Datum
SPI_modifytuple — crée une ligne en remplaçant les champs sélectionnés d'une ligne donnée
SPI_freetuple — libère une ligne allouée dans le contexte de mémoire courant
SPI_freetuptable — libère une série de lignes créée par SPI_execute ou une fonction semblable
SPI_freeplan — libère une requête préparée sauvegardée auparavant

PostgreSQL alloue de la mémoire dans des contextes mémoire qui donnent une méthode pratique pour gérer les allocations faites 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 faites dans votre fonction C soient réclamées lors de la sortie de la fonction C, évitant les fuites de mémoire.

En revanche, si votre fonction C 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 fonction C 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 fonction C. Plusieurs autres procédures utilitaires décrites dans cette section renvoient également des objets créés dans le contexte mémoire de l'appelant.

Quand SPI_connect est appelée, le contexte privé de la fonction C, qui est créé par SPI_connect, est nommé le contexte courant. Toute allocation faîte par palloc, repalloc ou une fonction utilitaire SPI (à part celles décrites dans cette section) sont faites dans ce contexte. Quand une fonction C se déconnecte du gestionnaire SPI (via SPI_finish), le contexte courant est restauré au contexte de mémoire courant et toutes les allocations faites dans le contexte de mémoire de la fonction C sont libérées et ne peuvent plus être utilisées.