Vala se présente comme un langage proche de C# avec des performances proches du C, destiné au développement Gnome. Il emprunte la sémantique async et await de C#, et de nombreux appels d'E/S de la bibliothèque existent en version asynchrone, dont make_directory_async.

create_directory_with_parents_async.vala
async void create_directory_with_parents_async(File file, Cancellable? cancellable = null) throws Error {
    var to_create = new File[0];
    var? current_target = file;
    while(current_target != null) {
        try {
            yield current_target.make_directory_async(Priority.DEFAULT, cancellable);
        } catch(IOError.NOT_FOUND e) {
            to_create += current_target;
            current_target = current_target.get_parent();
            continue;
        } catch(IOError.EXISTS e) {
            break;
        }
        break;
    }
}

Ce que la bibliothèque cœur ne propose pas, c'est une version asynchrone de create_directory_with_parents, l'assistant mkdir récursif. L'auteur Remy Porter soupçonne que cette absence est volontaire, la création récursive de répertoires impliquant des problèmes de concurrence solubles mais délicats.

Un lecteur nommé Eri avait besoin de la fonction manquante et l'a écrite. La première boucle tente de créer le répertoire cible. Sur IOError.NOT_FOUND, elle remonte au parent en empilant chaque cible échouée dans un tableau, jusqu'à rencontrer un répertoire existant, réussir, ou épuiser les parents. Une seconde boucle parcourt ensuite le tableau à l'envers, créant d'abord les chemins manquants les plus courts et ignorant IOError.EXISTS au cas où un autre processus serait passé par là.

L'implémentation utilise les exceptions pour le contrôle de flux, ce qui rend la première boucle pénible à suivre. Eri relève l'ironie : le mécanisme C que Vala encapsule repose sur de simples codes d'erreur, plus commodes ici. Une boucle retravaillée avec des clauses catch réordonnées se lit un peu mieux, mais reste la même approche.

Porter accorde l'absolution. Le code bouche un vrai trou dans la bibliothèque cœur et gère correctement la course critique. Son conseil : enfermez-le dans une boîte et ne touchez plus jamais l'implémentation, sauf pour la supprimer quand Vala livrera la vraie fonction.