Vala se promociona como un lenguaje parecido a C# con rendimiento cercano a C, pensado para el desarrollo en Gnome. Toma prestada la semántica async y await de C#, y muchas llamadas de E/S de la biblioteca existen en forma asíncrona, incluida 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;
    }
}

Lo que la biblioteca principal no ofrece es una versión asíncrona de create_directory_with_parents, el auxiliar recursivo de mkdir. El autor Remy Porter sospecha que la omisión es deliberada, ya que la creación recursiva de directorios implica condiciones de carrera que son resolubles pero delicadas.

Un lector llamado Eri necesitaba la función ausente y la escribió. El primer bucle intenta crear el directorio destino. Ante IOError.NOT_FOUND sube al padre, añadiendo cada objetivo fallido a un array, hasta topar con un directorio existente, tener éxito o quedarse sin padres. Un segundo bucle recorre el array hacia atrás, creando primero las rutas faltantes más cortas y tragándose IOError.EXISTS por si otro proceso llegó antes.

La implementación usa excepciones para el control de flujo, lo que hace desagradable seguir el primer bucle. Eri señala la ironía de que el mecanismo C que Vala envuelve usa simples códigos de error, más amistosos en este caso. Un bucle reescrito con las cláusulas catch reordenadas se lee algo mejor, pero sigue siendo el mismo enfoque.

Porter concede la absolución. El código tapa un hueco real en la biblioteca principal y maneja la condición de carrera correctamente. Su consejo: mételo en una caja y no vuelvas a tocar la implementación, salvo para borrarla cuando Vala publique la función de verdad.