Par curiosité et aussi parce que j'étais en train de développer un programme en C récemment, j'ai lu pas mal du code de Git récemment et effectivement, j'étais assez étonné de voir que Git ne s'embarrasse généralement pas de libérer la mémoire en cas d'erreur. En revanche pour la gestion des fichiers, j'ai trouvé que la gestion était assez intéressante. Par exemple, lorsque Git veut lire ou écrire l'index (.git/index):
Il verrouille le fichier en créant un autre fichier nommé .git/index.lock
(Notez que si ce fichier verrou existe déjà, il y a deux possibilités : 1/ une autre instance de git est déjà en train d'être exécutée et dans ce cas, on sort ; 2/ l'état global est corrompu, le fichier verrou existant devrait être effacé manuellement)
L'API tempfile ajoute chaque fichier verrou à une liste chainée et enregistre une fonction de callback au cas où le programme se termine (notamment avec atexit() et signal()).
Cette fonction de callback va effacer tous les fichiers verrous de la liste chainée (s'ils existent) au moment où le processus se termine
Dans le cas où le processus se termine correctement, les fichiers verrous auront tous été renommés (.git/index.lock => .git/index) donc il n'y a rien à faire. Autrement, les fichiers verrous temporaires sont effacés et l'état global est préservé.
Un autre exemple est le git clone. Si vous avez déjà remarqué, stopper un git clone en plein milieu ne laisse pas de bordel derrière lui, le répertoire créé se retrouve vide. Au moment de faire un git clone, la commande clone enregistre elle aussi une fonction de callback pour nettoyer les fichiers en cas d'erreur ou d'interruption (voir https://github.com/git/git/blob/master/builtin/clone.c#L935).
# En parlant de Git...
Posté par Joël . En réponse au journal Gestion des erreurs d’allocation mémoire en C. Évalué à 9.
Par curiosité et aussi parce que j'étais en train de développer un programme en C récemment, j'ai lu pas mal du code de Git récemment et effectivement, j'étais assez étonné de voir que Git ne s'embarrasse généralement pas de libérer la mémoire en cas d'erreur. En revanche pour la gestion des fichiers, j'ai trouvé que la gestion était assez intéressante. Par exemple, lorsque Git veut lire ou écrire l'index (
.git/index):.git/index.locklockfile(https://github.com/git/git/blob/master/lockfile.h) qui s'appuie sur l'APItempfile(https://github.com/git/git/blob/master/tempfile.h)tempfileajoute chaque fichier verrou à une liste chainée et enregistre une fonction de callback au cas où le programme se termine (notamment avecatexit()etsignal())..git/index.lock=>.git/index) donc il n'y a rien à faire. Autrement, les fichiers verrous temporaires sont effacés et l'état global est préservé.Un autre exemple est le
git clone. Si vous avez déjà remarqué, stopper un git clone en plein milieu ne laisse pas de bordel derrière lui, le répertoire créé se retrouve vide. Au moment de faire un git clone, la commande clone enregistre elle aussi une fonction de callback pour nettoyer les fichiers en cas d'erreur ou d'interruption (voir https://github.com/git/git/blob/master/builtin/clone.c#L935).