Vala vermarktet sich als C#-ähnliche Sprache mit nahezu C-artiger Performance, gedacht für die Gnome-Entwicklung. Es übernimmt Async- und Await-Semantik aus C#, und viele I/O-Bibliotheksaufrufe existieren in asynchroner Form, darunter 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;
    }
}

Was die Kernbibliothek nicht bietet, ist eine asynchrone Version von create_directory_with_parents, dem rekursiven mkdir-Helfer. Autor Remy Porter vermutet, das Fehlen sei Absicht, da rekursive Verzeichniserstellung Race Conditions mit sich bringt, die lösbar, aber heikel sind.

Ein Leser namens Eri brauchte die fehlende Funktion und schrieb sie selbst. Die erste Schleife versucht, das Zielverzeichnis zu erstellen. Bei IOError.NOT_FOUND steigt sie zum Elternverzeichnis auf und hängt jedes gescheiterte Ziel an ein Array, bis sie auf ein existierendes Verzeichnis trifft, Erfolg hat oder keine Eltern mehr übrig sind. Eine zweite Schleife durchläuft das Array rückwärts und erstellt zuerst die kürzesten fehlenden Pfade, wobei IOError.EXISTS ignoriert wird, falls ein anderer Prozess schneller war.

Die Implementierung nutzt Exceptions zur Ablaufsteuerung, was das Nachverfolgen der ersten Schleife unangenehm macht. Eri bemerkt die Ironie, dass der von Vala gekapselte C-Mechanismus schlichte Fehlercodes nutzt, die hier freundlicher wären. Eine überarbeitete Schleife mit umsortierten Catch-Blöcken liest sich etwas besser, bleibt aber derselbe Ansatz.

Porter gewährt Absolution. Der Code schließt eine echte Lücke in der Kernbibliothek und behandelt die Race Condition korrekt. Sein Rat: in eine Kiste sperren und die Implementierung nie wieder anfassen, außer um sie zu löschen, sobald Vala das Original liefert.