Vue normale

Reçu aujourd’hui — 18 mai 2025

Nouvelles de Haiku - 1er trimestre 2025

Il est temps de s'intéresser à nouveau aux nouveautés de Haiku pour ce dernier trimestre.

Les gros changements sont:

  • Un nouvel allocateur mémoire qui permet enfin d'allouer plus de 3GiB par application (un reste de l'historique de Haiku sur les systèmes 32 bits), tout en étant plus rapide et moins gourmand en mémoire,
  • Des raccourcis claviers sans touches modificatrices,
  • De grosses mises à jour dans la bibliothèque C,
  • La poursuite du nettoyage de code et de l'optimisation du navigateur de fichiers Tracker,
  • La reprise du travail sur le pilote NFS4 pour les systèmes de fichiers en réseau,
  • Et bien sûr, de très nombreuses corrections de bugs et petites améliorations un peu partout dans le système.

Sommaire

Google Summer of Code

Le Google Summer of Code est un programme organisé par Google pour encourager de nouveaux développeurs à se lancer dans la contribution aux logiciels libres. Il prend la forme d'un stage, où un projet de logiciel libre fournit un sujet et une équipe d'encadrement, et Google se charge de financer le nouveau contributeur pour quelques semaines.

Cette année, la candidature de Haiku a été rejetée, la préférence étant donnée à des projets engagés dans l'intelligence artificielle et dans la cybersécurité (deux domaines beaucoup demandés par les personnes souhaitant participer au programme). Ce n'est finalement peut-être pas une mauvaise chose pour Haiku: les développeurs d'autres projets se sont plaints d'avoir reçu des centaines de candidatures visiblement générées par des LLM sans aucun travail de préparation, ce qui leur demande donc beaucoup de temps pour faire le tri dans les candidatures. Les développeurs de Haiku vont cette année pouvoir se consacrer à d'autres tâches.

Applications

Tracker

Le travail de refonte du Tracker se poursuit. Les changements intégrés en début d'année ont provoqué un certain nombre de régressions qui sont corrigées petit à petit:

  • Il est à nouveau possible d'ouvrir le dossier contenant un résultat de requête en double cliquant la colonne "emplacement" dans les résultats.
  • Correction d'un crash et de problèmes de gestion de la mémoire et de problèmes de synchronisation entre threads.
  • Ré-optimisation de la gestion des menus dynamiques pour éviter de les reconstruire à chaque clic de souris, mise en cache de certaines parties du menu dont la construction nécessite des accès disque (liste de patrons pour le menu "nouveau document", liste d'add-ons)

Toujours beaucoup de nettoyage de code à faire dans le Tracker:

  • correction de dimensions en dur dans les menus spéciaux du Tracker,
  • nettoyage du glisser-déposer,
  • refactorisation de la logique de dessin,
  • amélioraiton du chargement des add-ons,

Optimisation de la méthode de surveillance des dossiers, utilisation d'un "node monitor" (équivalent de inotify sous Linux) récursif pour surveiller un dossier et tous ses sous-dossiers au lieu de créer un monitor pour chaque dossier. Cela a nécessité des changements au niveau du noyau avec l'ajout du flag B_QUERY_WATCH_ALL pour couvrir ce cas d'usage.

Par jscipione, waddlesplash

MediaPlayer

L'infobulle sur le "scrubber" (barre de navigation temporelle dans le fichier) s'affiche dès que la souris est au-dessus de la barre. Elle contient le marqueur de temps correspondant à la position de la souris, permettant de naviguer avec précision dans le fichier. Ceci a nécessité des évolutions dans BToolTip, la classe responsable des infobulles, qui n'était pas prévue pour faire des infobulles persistantes poursuivant le déplacement de la souris.

Ajout d'une option pour afficher une vidéo à 25% de sa taille originale (les contenus en 4K ou plus se faisant plus courants).

Par AkashKumar7902, x512, waddlesplash

WebPositive

WebPositive ne prétend plus savoir traiter les liens utilsant le protocole gopher. Ces liens ne fonctionnaient plus depuis le retour à l'utilisation de cURL pour la couche réseau de WebKit au lieu d'essayer de réimplémenter un client HTTP maison.

Amélioration de la gestion des sessions : sauvegarde du workspace utilisé pour chaque fenêtre, restauration de la session complète lorsque le navigateur est démarré en cliquant sur un lien, avec ouverture du lien dans une fenêtre du workspace courant s'il y en a déjà une, et dans une nouvelle fenêtre sinon.

Par nephele, ilzu

HaikuDepot

Amélioration de performances, en particulier lors de l'affichage des résultats de recherche, qui étaient très très lents sur les machines un peu anciennes.

Par apl, oco, waddlesplash

ProcessController

Affichage de "system resources" avant "caches" afin de rendre les statistiques d'utilisation mémoire plus claires et plus lisibles.

Correction de problèmes dans la mesure d'utilisation de resources par le noyau.

Par OscarL, waddlesplash

Terminal

Correction d'un bug d'initialisation de la couleur du curseur, visible principalement lorsque le terminal est utilisé comme réplicant dans une autre application. Cette possibilité est utilisée dans l'IDE Genio par exemple.

Par jackburton

StyledEdit

Interdiction d'entrer des caractères de contrôle ASCII dans un fichier texte (via les raccourcis clavier control+une lettre).

Par OscarL

Screenshot

Ajout de la possibilité de sélectionner un rectangle à capturer (en plus des possibilités existantes de capturer tout l'écran ou la fenêtre active).

Préférences

Nettoyage de code inutile dans les préférences d'affichage

Amélioration de la gestion des erreurs dans les préférences de sons si le dossier où devraient se trouver les fichiers son n'existe pas.

Par captain0xff, humdinger

Outils en ligne de commande

strace: Décodage des arguments passés à rlimit ainsi que de l'argument "type" pour mmap, affichage correct des valeurs de type ssize_t ne pouvant pas être représentées sur 32 bits.

Fusion des outils query et filteredquery. Ces deux outils permettent de rechercher des fichiers à partir de leurs attributs (xattrs) qui sont indexés par le système de fichier. Cette méthode de recherche retourne tous les résultats, le filtrage pour limiter à certains dossiers doit donc être fait par l'outil après avoir récupéré les résultats de la recherche. Cette fonction étant très utile, il n'y a pas de raison de l'implémenter comme un outil séparé.

keymap: l'option -h affiche l'aide, en conformité avec les bonnes pratiques d'interface utilisateur. L'option pour afficher un header est donc réaffectée et devient -H.

leakanalyzer (outil d'analyse des fuites mémoire): ignore la mémoire allouée en interne par le "locale kit" pour le support des locales dans la librairie C, cette mémoire ne peut pas être libérée.

listusb: correction de l'alignement vertical du statut des ports qui n'était pas en face des autres informations affichées.

waitfor (petite application permettant d'attendre différents évènements, très utile dans certains scripts) peut maintenant attendre la disponibilité d'une connexion réseau.

Par humdinger, jmairboeck, korli, OscarL, waddlesplash

Kits

Interface Kit

Les raccourcis claviers pour les menus peuvent maintenant ne pas utiliser la touche "Commande" du clavier. Cela permet de définir des raccourcis sans touches modificatrices ou avec des touches non-standard. L'utilisation de ce type de raccourcis est relativement rare, mais nécessaire dans quelques cas particuliers. Par exemple, la touche "Supprimer" peut être utilisée pour supprimer un fichier ou un élément de liste de lecture, la touche "F2" pour renommer un fichier dans le Tracker, …

Correction de la gestion des raccourcis claviers dans BPopUpMenu qui pouvaient être associés à la mauvaise fenêtre.

Amélioration du mode sombre: meilleure méthode de choix de la couleur de fond dans BTextView, utilisation d'une combinaison de couleurs cohérentes pour les boutons des barres de défilement.

Ajout de définitions et de documentation pour tous les côdes de contrôle ASCII dans InterfaceDefs.h. Certains d'entre eux n'étaient pas documentés, ce qui pouvait laisser penser qu'il restait de la place libre utilisable pour coder d'autres choses.

Ajout de vérifications dans BMenuField::SetLabel pour traiter correctement les labels NULL.

Optimisations de BScrollView et BColumnListView pour limiter les rafraîchissements inutiles de l'affichage (dans le cadre des améliorations de performances pour HaikuDepot). Dans BColumnListView, ajout d'APIs pour ajouter et supprimer un ensemble d'éléments d'un seul coup, ce qui est beaucoup plus rapide que de les traiter un par un.

Meilleure gestion du sémaphore de synchronisation des menus dans BWindow. Tous les menus dans Haiku sont implémentés comme des fenêtres, ce qui signifie que chaque menu s'exécute dans un thread dédié avec sa propre boucle d'évènements. La synchronisation peut donc être particulièrement complexe.

Correction d'un use-after-free (utilisation de mémoire libérée qui ne devrait logiquement plus être accédée) dans BSlider.

BDecimalSpinner (un contrôle pour changer une valeur numérique au clavier ou avec des boutons '+' et '-') utilise BNumberFormat et affiche donc le nombre en fonction des préférences de localisation.

Par apl, bitigchi, jscipione, korli, nipos, nephele, PulkoMandy, waddlesplash, x512

Support Kit

Modification de BObjectList pour passer l'argument "owning" en paramètre de template plutôt qu'en paramètre du constructeur. Cela améliore les résultats d'analyse statique qui détectaient de nombreux faux positifs "double free" ou "use after free", et rend également plus difficile de faire des erreurs sur la gestion de la mémoire avec ces listes.

Certaines utilisations de BObjectList<BString> ont été remplacées par la classe dédiée BStringList, plus simple à utiliser pour ce cas particulier.

Amélioration de performances dans BList, BMessage et certaines parties du code les utilisant beaucoup pour réduire la quantité d'allocations mémoire dynamiques, en utilisant la pile comme stockage temporaire ou simplement en retardant au maximum les allocations. Par exemple, plutôt que de pré-allouer de la mémoire pour une liste dès la création de cette dernière, on attend l'insertion du premier élément dans la liste. On élimine ainsi des allocations dans les cas où du code crée une liste, mais n'insère finalement jamais rien dedans.

Amélioration des erreurs remontées par les classes de traitement de fichiers JSON.

Ajout de vérifications de pointeurs NULL manquantes dans BString pour corriger des crashs quand il n'y a plus de mémoire et qu'une allocation échoue.

Par ilzu, waddlesplash

Storage Kit

Amélioration de BFilePanel pour mieux réagir lorsque le dossier de destination n'existe pas.

Inhibition de BBlockCache lors de l'utilisation d'un allocateur mémoire de debug ou avec des gardes pour détecter les mauvaises utilisations mémoire. Dans ce cas, il vaut mieux se dispenser des gains de performance de la mise en cache mais détecter correctement l'utilisation de mémoire après sa remise à disposition dans le cache.

Ajout d'un type MIME pour les BMessage serialisés sur disque (souvent utilisés pour sauvegarder les préférences d'applications par exemple).

Par augiedoggie, nephele, waddlesplash

Serveurs

input server

Amélioration du clavier virtuel pour se mettre à jour automatiquement lors des changements de résolution d'écran et de disposition du clavier. Ce clavier virtuel n'est pas inclus par défaut dans l'installation de Haiku, il est réservé aux personnes aventureuses qui utilisent Haiku sur une tablette ou qui débugguent un pilote de clavier en ne disposant que d'un écran tactile comme périphérique d'entrée.

Correction du traitement des appels systèmes interrompus (SIGINT), ce qui permet à input server de s'arrêter (et de se redémarrer) lorsqu'on le lui demande. Cela est principalement utile pour tester les pilotes de périphériques d'entrée.

screen blanker

L'écran de veille utilise le mot de passe "système" (configuré dans /etc/passwd) au lieu d'implémenter son propre système de mot de passe. La commande screen_blanker permet de lancer l'écran de veille immédiatement, et peut être configurée comme un raccourci clavier pour implémenter un verrouillage simple de la session (note: ne faites pas confiance à l'écran de veille pour sécuriser votre session, actuellement il est assez facile à contourner par exemple à l'aide du debugger noyau).

launch daemon

Améliorations sur le launch_daemon: correction du traitement des conditions échouées pour lancer un service, ajout de la possibilité de définir une condition sur le contenu d'un fichier au format "driver settings" (format similaire aux fichiers ini) en plus des fichiers BMessage (format binaire), correction de l'arrêt des services.

app server

Remise en route du test_app_server (outil de test permettant de lancer un deuxième app_server dans une fenêtre, et donc de tester des changements sur le serveur graphique sans avoir besoin de redémarrer tout le système).

Correction de bugs dans app_server pour l'affichage de texte: retrait de code dupliqué, ajout de nouveaux cas de test, meilleure gestion du clipping et des "bounding boxes" des glyphes, correction de problèmes sur les lignes de "décoration" (texte souligné, barré) utilisées en combinaison avec une transformation (rotation, déformation).

Par augiedoggie, korli, nipos, madmax

Pilotes

Le pilote i2c prend en charge les plateformes AMD en plus des machines PCH Intel. Le module i2c utilisé (conçu par Designware) est le même pour les deux fabricants à quelques petits détails près.

Amélioration de la détection du pointeur racine ACPI: ce pointeur était fourni par le bootloader sur les machines EFI, mais détecté par l'OS après démarrage sur les machines BIOS. C'est désormais la seule responsabilité du bootloader dans les deux cas, ce qui simplifie le code.

Correction d'un crash sur certaines machines dans le pilote des batteries ACPI.

Ajout de vérifications supplémentaires et corrections du traitement de quelques cas particuliers dans la pile XHCI (USB3).

La gestion des "révisions" des périphériques virtio a été mise en conformité avec la spécification virtio. Pour les anciennes versions de virtio, ce champ de la configuration PCI indiquait la version du protocole virtio à utiliser. Mais cela implique qu'un seul pilote virtio (identifiant les périphériques par leur ID PCI uniquement) doit implémenter toutes les versions de virtio. Pour les nouvelles spécifications, ce sera donc le "device ID" qui va changer, et il sera beaucoup plus simple de développer des pilotes spécifiques "virtio v1", "virtio v2", etc pour chaque version majeure.

Mise à jour des pilotes wifi iaxwifi200 (nommé iwx chez BSD) et ethernet atheros813x pour supporter de nouvelles générations de matériel. Import du nouveau pilote FreeBSD pour les cartes MT7601U, mais il n'y a pas encore de confirmation de son bon fonctionnement sous Haiku.

Nettoyage de code dans les pilotes SCSI et ralinkwifi.

Dans le pilote NVMe, activation de l'option de mise en veille automatique qui permet de réduire la consommation électrique lorsque le disque n'est pas sollicité (réduction de 1W constatée sur certaines machines).

Correction de problèmes dans les pilotes d'entrée (clavier, souris) qui empêchent de redémarrer l'input_server et de retrouver l'usage de ces périphériques.

Ajout de la tablette graphique Cintiq13HD dans le pilote Wacom.

Correction du pilote framebuffer pour ne mapper en mémoire que la zone utilisée pour le framebuffer, et pas toute la mémoire de la carte graphique. Non seulement cela réduit la consommation mémoire reportée, mais surtout, le reste de la mémoire peut ainsi être configuré pour autre chose (par exemple, de l'accélération 3D).

Ajout des cartes Polaris 10 et correction de quelques erreurs de versions du chipset pour d'autres cartes dans le pilote Radeon HD. Ces cartes récentes sont toujours désactivées dans le pilote, le support reste expérimental et peut conduire à un écran noir. Il vaut mieux donc utiliser les pilotes VESA ou framebuffer pour l'instant.

Par ilzu, korli, Lt-Henry, waddlesplash

Systèmes de fichiers

Poursuite d'investigations pour améliorer le temps d'exécution de "git status" qui est anormalement lent par rapport à la même opération sous Linux. Amélioration de l'itération sur les arbres B+ dans BFS, qui faisaient plusieurs "get" et "put" du même bloc disque successif (les opérations "get" et "put" permettent d'obtenir l'accès exclusif à un bloc disque, puis de le libérer, le cache de blocs se chargeant de lire les blocs depuis le disque, puis de les réécrire lorsque c'est nécessaire).

Amélioration également des verrous de parallélisme dans BFS, ce qui devrait corriger quelques kernel panic.

Correction d'un blocage de ramfs lors de l'utilisation de "trim" pour libérer de la mémoire.

Ajout d'un contrôle du flag O_DIRECTORY dans plusieurs systèmes de fichiers lors de l'ouverture d'un fichier. En particulier cela permet d'écrire une image disque sur un disque à l'aide de la commande cp fichier.image /dev/disk/.../raw.

Plusieurs corrections sur le pilote NFS4 qui était délaissé depuis quelque temps: gestion des inodes "périmés" (fichier présent dans un cache local, mais supprimé par une autre machine sur le serveur), et correction d'autres problèmes rendant le pilote instable. Ajout également de divers outils de debug pour investiguer l'état du pilote.

Le serveur userlandfs peut être lancé plusieurs fois (B_MULTIPLE_LAUNCH), ce qui permet d'utiliser plusieurs systèmes de fichiers FUSE ou userlandfs en même temps.

Par augiedoggie, Jim906, waddlesplash, x512

libroot

Bibliothèque C standard

dlsym(RTLD_NEXT) et d'autres fonctions similaires du runtime_loader recherchent maintenant les symboles dans toutes les régions ELF chargées, et pas seulement dans la première.

Ajout de RTLD_NOLOAD dans la fonction dlopen, ce qui permet d'accéder à des symboles déjà présents dans l'exécutable sans charger un fichier de librairie à nouveau. Il ne s'agit pas d'une fonction standard C ou POSIX, mais d'une extension proposée par GNU et la glibc.

Ajout de la fonction getloadavg qui permet d'obtenir une mesure de la charge du système. Cela peut être simplement informatif (dans des outils comme htop) ou utilisé pour allouer au mieux les ressources CPU (l'outil de build ninja peut par exemple utiliser cette valeur pour décider combien de jobs lancer en parallèle)

Mise en conformité de l'ordre d'appel des destructeurs de pthread_key (il faut potentiellement appeler les destructeurs plusieurs fois, jusqu'à PTHREAD_DESTRUCTOR_ITERATIONS, pour contourner les problèmes d'interdépendances). Correction de l'ordre d'appel des destructeurs lors de l'arrêt d'une application: les destructeurs globaux C++ doivent être appelés avant les destructeurs de threads (il existe plusieurs méthodes pour enregistrer des fonctions à exécuter à l'arrêt d'un thread ou d'un programme, et c'est assez compliqué de toutes les séquencer correctement).

Une petite optimisation de pthread_cond_signal pour éviter un appel système dans certains cas.

Poursuite du remplacement de fonctions de la libroot par les versions provenant de musl: memmove, strlen, strlcat, ainsi que toutes les fonctions de conversions entre chaînes de caractères et nombres flottants.

Synchronisation de l'implémentation de glob avec FreeBSD.

Optimisation de la famille de fonctions memcmp, strcmp, strncmp: utilisation de comparaisons sur 64 bits lorsque c'est pertinent, retrait de calculs inutiles.

Réécriture et optimisation des fonctions génériques memcpy et memset (utilisées pour les machines qui n'ont pas une version optimisée manuellement en assembleur). Utilisation de la version optimisée de NetBSD pour les machines x86 32 bits. Pour la version 64 bits, le code utilisé par Haiku est meilleur que celui des autres systèmes, et reste donc en place. Le bootloader utilise uniquement la version générique pour simplifier les choses (il n'a pas besoin de fonctions de très haute performance).

Correction de la fonction write() avec une taille supèrieure à 2Gio sur les systèmes 64 bits (la taille était accidentellement tronquée à 32 bits).

Mise en conformité POSIX de la fonction dup3: retour de EINVAL si l'ancien et le nouveau descripteur de fichier sont identiques.

Déplacement de la fonction qsort_r de la libgnu vers la libroot (elle a été standardisée dans POSIX Issue 8). Il s'agit d'une version de qsort permettant de passer un paramètre supplémentaire à la fonction de comparaison contenant un contexte réservé à l'utilisateur de la fonction.

Nettoyage du code restant dans la libroot qui provient de la glibc: retrait de déclarations internes présentes dans les en-têtes publics, retrait de fonctions qui ont déjà été remplacées, suppression de fichiers non utilisés, remplacement d'un maximum de fonctions par les versions de musl ou de BSD, ajout des fonctions stdio_ext de musl en remplacement des fonctions privées supprimées, retrait d'une partie des fonctions mathématiques au profit de celles de musl, retrait d'une couche d'abstraction pour l'interfaçage entre la glibc et le support des locales dans Haiku. Certaines parties de la glibc continuent d'être utilisées pour assurer la compatibilité avec BeOS, mais l'objectif est de minimiser cette partie et d'utiliser les fonctions de BSD ou de musl, qui sont souvent beaucoup plus simples. La raison est que la glibc est conçue pour pouvoir être utilisée comme librairie C alternative sur de nombreux systèmes, et doit donc avoir un comportement très proche de la librairie C originale. Par exemple, le format des nombres "long double" peut être différent d'une architecture et d'un système à l'autre, et la glibc implémente de nombreux formats spécifiques, là où musl se contente des formats les plus classiques.

Mise à jour de getopt, printf et scanf avec la verson de la glibc 2.41. Pour l'instant ces fonctions continuent d'utiliser la version de la glibc, afin de préserver la compatibilité avec les applications existantes (notamment les applications pour BeOS). En effet, des structures internes sont exposées dans l'ABI et ne peuvent pas être facilement remplacées par une autre implémentation.

Tous ces changements sur la librairie C standard sont faits également en collaboration avec un développeur de la gnulib, dont la suite de tests permet de repérer de nombreux comportements incorrects ou non standards.

Gestion de la mémoire

Finalisation d'un gros chantier de refonte de la gestion de la mémoire, avec en particulier la possibilité de fusionner des zones de mémoire adjacentes lorsqu'elles sont redimensionnées. Suite à ces changements, l'allocateur mémoire hoard2 a pu être remplacé par une nouvelle implémentation basée sur celle de OpenBSD, avec quelques adaptations et améliorations spécifiques à Haiku, dont en particulier un cache d'allocation global pour chaque application. Le nouvel allocateur est légèrement plus rapide en général, et plusieurs ordres de grandeur plus rapide sur certains cas particuliers (par exemple: gcc avec les options de link-time-optimization, ou le compilateur SDCC, ou un test de compilation passe de plusieurs heures à une ou deux minutes). Ce nouvel allocateur est également moins consommateur de mémoire et permet aux applications d'allouer plus de mémoire (hoard2 limitait les allocations à environ 3Go y compris sur les systèms 64 bits).

Amélioration des messsages d'erreur de la "guarded heap" (allocateur mémoire de débug) pour afficher des messages d'erreurs plus spécifiques au lieu de "generic segfault".

Autres changements

Ajout de macros manquantes dans le fichier elf.h ainsi que de la constante MAP_FILE (inutile mais présente sur Linux et tous les systèmes BSD) pour faciliter le portage de WebKit.

Interdiction de l'appel de create_sem avec un compteur négatif. Cela était interdit par BeOS mais autorisé par Haiku et il n'y a pas vraiment de raison de le faire.

Modification du code assembleur d'appel des appels systèmes pour inclure des informations de debug sur la pile d'appels. D'autre part, dladdr a été modifié pour pouvoir accéder aux informations sur ces symboles, qui sont chargés dans la commpage (une zone de mémoire partagée entre le noyau et les processus utilisateurs, qui n'est pas à proprement parler une section de code classique en mémoire). Cela permet à libunwind d'analyser une stacktrace comprenant un appel système.

Par korli, PulkoMandy, trungnt2910, waddlesplash, zeldakatze

Noyau

Désactivation des états de veille C5 et C6 sur les machines Intel "Skylake", car elles empêchent ces machines de démarrer correctement pour l'instant.

Réparation du cache d'objets "guarded heap" qui permet de détecter et d'investiguer certains problèmes d'allocation mémoire dans le noyau.

Traitement d'un cas d'erreur dans le cache de fichiers, si la taille d'un fichier est devenue plus petite que son cache entre le moment ou une application demande un accès et le moment où l'accès va effectivement être réalisé.

Protection de l'accès à certains "spinlock" par des mutex. L'accès aux spinlocks doit être rapide, puisque l'attente est faite de façon active et monopolise un coeur de CPU. Il faut donc s'assurer que le spinlock pourra être rapidement disponible. En particulier, l'affichage de logs à l'écran lors du démarrage pouvait considérablement ralentir les choses (l'affichage se fait page à page et le processus de démarrage est mis en pause en attendant que l'utilisateur appuie sur une touche).

Déplacement de la calibration du timer APIc x86 dans le noyau au lieu du bootloader. Amélioration de la précision de la mesure et utilisation de la calibration fournie via les registres CPUID si elle est disponible (c'est le cas pour certains hyperviseurs par exemple, sur lesquels le système virtualisé peut difficilement faire lui-même une mesure fiable).

Correction du traitement d'un cas particulier par mprotect, qui se manifestait par un kernel panic lors de l'utilisation du navigateur Iceweasel.

Ajout d'un timeout sur l'envoi d'infos sur le port série sur les machines x86. Par exemple sur le Steam Deck, le port série n'est pas du tout présent et cela empêchait le démarrage du système.

Réécriture de la fonction x86_{read|write}_msr pour les machines 32 bit en tant que fonction inline (c'était déjà le cas pour les machines 64 bits).

Correction de problèmes trouvés en essayant de démarrer Haiku sur un laptop très récent: ajout du support de X2APIC dans le bootloader EFI, allocation de la page "PML4" avec une adresse physique < 4Go pouvant être codée sur 32 bits, et à l'inverse traitement correct de la table GDT lorsqu'elle se trouve au-delà de cette limite de 4Go.

Déplacement de code de bfs vers le VMCache générique pour traiter le cas particulier du mmap sur un fichier dont la taille n'est pas un multiple de la taille de pages du système. La dernière page doit alors être remplie avec des 0. Cela avait été corrigé pour bfs, mais le problème était également présent pour d'autres systèmes de fichiers dont en particulier ramfs.

Réécriture des FIFOs noyaux (utilisés pour implémenter pipe(2)). Le benchmark stress-ng --pipe 1 passe de 230 Mo/s à 2.5Go/s (dans une machine virtuelle).

Ajout d'une option syslog_max_history pour pouvoir conserver plus que 2 fichiers de syslog (ce qui reste l'option par défaut).

Nettoyage et optimisation de la structure Thread utilisée dans le noyau pour représenter les threads: utilisation d'une liste doublement chaînée pour accélérer les manipulations de la liste, correction du décomptage du temps CPU utilisé par les processus, correction d'une fuite mémoire, et correction d'un problème dans la fonction get_next_thread_info si les identifiants de threads bouclent (c'est-à dire que plus de 4 milliards de threads ont été créés et que des identifiants de threads ont donc dû être recyclés).

Le kernel panic se produisant si un thread tente de libérer un mutex qui ne lui appartient pas affiche automatiquement la stacktrace du thread qui est propriétaire du mutex.

Ajout d'un appel à cpu_pause dans le code des conditions variables pour réduire la consommation électrique inutile lors d'une attente active.

Correction de plusieurs problèmes de sauvegarde du contexte de la FPU pour l'architecture x86_64:

  • Remise à 0 de l'état de la FPU lors des changements de threads,
  • Stockage de l'état de la FPU dans la structure d'info sur le thread au lieu de la stocker sur la pile,
  • Envoi des bons codes d'exception FPE_* lors des exceptions SIGFPE,
  • Gestion des "control words" lors des changements de contexte.

Cela corrige des crashs d'application et même des kernel panic dans certains cas.

Les drapeaux de protection des zones de mémoire du noyau ne sont plus visibles par les utilisateurs non privilégiés. L'utilisateur "user" principal peut toujours y accéder, cela est utilisé par exemple par ProcessController. Correction d'un flag mal positionné pour les zones mémoire de l'allocateur "slab", qui n'étaient pas indiquées comme accessibles en écriture.

Renommage des fonctions concernant la gestion des interruptions pour éviter l'abbréviation "int" qui pouvait prêter à confusion avec "integer" dans certains cas. Utilisation du mot complet "interrupt" lorsque c'est possible, ou à défaut de "intr".

Correction d'une fuite de mémoire dans la gestion de la mémoire physique avec du paging à 5 niveaux (LA57).

Correction d'un interblocage dans le cache du système de fichier identifié à l'aide des tests de gVisor.

Correction d'un bug dans la fonction vsnprintf du noyau qui n'affichait pas correctement les nombres inférieurs à 0.1 (les 0 après le point étaient perdus, et donc 0.01, 0.001. 0.0001, … étaient tous affichés comme 0.1).

L'appel système create_dir retourne EEXIST si un fichier ou un dossier existe déjà à l'endroit demandé, et ce, même si le système de fichier est en lecture seule. Auparavant, l'appel système retournait EROFS, ce qui perturbe certaines applications.

Amélioration du traitement des "doubles fautes" (lorsque le traitement d'une exception matérielle déclenche une autre exception matérielle) sur x86. Le registre GS était corrompu, ce qui empêchait l'utilisation du debugger dans ce cas, et plusieurs autres problèmes conduisaient vraissemblablement à une "triple faute" (une exception dans le traitement de l'exception dans le traitement de… bon vous voyez le principe), et à un redémarrage de la machine car à ce stade il est peu probable qu'aucune autre opération ne remette le système dans un état cohérent.

Bootloader

Amélioration du bootloader PXE pour afficher clairement "Network" dans la méthode de démarrage, ainsi que l'adresse IP du serveur de disque fournissant le rootfs.

Remise en route du développement sur la console graphique utilisée pour simuler un mode texte pour le menu de démarrage, lorsque la machine ne fournit pas un mode texte matériel ou au niveau de son BIOS (c'est le cas par exemple sur certains Chromebooks avec SeaBIOS). Pour l'instant, cela nécessite une version du bootloader compilée spécifiquement pour ce cas de figure, car on ne sait pas encore détecter de façon fiable si le mode texte du BIOS est disponible.

Par Anarchos, augiedoggie, korli, phcoder, waddleslplash

Scripts de compilation

Poursuite du travail pour corriger tous les warnings détectés par le compilateur, ainsi que quelques problèmes détectés par les sanitizers de gcc (libasan et libubsan) qui sont maintenant compatibles avec Haiku.

Correction de problèmes empêchant de cross-compiler Haiku depuis FreeBSD ou un système Linux utilisant la libc musl. Correction également de problèmes pour le build depuis macOS.

Suppression de fichiers inutiles dans la version de unzip intégrée dans le build de Haiku.

Généralisation des options permettant d'activer la "stack protection" à plus de parties du système.

Remplacement de la commande which par command -v. Cette dernière est un builtin de la plupart des shells, elle est donc plus rapide à exécuter et ne nécessite pas une dépendance supplémentaire.

Migration de Python 2 à Python 3 pour le script générant les fichiers "libroot stubs" (utilisé uniquement lors du bootstrapping de Haiku pour une nouvelle architecture).

Mise à jour de la version de m4 utilisée pour le bootstrap de Haiku (compilation de tous les paquets à partir des sources, utile en particulier pour le portage sur une nouvelle architecture).

Ajout des modules PCI manquants dans l'image de bootstrap.

Par korli, PulkoMandy, waddlesplash

Documentation

Ce trimestre, il y a principalement du travail sur la documentation interne. Il s'agit d'un document destiné aux développeurs de Haiku, par opposition aux développeurs d'applications pour Haiku, qui se tourneront plutôt vers le Haiku book pour les informations sur les interfaces publiques du système.

Mise à jour de la documentation sur la procédure à suivre pour synchroniser du code avec d'autres systèmes. Haiku réutilise du code de FreeBSD, NetBSD, OpenBSD, musl et quelques autres, et maintient également deux copies de gcc et des binutils. Il est important d'avoir une procédure bien définie pour tracer ce qui a été importé, depuis quelle version, et quels changements ont été effectués. Plusieurs documentations existaient avec différentes fçons de faire, dont certaines étaient obsolètes.

Dans la documentation du device manager, ajout d'une image montrant un exemple de device tree, pour mieux visualiser ce qui est expliqué dans la page.

Déplacement d'articles sur l'implémentation des appels systèmes du site web principal vers la documentation interne (dans le cadre d'un très long projet pour réorganiser la documentation et libérer le site principal de nombreux articles techniques pour en faire une vitrine plus orientée vers les utilisateurs).

Ajout dans la documentation interne d'un article sur le profilage et l'analyse de performance des applications.

Correction de liens internes morts dans la documentation interne sur la gestion des paquets, suite à des erreurs de formatage.

Mise à jour de la documentation interne sur le processus de bootstrap.

Par kuku929, oco, PulkoMandy, waddlesplash

Commentaires : voir le flux Atom ouvrir dans le navigateur

Reçu avant avant-hier

Information couleur du jour pour contrats électricité Tempo

9 avril 2025 à 17:44

Suite à une question posée en 2023, cette dépêche propose un état des lieux des sources librement accessibles (sans imposer un jeton pour accéder aux API pour obtenir de manière structurée l’information) permettant de suivre les jours en tensions pris en compte dans l’option tarifaire TEMPO chez EDF. Cette option tarifaire consiste à payer moins cher l’électricité à condition de la payer 3 fois plus cher 22 jours dans l’année : les jours en tensions, généralement durant l’hiver.

Cette option permet de lisser la charge sur le réseau de transport de l’électricité. Pour faire bon usage de cette option, il faut surveiller la couleur du jour pour déterminer s’il vaut mieux réduire le chauffage électrique et les autres sources de consommations électriques. L’information est affichée le jour même sur le compteur électrique, mais il peut être utile d’être prévenu. On peut consulter le site de EDF, mais il peut être plus intéressant de disposer d’une API pour récupérer cette information, et ainsi pouvoir l’intégrer dans un système domotique, par exemple.

    Sommaire

    Les anciennes APIs ne fonctionnent plus

    En effet, les forums domotiques attestent que c’était pourtant très utilisé, depuis le 29/08/2024 (avant-veille du changement de saison Tempo) les URL concernées (resp. couleur du jour+lendemain et compteurs saison en cours) répondent en erreur:

    Couleurs jour/lendemain
    Totaux en cours

    À la recherche d’une solution de remplacement

    On voit une autre URL apparaître ces derniers jours sur les forums, mais elle ne donne pas spécifiquement les couleurs jour/lendemain mais des compteurs: nombre de jours bleus, rouges et blancs depuis le début de l’année. Il faudrait donc déduire la couleur du jour en fonction de ce qui change d’un jour à l’autre! On a vu plus simple, mais comme ça marche pas on ne risque pas de l’utiliser:
    URL nouvelle

    {
        “errors”: [],
        “content”: [
            {
                “typeJourEff”: « TEMPO_BLANC »,
                “libelle”: « TEMPO BLANC 2024 2025 »,
                “nombreJours”: 43,
                “premierJour”: « 2024-09-01 »,
                “dernierJour”: « 2025-08-31 »,
                “premierJourExclu”: null,
                “dernierJourExclu”: null,
                “nombreJoursTires”: 0,
                “etat”: “OUVERTE”
            },
            {
                “typeJourEff”: « TEMPO_BLEU »,
                “libelle”: « TEMPO BLEU 2024 2025 »,
                “nombreJours”: 300,
                “premierJour”: « 2024-09-01 »,
                “dernierJour”: « 2025-08-31 »,
                “premierJourExclu”: null,
                “dernierJourExclu”: null,
                “nombreJoursTires”: 12,
                “etat”: “OUVERTE”
            },
            {
                “typeJourEff”: « TEMPO_ROUGE »,
                “libelle”: « TEMPO ROUGE 2024 2025 »,
                “nombreJours”: 22,
                “premierJour”: « 2024-11-01 »,
                “dernierJour”: « 2025-03-31 »,
                “premierJourExclu”: null,
                “dernierJourExclu”: null,
                “nombreJoursTires”: 0,
                “etat”: « NON_COMMENCEE »
            }
        ]
    }

    Le site d’EDF utilise une API interne indiquant la couleur, jour par jour, pour une plage de dates donnée. Il faut remplir quelques en-têtes HTTP pour que la requête soit acceptée :

    curl \
        'https://api-commerce.edf.fr/commerce/activet/v1/calendrier-jours-effacement?option=TEMPO&dateApplicationBorneInf=2023-9-12&dateApplicationBorneSup=2023-9-15&identifiantConsommateur=src' \
        -H 'accept: application/json, text/plain, */*' \
        -H 'cache-control: no-cache' \
        -H 'content-type: application/json'

    Exemple de réponse:

    {
        “errors”: [],
        “content”: {
            “dateApplicationBorneInf”: « 2023-09-12 »,
            “dateApplicationBorneSup”: « 2023-09-16 »,
            “dateHeureTraitementActivET”: « 2024-09-11T11:19:26Z »,
            “options”: [
                {
                    “option”: “TEMPO”,
                    “calendrier”: [
                        {
                            “dateApplication”: « 2023-09-12 »,
                            “statut”: « TEMPO_BLEU »
                        },
                        {
                            “dateApplication”: « 2023-09-13 »,
                            “statut”: « TEMPO_BLEU »
                        },
                        {
                            “dateApplication”: « 2023-09-14 »,
                            “statut”: « TEMPO_BLEU »
                        },
                        {
                            “dateApplication”: « 2023-09-15 »,
                            “statut”: « TEMPO_BLEU »
                        }
                    ]
                }
            ]
        }
    }

    Ces APIs semblent répondre en erreur « La syntaxe de la requête est erronée » aléatoirement lorsqu’on y accède avec curl. Une requête peut fonctionner une fois puis subitement cesser de répondre. S’agit-il d’une limitation du nombre de requêtes venant de la même IP? D’une authentification à effectuer pour avoir le droit de faire des requêtes? Ou juste d’un système complètement buggé qui plante une fois sur 10?

    Pour ceux, que j’imagine nombreux, a qui cela va poser problème et qui ne veulent (ou peuvent) obtenir l’info via un module téléinfo à monter sur son compteur, il y a une URL dont je n’ai pas trouvé référence sur le site de RTE (qui ne propose que des API à jetons) qui se trouve en regardant le github source d’un site tiers donnant également l’info:
    Source tierce

    L’info délivrée par le compteur arrive en prime bien plus tardivement: En début de soirée au lieu de fin de matinée. C’est parce qu’elle transite par Enedis, une autre entreprise qui se charge de la distribution de l’électricité (les lignes à basse tension et les compteurs électriques).

    On peut donc utiliser cette indirection ou regarder les sources afin de trouver l’URL en question, pour laquelle on a une info hélas bien plus verbeuse où il faut faire son marché : on récupère un JSON de tous les jours écoulés depuis le début de la saison en cours, et il faut :

    — extraire l’info aux bonnes dates,
    — refaire ses compteurs de jours bleu/blanc/rouge pour savoir s’il reste des jours rouges ou blancs prévus avant la fin de l’hiver,
    — traiter le flag “fallback” qui, selon la documentation, indique un mode dégradé, mais ce flag ne semble jamais être mis à “true” dans l’historique des données disponibles, et son rôle exact n’est pas clair.

    Conclusion

    Il est au final navrant qu’EDF remplace un truc simple qui marchait très bien par un machin alambiqué qui tombe en marche une fois sur 10…

    Je ne donne pas l’URL librement accessible, mais non documentée, de RTE car je n’aimerais pas qu’elle croule sous les demandes: Ceux qui sont capables de l’utiliser de manière raisonnée sans exploser des quotas sauront bien la trouver avec les infos données!

    (RTE, Réseau de Transport de l’Électricité est l’entreprise qui s’occupe du réseau électrique à haute tension en France. Ce sont eux qui déterminent les jours où le réseau va être très chargé, et c’est ça qui détermine le prix de l’électricité).

    Un avantage à l’utiliser, c’est que l’info est disponible encore plus tôt qu’elle ne l’était chez EDF (c’était généralement MAJ peu après 11h00), permettant d’anticiper encore un peu plus un jour rouge, sachant qu’ils sont souvent en série, si on a quelques lessives à lancer…

    S’il y a des suggestions d’alternatives (sans jetons d’API) non citées, merci de les indiquer en commentaires.

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    Nouvelles de Haiku - Hiver 2024-25

    Haiku est un système d’exploitation pour les ordinateurs personnels. Il s’agit à l’origine d’une réécriture de BeOS. Le projet a démarré en 2001 et est actuellement en phase de beta-test pour une première version stable avec support à long terme. Depuis 2024, l’activité du projet Haiku s’accélère grâce entre autres à l’embauche d’un développeur à plein temps. Les dépêches sur Haiku sont donc désormais publiées tous les 3 mois au lieu de tous les ans pour leur conserver une longueur digeste.

    La complète liste des changements survenus pendant ces 3 mois comporte près de 300 commits. La dépêche ne rentre pas dans les détails de chaque changement et met en valeur les plus importants.

    Les grosses évolutions sont un nouveau port de Iceweasel (Firefox), et des grosses améliorations sur la gestion de la mémoire.

    Comme on est en début d’année, c’est aussi le moment du bilan financier.

    Sommaire

    Rapport financier 2024

    Recettes

    L’association Haiku inc (association de type 501(c)3 aux USA) publie chaque année un rapport financier. Le rôle de l’association est de récolter les dons et de les redistribuer pour aider au développement de Haiku. Elle ne prend pas part aux décisions techniques sur l’orientation du projet, et habituellement les dépenses sont faites en réponse aux demandes des développeurs du projet.

    L’objectif en début d’année 2024 était de récolter 20 000$ de dons. Cet objectif a été largement atteint, il a dû être mis à jour 2 fois en cours d’année et finalement ce sont plus de 31 000$ qui ont été reçus ! Cela en particulier grace à un assez gros don de 7 500$.

    Les dons sont récoltés via différentes plateformes: Github Sponsors (intéressant, car il n’y a aucun frais de traitement), PayPal, Liberapay, Benevity (une plateforme de « corporate matching »), ainsi que des paiements par chèque, virements bancaires, et en espèce lors de la tenue de stands dans des conférences de logiciels libres. La vente de T-Shirts et autre merchandising via la boutique Freewear reste anecdotique (une centaine de dollars cette année).

    Il faut ajouter à ces dons une contribution de 4 400$ de la part de Google en compensation du temps passé à l’encadrement des participants au Google Summer of Code.

    Il faut également ajouter des dons en crypto-monnaies, principalement en bitcoins. Le rapport financier présente les chiffres en détail en tenant une compatibilité séparée en dollars, en euros, et en crypto-monnaies, avant de convertir le total en dollars pour dresser un bilan complet.

    Une mauvaise nouvelle tout de même: le service de microdons Flattr a fermé ses portes. L’entreprise propose maintenant un service de bloqueur de publicités payant, qui reverse de l’argent aux sites dont les publicités sont bloquées.

    Le compte Flattr de Haiku avait été créé pour recevoir des dons sur la plateforme, mais n’avait jamais été configuré pour transférer ces dons vers le compte en banque de l’association. Malgré un certain temps passé à discuter avec le service client de Flattr et à leur fournir tous les documents demandés, il n’a pas été possible de trouver une solution pour récupérer cet argent. Ce sont donc 800$ qui ne reviendront finalement pas au projet Haiku.

    Au final, les recettes sont de 36 479 dollars, de loin la plus grosse somme reçue par le projet en un an.

    Dépenses

    La dépense principale est le paiement de Waddlesplash, le développeur actuellement employé par Haiku inc pour accélérer le développement du système (les autres développeurs participent uniquement sur leur temps libre, en fonction de leurs autres activités). Cela représente 25 500$, un coût assez faible par rapport au travail réalisé.

    Le deuxième poste de dépenses est l’infrastructure, c’est-à dire le paiement pour l’hébergement de serveurs, les noms de domaines, et quelques services « cloud » en particulier pour le stockage des dépôts de paquets.

    Le reste des dépenses consiste en frais divers (commission PayPal par exemple), remboursement de déplacements pour la participation à des conférences, ainsi que le renouvellement de la marque déposée sur le logo Haiku.

    Le total des dépenses s’élève à 31 467$. C’est moins que les recettes, et l’association continue donc de mettre de l’argent de côté. L’année 2022 a été la seule à être déficitaire, suite au démarrage du contrat de Waddlesplash. Ce contrat est à présent couvert par les donations reçues.

    Réserves

    L’association dispose de plus de 100 000$ répartis sur son compte en banque, un compte PayPal (qui permet de conserver des fonds en euros pour les paiements en euros et ainsi d’éviter des frais de change), et un compte Payoneer (utilisé pour recevoir les paiements de Google).

    Elle dispose également de près de 350 000$ en crypto-monnaies dont la valeur continue d’augmenter. Cependant, actuellement ces fonds ne sont pas accessibles directement, en raison de problèmes administratifs avec Coinbase, l’entreprise qui gère ce portefeuille de crypto-monnaies. Le compte n’est pas configuré correctement comme appartenant à une association à but non lucratif et cela pose des problèmes de déclaration de taxes lorsque on souhaite vendre des crypto-monnaies contre du vrai argent. Cette situation persiste depuis plusieurs années, mais l’association n’a pour l’instant pas besoin de récupérer cet argent, les réserves dans le compte en banque principal étant suffisantes.

    Applications

    Iceweasel

    Le navigateur web Iceweasel est disponible dans les dépôts de paquets (seulement pour la version 64 bits pour l’instant). Il s’agit d’un portage de Firefox utilisant la couche de compatibilité Wayland. Le nom Firefox ne peut pas être utilisé puisqu’il ne s’agit pas d’un produit officiel de Mozilla.

    En plus du travail de portage pour réussir à faire fonctionner le navigateur, cela a nécessité un gros travail d’amélioration au niveau de la gestion de la mémoire, une partie du système qui est fortement mise à contribution par ce navigateur. On en reparle plus loin dans la dépêche.

    Le navigateur est encore considéré comme expérimental: plusieurs fonctions sont manquantes et il peut y avoir des plantages. WebPositive (le navigateur natif basé sur WebKit) reste donc le navigateur installé par défaut avec Haiku, mais les deux sont complémentaires. Par exemple, Iceweasel permet d’afficher les vidéos Youtube avec des performances acceptables.

    Tracker

    Tracker est le gestionnaire de fichiers de Haiku. Il implémente une interface « spatiale », c’est-à-dire que chaque dossier s’ouvre dans une fenêtre séparée et enregistre sa position à l’écran.

    Le code du Tracker fait partie des composants qui ont pu être récupérés de BeOS. Cela signifie que certaines parties du code ont été développées il y a près de 30 ans, dans un contexte où l’élégance du code n’était pas la priorité (il fallait pour les développeurs de BeOS, d’une part livrer un système fonctionnel dans un temps raisonable, et d’autre part, fonctionner sur les machines relativement peu performantes de l’époque).

    Les évolutions sur le Tracker nécessitent donc souvent du nettoyage dans de nombreuses parties du code, et provoquent souvent des régressions sur d’autres fonctionnalités. Toutefois, les choses s’améliorent petit à petit.

    Ce trimestre, on a vu par exemple arriver la correction d’un problème avec l’utilisation de la touche « echap ». Cette touche peut servir à plusieurs choses:

    • Fermer une fenêtre de chargement ou d’enregistrement de fichier,
    • Annuler le renommage d’un fichier,
    • Annuler une recherche rapide « type ahead » qui consiste à taper quelques lettres et voir immédiatement la liste de fichiers du dossier courant se réduire à ceux qui contiennent cette chaîne de caractères.

    Ces différentes utilisations peuvent entrer en conflit. Plus précisément, lorsqu’on utilise le filtrage « type ahead », puis qu’on change d’avis et qu’on appuie sur la touche « echap », il ne faut pas que cela ferme la fenêtre en même temps.

    Un autre changement concerne plutôt la validation des données: Tracker interdit l’insertion de caractères de contrôle ASCII dans le nom de fichiers. Ce n’est pas strictement interdit (ni par Haiku, ni par ses systèmes de fichiers, ni par POSIX) en dehors de deux caractères spéciaux: le '/' et le 0 qui termine une chaîne de caractères. Mais, c’est très probablement une mauvaise idée d’avoir un retour à la ligne ou un autre caractère de contrôle enregistré dans un nom de fichier. Le Tracker interdit donc désormais de le faire et si vous êtes vraiment résolu à y parvenir, il faudra passer par le terminal.

    Enfin, une nouvelle fonctionnalité dans le Tracker est la mise à jour en temps réel des menus pop-up. Cela peut se produire pour plusieurs raisons, par exemple, l’appui sur la touche « command » modifie le comportement de certains menus. Avant ce changement, il fallait ré-ouvrir le menu (command + clic droit) pour voir ces options modifiées. Maintenant, on peut d’abord ouvrir le menu, puis maintenir la touche command enfoncée pour voir les options modifiées.

    Cela a nécessité une refonte complète de la gestion de ces menus (qui proposent de nombreuses autres choses comme la navigation « rayons X »). Au passage, certaines options qui étaient uniquement disponibles au travers de raccourcis claviers ou de la barre de menu des fenêtres du Tracker sont maintenant aussi affichées dans le menu pop-up.

    TeamMonitor

    TeamMonitor est le gestionnaire d’applications affiché quand on utilise la combinaison de touches Ctrl+Alt+Suppr. Il permet de stopper des programmes, de redémarrer la machine, et autres manipulations d’urgence si le système ne fonctionne pas comme il faut.

    Les processus lancés par une même application sont maintenant regroupés et peuvent être tous arrêtés d’un seul coup. Ce changement est nécessaire suite à l’apparition de IceWeasel, qui crée beaucoup de processus en tâche de fond pour une seule instance du navigateur web.

    HaikuDepot

    HaikuDepot est l’interface graphique pour le système de paquets de Haiku. Il se présente comme un magasin d’applications, permettant non seulement d’installer et de désinstaller des logiciels, mais aussi de les évaluer avec une note et un commentaire.

    • Ajout d’un marqueur sur les icônes des paquets qui sont déjà installés, et remplacement du marqueur utilisé pour indiquer les applications « natives » (utilisant le toolkit graphique de Haiku, par opposition à Qt et GTK par exemple).
    • Affichage plus rapide de l’état « en attente d’installation » lorsqu’on demande l’installation d’un paquet.
    • L’interface pour noter un paquet est masquée si l’attribution de notes n’est pas possible.

    Préférences

    Diverses améliorations dans les fenêtres de préférences:

    • Correction d’un crash dans les préférences d’affichage (korli).
    • Les préférences de fond d’écran n’acceptent plus le glisser-déposer d’une couleur sur un contrôle de choix de couleur désactivé. La modification de la position X et Y de l’image de fond se met à jour en temps réel quand on édite la valeur des contrôles correspondants.
    • Ajout de réglages supplémentaires (vitesse, accélération, défilement) dans les préférences des pavés tactiles. Ces options étaient déjà implémentées dans l’input_server, mais configurable uniquement pour les souris.
    • Suppression de code mort et amélioration de la gestion des polices de caractères dans les préférences d’apparence.

    Plusieurs améliorations sur les préférences de sons de notifications:

    • La fenêtre de sélection de fichiers retient le dernier dossier utilisé,
    • Elle permet également d’écouter un son avant de le sélectionner,
    • Les menus de sélection rapide de sons affichent uniquement les fichiers et pas les dossiers,
    • Certains sons ont été renommés.

    La plupart des sons ne sont cependant toujours pas utilisés par le système.

    Expander

    Expander est un outil permettant d’extraire plusieurs types de fichiers archivés.

    Peu de changement sur cet outil qui est assez simple et fonctionnel. La seule amélioration ce mois-ci concerne un changement des proportions de la fenêtre pour éviter un espace vide disgracieux.

    Cortex

    Cortex est une application permettant de visualiser et de manipuler les nœuds de traitement de données du Media Kit.

    Le composant « logging consumer » qui reçoit des données d’un autre noeud et les enregistre dans un fichier de log pour analyse a été amélioré pour enregistrer un peu plus d’informations.

    Icon-O-Matic

    L’éditeur d’icônes vectoriels Icon-O-Matic évolue peu, après un projet Google Summer of Code qui a ajouté la plupart des fonctionnalités manquantes. Ce trimestre, un seul changement: l’ajout d’une entrée menu pour supprimer un « transformeur ».

    PowerStatus

    L’application PowerStatus affiche l’état de la batterie. Cela peut se présenter comme une icône dans la barre des tâches. L’icône est de taille réduite, et les différents états n’étaient pas forcément bien visibles. Ce problème a été corrigé avec des nouveaux marqueurs pour l’état de la batterie (en charge ou inactive).

    StyledEdit

    StyledEdit est un éditeur de texte simple, permettant tout de même de formater le texte (un peu comme WordPad pour Windows).

    L’application reçoit une nouvelle option pour écrire du texte barré. Le code nécessaire a également été ajouté dans app_server, puisque cette possibilité était prévue, mais non implémentée.

    WebPositive

    Le navigateur WebPositive reçoit peu d’évolutions en ce moment, en dehors de la maintenance du moteur WebKit. On peut tout de même mentionner l’ajout d’un menu contextuel sur les marque-pages, permettant de les renommer et de les supprimer. Ce développement est issu d’un vieux patch réalisé par un candidat au Google Summer of Code, qui ne fonctionnait pas et n’avait jamais été finalisé.

    Mode sombre et configuration des couleurs

    Depuis la version Beta 5, Haiku dispose d’un nouveau système de configuration des couleurs, permettant d’obtenir facilement un affichage en « mode sombre ». Cependant, cet affichage est loin d’être parfait, et de petits ajustements sont à faire petit à petit dans toutes les applications qui n’avaient pas été pensées pour cela. En particulier, le changement de couleurs se fait en direct lorsqu’on change les réglages. On trouve ces trois derniers mois des changements dans DeskBar, Tracker, HaikuDepot, l’horloge, ainsi que la classe BTextView.

    Outils en ligne de commande

    pkgman peut rechercher les paquets installés et qui n’ont aucun autre paquet dépendant d’eux. Cela permet de trouver des paquets inutiles qui peuvent être désinstallés (il manque encore la possibilité de marquer un paquet comme étant « installé manuellement » avant de pouvoir automatiser le nettoyage).

    La commande route accepte la syntaxe utilisée par openvpn pour la configuration d’une route par défaut, ce qui facilite l’utilisation de VPN avec Haiku.

    Correction d’un problème dans le compilateur de ressources: la commande rc -d ne savait pas décompiler la structure app_version des applications Haiku, uniquement le format plus ancien utilisé par BeOS.

    La commande screenmode permet maintenant de récupérer la valeur actuelle du réglage du rétro-éclairage (en plus de permettre de changer cette valeur).

    Kits

    La bibliothèque de fonctions de Haiku est découpée en « kits » qui regroupent un ensemble de classes et de fonctionnalités liées.

    Application kit

    L’Application Kit permet, comme son nom l’indique, de lancer des applications. Il offre également toutes les fonctionnalités de boucles d’évènements, et d’envoi de messages entre applications et entre composants d’une application.

    Correction d’un problème de suppression d’un port dans la classe BApplication.

    Debug kit

    Le Debug Kit fournit les services nécessaires au Debugger pour débugger une application. Cela consiste d’une part en un accès privilégie à l’espace mémoire d’une application, et d’autre part en outils pour analyser les fichiers ELF des exécutables et bibliothèques.

    Le Debug Kit reçoit ce trimestre plusieurs évolutions et corrections permettant le décodage des stack traces dans les programmes compilés avec clang et lld. Par exemple, les fichiers ELF générés par ces outils sont découpés en plusieurs segments, alors que ce n’est pas le cas pour gcc.

    Device Kit

    Le Device Kit regroupe tout ce qui concerne l’accès direct au matériel et aux entrées-sorties depuis l’espace utilisateur: ports série, accès direct aux périphériques USB, accès aux joysticks et manettes de jeu.

    Les ports série RS232 peuvent être configurés avec des valeurs en baud personnalisées (pour l’instant uniquement pour les adaptateurs série USB).

    Interface kit

    L’Interface Kit regroupe tout ce qui concerne l’affichage de fenêtres et de vues à l’écran et les interactions avec ces fenêtres.

    • Ajout de constructeur « move » et d’opérateur d’assignation pour BRegion et BShape pour améliorer les performances en évitant les copie d’objet immédiatement suivies de suppression.
    • Ajout d’un constructeur pour BRect avec deux arguments (largeur et hauteur) pour les rectangles alignés en haut à gauche ou dont la position n’a pas d’importance.
    • Remise en place d’un cas particulier dans BBitmap::SetBits pour la gestion du canal alpha afin d’avoir un comportement plus proche de celui de BeOS.
    • BColorControl réagit correctement et déclenche les évènements nécessaires lorsqu’on modifie sa couleur par glisser-déposer.

    Media Kit

    Correction d’une assertion vérifiant la mauvaise condition dans BTimeSource.

    Réécriture de la classe BTimedEventQueue pour améliorer ses performances en évitant d’allouer de la mémoire dynamique.

    Amélioration de l’affichage des « media controls » (sliders de contrôle de volume par exemple) en mode sombre.

    libshared

    La « libshared » contient plusieurs classes expérimentales, en cours de développement, mais déjà utilisées par plusieurs applications. Il s’agit d’une bibliothèque statique, ce qui permet de changer facilement son contenu sans casser l’ABI des applications existantes.

    Ajout de la classe ColorPreview qui existait en plusieurs exemplaires dans le code de Haiku (préférences d’apparence et Terminal). Cette classe permet d’afficher une couleur dans un petit rectangle. Elle est utilisée à plusieurs endroits dans des contrôles de choix de couleur plus complexes, tels que des listes ou des menus.

    Servers

    Les servers sont des processus systèmes implémentant différentes fonctionnalités de Haiku. Le concept est similaire à celui des daemons dans UNIX, ou des services dans Windows NT et systemd.

    app_server

    L’app_server s’occupe de l’affichage des applications à l’écran.

    Suppression de code inutilisé depuis longtemps permettant l’accélération matérielle d’opérations de dessin en 2D (blit, tracé de lignes, remplissage de rectangles…).

    Sur les cartes graphiques PCI, ces opérations étaient souvent réalisées plus rapidement par le CPU qui tourne à une fréquence bien plus rapide que la carte. Sur les cartes AGP, l’accès en lecture à la mémoire vidéo par le CPU est très lent, et il était donc plus intéressant de faire ces opérations en RAM centrale avant d’envoyer un buffer prêt à afficher à la carte graphique. Enfin sur les cartes PCI express modernes, ces fonctions d’accélération ont disparu ou en tout cas n’ont pas du tout une interface compatible avec les besoins de Haiku. Il est donc temps de jeter ce code.

    Modification de la façon dont les applications récupèrent la palette de couleurs en mode graphique 256 couleurs: elle utilise maintenant une mémoire partagée, et il n’est plus nécessaire que chaque application demandent au serveur graphique d’en obtenir une copie.

    input_server

    L’input_server se charge des entrées souris et clavier. Cela comprend les méthodes d’entrée de texte (par exemple pour le Japonais) ainsi que des filtres permettant de manipuler et d’intercepter ces évènements d’entrée avant leur distribution dans les applications.

    Améliorations du filtre PadBlocker pour bloquer le touchpad quand le clavier est en cours d’utilisation sur les PC portables: gestion des répétitions de touches, blocage uniquement du touchpad et pas des autres périphériques de pointage.

    net_server

    Le net_server se charge de la configuration des interfaces réseau.

    Arrêt du client d’autoconfiguration (DHCP par exemple) lors de la perte du lien sur un port Ethernet, pour ne pas essayer d’envoyer des paquets alors que le câble est débranché.

    notification_server

    notification_server se charge de l’affichage de panneaux de notification pour divers évènements tels que la connexion et déconnexion d’interfaces réseau, un niveau dangereusement bas de la batterie, la fin d’un téléchargement…

    La fenêtre de notification a été retravaillée pour mieux s’adapter à la taille de police d’affichage choisie par l’utilisateur.

    mail_daemon

    mail_daemon permet d’envoyer et de recevoir des e-mails. Les messages sont stockés sous forme de fichiers avec des attributs étendus pour les métadonnées (sujet, expéditeur…). Plusieurs applications clientes permettent de rédiger ou de lire ces fichiers. Ainsi chaque application n’a pas besoin de réimplémenter les protocoles IMAP ou SMTP.

    Amélioration de la fenêtre de logs pour la compatibilité avec le mode sombre.

    runtime_loader

    Le runtime_loader est l’outil qui permet de démarrer un exécutable. Il se charge de trouver toutes les bibliothèques partagées nécessaires et de les placer dans la mémoire.

    Ajout du flag PF_EXECUTE qui rend exécutable uniquement les sections ELF qui le nécessitent (auparavant, toutes les sections qui n’étaient pas accessibles en écriture étaient exécutables). Cela est utilisé en particulier par clang, qui sépare une zone en lecture seule (pour les constantes) et une autre en lecture et exécution (pour le code). Avec gcc, les deux sont habituellement regroupées dans la même section.

    Drivers

    Périphériques de stockage

    Correction de bugs dans la couche SCSI (utilisée également pour d’autres périphériques de stockage qui encapsulent des commandes SCSI). Des drapeaux d’état n’étaient pas remis à 0 au bon moment, ce qui causait des kernel panic avec le message « no such range! ».

    Cela a été l’occasion de faire du ménage : suppression de champs inutilisés dans des structures de données, et suppression du module d’allocation mémoire locked_pool qui n’était utilisé que par la pile SCSI. À la place, utilisation des fonctions d’allocation mémoire standard du noyau, qui sont amplement suffisantes pour répondre aux besoins de ce module (waddlesplash).

    Cartes son

    Correction d’erreurs dans le code de gestion mémoire des pilotes es1370 et auvia. Ces drivers utilisaient deux copies d’un code d’allocation identique, mais avaient divergé l’un de l’autre. Ils ont été réunifiés mais cela a provoqué quelques régressions, avec des difficultés pour trouver des machines permettant de tester chacune des cartes son concernées. Haiku peut heureusement compter sur des utilisateurs « avancés » qui testent régulièrement les nightly builds pour détecter ce type de régression (korli).

    Réseau

    Correction d’une fuite mémoire lors de l’utilisation de sockets « raw » permettant d’envoyer et de recevoir directement des paquets ethernet (en contournant la couche IP).

    Pilotes FreeBSD

    Une grande partie des pilotes de carte réseau de Haiku sont en fait ceux de FreeBSD ou d’OpenBSD. Une couche de compatibilité permet de réutiliser ces pilotes avec très peu de changement dans leur code source. Ainsi, les évolutions et corrections peuvent être partagées avec l’un ou l’autre de ces systèmes. La collaboration avec les *BSD pour les pilotes réseau se passe de mieux en mieux : suite au développement d’une couche de compatibilité permettant d’utiliser les pilotes OpenBSD dans Haiku, les développeurs de FreeBSD étudient la possibilité de réutiliser également ces pilotes. De plus, les développeurs de Haiku et d’OpenBSD sont en contact pour coordonner les mises à jour et les tests.

    Génération de statistiques plus fiables sur les paquets réseaux dans la couche de compatibilité FreeBSD et remontée des statistiques générées par les pilotes associés.

    Synchronisation du pilote realtekwifi avec la version de FreeBSD et reconnaissance d’un identifiant de périphérique USB supplémentaire dans ce pilote.

    Amélioration de la couche de compatibilité pour se comporter plus précisément comme FreeBSD, et suppression de patchs correspondants dans les pilotes qui sont devenus superflus.

    Amélioration des performances de la couche de compatibilité: retrait de comparaisons de chaînes de caractères et d’allocations inutiles.

    Pilotes spécifiques à Haiku

    Amélioration du comportement du pilote USB RNDIS (partage de connexion sur USB de certains téléphones Android) lorsque le câble USB est déconnecté. Le pilote incluait du code pour tenter de restaurer la connexion existante si le même appareil est reconnecté, mais les périphériques RNDIS utilisent des adresses MAC aléatoires qui changent à chaque connexion, donc cela ne pouvait pas fonctionner. De plus, certains transferts USB n’étaient pas correctement annulés pour laisser la pile USB dans un état propre après la déconnexion du périphérique.

    USB

    Ajout d’une annulation de transferts de données en attente dans le pilote pour les périphériques de stockage USB, ce qui corrige un kernel panic lors de l’utilisation de lecteurs de disquettes USB. Arrêt immédiat des opérations (au lieu de ré-essayer pendant quelques secondes) si le périphérique indique « no media present » (CD ou disquette éjectée de son lecteur par exemple).

    Ajout d’une vérification de pointeur NULL et de libération de mémoire manquantes dans la pile USB, ce qui corrige des fuites de mémoires (qui étaient là depuis longtemps) et une assertion qui se déclenchait (introduite plus récemment).

    Le pilote de webcam UVC est mis à jour pour utiliser des constantes (identifiants de types de descripteurs…) partagées avec le reste du système au lieu de toutes les redéfinir une deuxième fois. L’affichage des descripteurs dans listusb est également complété pour décoder toutes les informations disponibles. Le pilote n’est toujours pas complètement fonctionnel: l’établissement des transferts au niveau USB fonctionne, mais pour l’instant le pilote ne parvient pas à décoder les données vidéo reçues correctement.

    Le pilote HID sait reconnaître les « feature reports », qui permettent de configurer un périphérique. Par exemple, cela peut permettre de configurer un touchpad en mode multi-point (dans lequel le système doit effectuer lui-même le suivi de chaque doigt sur la surface tactile pour convertir cela en mouvements de pointeur de souris) ou en mode émulation de souris (où on ne peut utiliser qu’un doigt à la fois, mais avec un pilote beaucoup plus simple).

    Le pilote pour les tablettes Wacom reconnaît la tablette CTH-470.

    PS/2

    Les ports PS/2 ont disparu de la plupart des machines ces dernières années, mais le protocole reste utilisé pour le clavier des ordinateurs portables, ainsi que pour certains touchpads. Malheureusement, le protocole est seulement émulé au niveau de l’« embedded controller » (le microprocesseur qui se charge de l’interfaçage de divers composants annexes). Le résultat est que l’implémentation du protocole et des registres d’interface peut s’éloigner considérablement des documents officiels.

    Amélioration de la détection des contrôleurs PS/2 supportant le protocole « active multiplexing » permettant de connecter à la fois une souris et un touchpad. La procédure de détection officielle peut générer des faux positifs: certains contrôleurs répondent bien à cette commande, mais n’implémentent en fait pas du tout le protocole. Cela provoquait un long délai au démarrage alors que le pilote tente d’énumérer des périphériques de pointage qui n’existent pas. Une vérification supplémentaire après l’activation du mode multiplexé permet de détecter ce cas.

    virtio_pci

    virtio est un standard matériel pour les machines virtuelles. Plutôt que d’émuler un vrai matériel (carte réseau, carte graphique…), une machine virtuelle peut émuler un matériel qui n’a jamais été fabriqué, mais dont la programmation est beaucoup plus simple. Cela permet également des opérations inimaginables sur du matériel réel, comme la possibilité de changer la taille de la RAM en cours d’exécution pour mieux partager la mémoire de l’hôte entre différentes machines virtuelles.

    Le pilote virtio_pci est à la racine du système virtio. Il détecte la « carte PCI » virtio et implémente les primitives de base d’envoi et de réception de messages entre l’hôte et la machine virtualisée (du côté virtualisé, pour le côté hôte, c’est le virtualisateur, par exemple QEMU, qui s’en charge).

    Correction de plusieurs problèmes avec les numéros de files virtio qui rendaient les pilotes instables.

    ACPI

    ACPI est un cadriciel pour la gestion de l’énergie et l’accès au matériel. Le fabricant du matériel fournit (dans la ROM du BIOS) un ensemble de « tables » contenant une description du matériel disponible, ainsi que des méthodes compilées en bytecode pour piloter ce matériel. Le système d’exploitation doit fournir un interpréteur pour ce bytecode, puis réaliser les entrées-sorties vers le matériel demandé lors de l’exécution.

    Haiku utilise actuellement ACPICA, une bibliothèque ACPI développée principalement par Intel.

    Correction d’un problème d’accès à de la mémoire non cachée. Une modification faite pour les machines ARM a déclenché un problème sur les machines x86.

    Sondes de température

    Ajout d’un nouveau pilote amd_thermal, ajout de ce dernier ainsi que des pilotes pch_thermal et acpi_thermal dans l’image disque par défaut. Ces pilotes devraient permettre de récupérer la température du processeur sur la plupart des machines. Il reste maintenant à intégrer cela dans les outils en espace utilisateur pour faire un bon usage de ces informations.

    Pilotes graphiques

    Ajout de deux nouvelles générations de cartes graphiques dans le pilote intel_extreme.

    Le pilote VESA est capable de patcher le BIOS de certaines cartes graphiques à la volée pour y injecter des modes graphiques supplémentaires (la spécification VESA permettant à l’OS uniquement de choisir un mode parmi une liste fournie par la carte graphique, liste souvent assez peu fournie). Ce mode est désormais activé par défaut sur les cartes graphiques où il a pu être testé avec succès.

    Systèmes de fichiers

    FAT

    FAT est un système de fichier développé par Microsoft et qui remonte aux premiers jours de MS-DOS. Il est encore utilisé sur certaines clés USB et cartes SD, bien que exFAT tend à le remplacer petit à petit. Il est également utilisé pour les partitions systèmes EFI.

    Le pilote de Haiku a été récemment réécrit à partir de celui de FreeBSD. L’amélioration de ce nouveau pilote se poursuit, avec ce mois-ci :

    • Les noms de volumes FAT sont convertis en minuscules comme le faisait l’ancien pilote FAT,
    • Le cache de blocs implémente maintenant un mécanisme de prefetch pour récupérer plusieurs blocs disque d’un coup, et le pilote FAT utilise cette nouvelle possibilité pour améliorer en particulier le temps de montage,
    • Correction de problèmes dans le cache de fichiers si deux applications accèdent au même fichier mais avec des noms différents par la casse (le système de fichier ignorant ces différences).

    BFS

    BFS est le système de fichier principal de BeOS et de Haiku. Il se distingue des autres systèmes de fichiers par une gestion poussée des attributs étendus, avec en particulier la possibilité de les indexer et d’effectuer des requêtes pour trouver les fichiers correspondants à certains critères.

    Clarification de la description des options disponibles lors de l’initialisation d’un volume BFS.

    Correction des fonctions d’entrées/sorties asynchrones pour référencer correctement les inodes, ce qui corrige un très ancien rapport de bug. Des corrections similaires ont été faites également dans les pilotes FAT et EXFAT.

    Correction des requêtes sur l’attribut « dernière modification », et amélioration de la gestion du type « time » pour éviter les conversions inutiles (ce type d’attribut est historiquement stocké en 32 bits mais migré en 64 bits lorsque c’est possible pour éviter le bug de l’an 2038, aussi le code doit être capable de traiter ces 2 formats de stockage).

    packagefs

    Le système de fichier packagefs est au centre de la gestion des paquets logiciels dans Haiku. Les paquets ne sont pas extraits sur le disque, mais montés dans un système de fichier spécifique (qui implémente une version tout-en-un de ce qui pourrait être réalisé sous Linux avec squashfs et overlayfs).

    Ce système de fichier se trouve donc sur le chemin critique en termes de performances, ce qui fait que même de petites optimisations peuvent déboucher sur de gros gains de performance.

    Optimisation de la gestion de la mémoire: utilisation d’un allocateur dédié pour allouer et désallouer très rapidement de la mémoire de travail avec une durée de vie courte.

    Ajout d’une vérification manquante sur la présence du dossier parent, qui pouvait déclencher un kernel panic.

    NFS4

    Le pilote NFS4 permet de monter des partages réseau NFS. Cependant, le pilote ne fonctionne pas toujours, et certains utilisateurs doivent se rabattre sur le pilote NFS v2 (ancienne version du protocole de moins en moins utilisée), ou encore sur des systèmes de fichiers FUSE comme SMB ou sshfs.

    Le pilote NFS4 peut maintenant être compilé avec userlandfs (équivalent de FUSE pour Haiku) pour s’exécuter en espace utilisateur. Cela facilitera le déboguage.

    ramfs et ram_disk

    ram_disk est un périphérique de stockage qui stocke les données en RAM, il a une taille fixe et doit être formaté avec un système de fichiers avant de pouvoir être utilisé.
    ramfs est un système de fichier stockant les données directement en RAM sans passer par un périphérique de stockage de type bloc. Sa taille est dynamique en fonction des fichiers qui sont stockés dedans.

    Ces deux pilotes ont reçu divers nettoyages et corrections, suite à des problèmes mis en évidence par des assertions ajoutées précédemment dans le code.

    Dans le ramfs, nettoyage de code dupliqué, réduction de la contention sur les verrous, amélioration de la fonction readdir pour retourner plusieurs entrées d’un coup au lieu de les égréner une par une.

    Ajout de la gestion des fichiers « spéciaux » (FIFOs nommés, sockets UNIX) dans ramfs.

    Autres

    Refonte de l’algorithme de « scoring » des requêtes sur les systèmes de fichiers. Cet algorithme permet d’estimer quels sont les termes de la requête les moins coûteux à évaluer, afin de réduire rapidement le nombre de fichiers répondant aux critères, et d’effectuer les opérations complexes seulement sur un petit nombre de fichiers restants. Les requêtes s’exécutent ainsi encore plus rapidement (waddlesplash).

    Réécriture du code pour identifier les partitions dans mount_server. Ce code permet de re-monter les mêmes partitions après un redémarrage de la machine, mais l’ancien algorithme pouvait trouver de faux positifs et monter des partitions supplémentaires (OscarL et waddlesplash).

    Correction d’une option de debug pour intercepter les accès aux adresses non initialisées (0xcccccccc) ou déjà libérées (0xdeadbeef). Cela permet de détecter certains accès à des pointeurs invalides. Cette option ne fonctionnait correctement que sur les systèmes 32 bit, maintenant, l’adresse correspondante pour les machines 64 bit est également protégée.

    libroot

    La libroot est la librairie C de base de Haiku. Elle regroupe les fonctions parfois implémentées dans les libc, libm, libpthread, librt et libdl pour d’autres systèmes. Haiku choisit une approche tout-en-un, car il est excessivement rare qu’une application n’ait pas besoin de toutes ces bibliothèques.

    Du fait de la grande diversité des services rendus par cette bibliothèque, il est difficile de présenter les changements de façon cohérente et organisée.

    Correction de quelques cas particuliers dans le traitement des tableaux de descripteurs de fichiers pour select() et déplacement d’une partie des définitions de sys/select.h vers des en-têtes privés non exposés aux applications (waddlesplash).

    Ajout d’une fonction manquante dans les « stubs » de la libroot, qui sont utilisés lors de la compilation de Haiku en mode « bootstrap » (sans aucune dépendance précompilée externe). Les stubs sont normalement générés à l’aide d’un script, mais celui-ci n’avait pas pris en compte une fonction nécessaire seulement sur les architectures x86.

    Poursuite du travail d’unification des fonctions de manipulation des temps d’attentes pour toutes les fonctions de la libroot qui peuvent déclencher un timeout. Correction d’un cas où la fonction pthread_testcancel retournait NULL au lieu de la valeur attendue PTHREAD_CANCELED.

    Optimisation de la fonction strcmp, remplacement d’autres fonctions avec de meilleures implémentations provenant de la bibliothèque C musl.

    Compatibilité POSIX-2024

    La spécification POSIX Issue 8 a été publiée et comporte de nombreux changements. Après la version 7, la façon de travailler est devenue plus ouverte, avec un outil de suivi de bugs permettant de proposer des améliorations. Cela conduit à la standardisation de nombreuses extensions qui sont communes entre les systèmes GNU et BSD, rendant plus facile d’écrire du code portable entre tous les systèmes compatibles POSIX.

    • Ajout de fonctions qui ouvrent des descripteurs de fichiers avec le drapeau O_CLOEXEC activé par défaut (dup2, pipe3)
    • Ajout de reallocarray (un mélange de calloc et realloc)
    • Ajout de memmem (recherche d’une suite d’octets dans une zone de mémoire)
    • Ajout de mkostemp
    • Ajout de posix_devctl et modifications de l’implémentation de ioctl
    • Ajout de pthread_getcpuclockid pour mesurer le temps CPU consommé par un thread
    • Ajout de la constante d’erreur ESOCKTNOSUPPORT bien qu’elle ne soit jamais utilisée (cela facilite le portage d’applications qui attendent l’existence de ce code d’erreur)
    • Correction d’une boucle infinie dans pipe2
    • Suppression des fonctions *randr48_r des en-têtes publics. Il s’agit d’une extension disponible uniquement dans la glibc, et qui ne devrait donc pas être disponible dans la libroot. Cependant, l’implémentation est conservée pour assurer la compatibilité d’ABI avec les applications existantes.

    ioctl et posix_devctl

    La fonction ioctl existe depuis le début de UNIX et permet de réaliser des opérations spéciales sur les descripteurs de fichiers (tout ce qui n’est pas une simple lecture ou écriture). En particulier, elle est beaucoup utilisée pour les pilotes de périphériques qui exposent une interface sous forme de fichiers dans /dev.

    L’existence de cette fonction était demandée dans la spécification POSIX, mais son fonctionnement n’était pas documenté à l’exception de quelques cas particuliers. La documentation spécifie une fonction avec un nombre d’arguments variable : un numéro de descripteur de fichier, un identifiant de l’opération à effectuer, puis des paramètres qui dépendent de l’opération. On trouve des opérations avec aucun, un, ou deux paramètres.

    Dans UNIX et la plupart de ses dérivés, la liste des opérations possibles est définie à l’avance, et le format des numéros identifiants permet de déterminer de façon prédictible quel est le nombre de paramètres attendus. Ce n’est pas le cas dans Haiku : les pilotes de périphériques ont le choix d’assigner n’importe quelle valeur à n’importe quelle opération, et la même valeur numérique peut donc avoir une signification différente selon le type de fichier.

    L’opération ioctl est donc en réalité implémentée avec toujours 4 arguments pour Haiku : en plus des deux déjà mentionnés, il faut ajouter un pointeur vers une zone de mémoire, et un entier indiquant la taille de cette zone. Des acrobaties à base de macros permettent de remplir ces deux paramètres avec des valeurs par défaut lorsqu’ils ne sont pas nécessaires (au moins pour les programmes écrits en C ; en C++, ces deux paramètres sont simplement déclarés avec une valeur par défaut).

    Heureusement, ces problèmes avec ioctl vont être résolus, puisque POSIX a introduit une nouvelle fonction en remplacement : posix_devctl. Celle-ci fonctionne comme l’implémentation de ioctl dans Haiku, mais les arguments doivent toujours être spécifiés explicitement. Cela va donc permettre de disposer d’une interface réellement portable pour ces opérations.

    Kernel

    Correction de la taille du tampon mémoire par défaut de la classe KPath qui permet au noyau de manipuler des chemins dans le système de fichiers (waddlesplash).

    VFS

    Le VFS (virtual filesystem) est l’interface entre les appels systèmes d’accès aux fichiers (open, read, write…) et les systèmes de fichiers proprement dit. En plus de ce travail d’interfaçage (par exemple : convertir un chemin de fichier absolu en chemin relatif à un point de montage), cette couche regroupe un ensemble de fonctionnalités qui n’ont pas besoin d’être réimplémentées par chaque système de fichier: vérification des permissions, mémoire cache pour limiter les accès au disque.

    Si les systèmes de fichiers identifient chaque objet par un inode (en général lié à la position de l’objet sur le disque ou dans la partition de stockage), le VFS travaille lui avec des vnode qui existent uniquement en RAM et sont alloués dynamiquement pour les fichiers en cours d’utilisation.

    D’autre part, les systèmes de fichiers peuvent se reposer sur un cache de blocs. Ce dernier se trouve plutôt à l’interface entre un système de fichier et le support de stockage correspondant, puisqu’il fonctionne au niveau des blocs de données stockées sur disque. Mais son intégration avec le VFS est nécessaire pour savoir quels sont les fichiers en cours d’utilisation et les opérations prévisibles sur chacun (par exemple, il est utile de pré-charger la suite d’un fichier lorsque un programme demande à en lire le début, car il est probable que ces informations vont bientôt être nécessaires).

    Le VFS est donc un élément central en particulier pour obtenir de bonnes performances sur les accès aux fichiers, en minimisant les accès aux vrais systèmes de fichiers qui doivent maintenir beaucoup d’informations à jour sur les disques. Tout ce qui peut être traité en utilisant uniquement la RAM grâce à la mise en cache est beaucoup plus rapide.

    Investigation et amélioration des performances de la commande git status qui prenait beaucoup plus de temps à s’exécuter que sur d’autres systèmes (waddlesplash):

    • Meilleure gestion des vnodes inutilisés à l’aide d’une liste chaînée 'inline' protégée par un spinlock, à la place d’un mutex peu performant dans ce code très fréquemment appelé.
    • Modification de la structure io_context pour utiliser un verrou en lecture-écriture (permettant plusieurs accès concurrents en lecture, mais un seul en modification).
    • Ajout d’un chemin rapide dans le cas le plus simple de la recherche de vnode.

    Avec ces changements, les performances sont améliorées au moins lorsque les données nécessaires sont déjà disponibles dans le cache disque.

    Nettoyage et corrections dans les fonctions d’entrées-sorties vectorisées et asynchrones do_iterative_fd_io et do_fd_io utilisées par les systèmes de fichiers: meilleure gestion des références et prise en compte de certains cas particuliers. Cela permet de simplifier un peu le code de pré-remplissage du cache de blocs (waddlesplash).

    La prise en compte des drapeaux O_RDONLY|O_TRUNC lors de l’ouverture d’un fichier est maintenant faite directement dans le VFS, il n’est plus nécessaire de transmettre la requête au système de fichier. Cette combinaison de drapeaux est un comportement indéfini dans POSIX, et supprime le contenu du fichier dans Linux. Dans Haiku, elle remonte une erreur.

    Correction du comportement de l’ouverture d’un symlink invalide (ne pointant pas sur un fichier) avec le flag O_CREAT.

    Le parser de requêtes pouvait essayer de lire des données invalides (la taille de clé d’un index inexistant) dans certains cas particuliers.

    Nettoyage de logs dans tous les systèmes de fichiers qui affichaient un message lors de chaque tentative d’identification. On avait donc un message de chaque système de fichier pour chaque partition. Maintenant, le cas le plus courant (le système de fichier ne reconnaît pas du tout la partition) ne déclenche plus de logs.

    Correction d’une erreur dans userlandfs sur la fonction file_cache_read pour les tentatives d’accès après la fin d’un fichier (cas particulier nécessaire pour implémenter correctement mmap).

    Correction d’une mauvaise gestion du errno dans le cache de blocs, qui pouvait aboutir à un kernel panic.

    Diverses améliorations, nettoyages et corrections de fuites mémoire: dans la gestion des fichiers montés comme image disques, dans les entrées-sorties asynchrones, dans l’enregistreur d’évènements scheduling recorder.

    Console et affichage

    Unification du code d’affichage du splash screen (par le bootloader) et des icônes de la séquence de démarrage (par le kernel) pour éviter qu’ils prennent des décisions différentes sur le positionnement (par exemple si l’un est compilé pour afficher le logo de Haiku, et l’autre en version « dégriffée » sans ce logo qui est une marque déposée) (waddlesplash).

    Initialisation de la console framebuffer beaucoup plus tôt dans le démarrage du noyau, ce qui permet d’afficher un message à l’écran en cas de kernel panic y compris dans les premières étapes du démarrage (par exemple, l’initialisation de la mémoire virtuelle). Auparavant, ces informations étaient disponibles uniquement dans le syslog (inaccessible si le système ne démarre pas) ou via un port série (en voie de disparition sur les machines modernes) (waddlesplash).

    Réseau

    Remontée des données annexes (ancillary data) en une seule fois lorsque c’est possible. Ces données sont utilisées en particulier dans les sockets de domaine AF_UNIX pour permettre d’échanger des descripteurs de fichiers entre processus. Ce regroupement de données n’est pas exigé par la spécification POSIX, mais c’est le comportement attendu par le code de communication interprocessus de Firefox et de Chromium (ils utilisent tous les deux le même code) (waddlesplash).

    Gestion de la mémoire

    Comme indiqué plus haut dans la dépêche, l’apparition du navigateur Iceweasel a mis en évidence de nombreux problèmes autour de la gestion de la mémoire. Cela a donc été l’objet d’un gros travail de stabilisation et d’amélioration.

    • Le cache d’objets du noyau pouvait parfois ignorer le paramètre indiquant la réserve minimum d’objets devant toujours être disponibles (waddlesplash)
    • Amélioration de l’implémentation de la famille de fonctions autour de mprotect, qui permettent une gestion fine et bas niveau de la mémoire. En particulier, plusieurs problèmes se posaient lors de l’utilisation de ces fonctions lors d’un appel à fork, les deux processus se retrouvant dans un état incohérent,
    • Suppression de logs présents dans les méthodes de défaut de page, qui sont peu appelées pour les applications classiques, mais exploitées volontairement par d’autres applications (machines virtuelles Java ou Javascript par exemple). Les logs étaient donc superflus dans ce cas (waddlesplash),
    • Optimisation de l’écriture par lot de plusieurs pages de mémoire vers le swap,
    • Meilleure gestion des permissions d’accès page par page,
    • Correction de plusieurs problèmes conduisant à un blocage ou fort ralentissement du système quand il n’y a plus assez de mémoire libre,
    • Amélioration de la stratégie d’allocation de la table des descripteurs de fichiers,
    • Regroupement de code dupliqué pour chaque plateforme qui était en fait générique.

    Ce travail se poursuit avec un remplacement de l’allocateur mémoire actuel, qui est basé sur hoard2. Cette implémentation est assez ancienne et montre aujourd’hui ses limites. Des essais sont en cours avec l’implémentation de malloc d’OpenBSD, ainsi qu’avec mimalloc de Microsoft, pour déterminer lequel des deux sera utilisé. D’autres allocateurs ont été rejetés, car ils ne répondent pas au besoin de Haiku, en particulier la possibilité de fonctionner efficacement sur un système 32 bits ou l’espace d’adressage est une ressource limitée.

    Autres

    Sécurisation des permissions sur les zones mémoire partagées: une application ne peut pas ajouter des permissions en écriture aux zones mémoire d’une autre application. Une application qui n’est pas lancée par l’utilisateur root ne peut pas inspecter la mémoire d’une application lancée par l’utilisateur root. Ajout toutefois de cas particuliers pour permettre au Debugger de faire son travail (il a besoin d’accéder à la mémoire d’autres applications).

    Ajout et amélioration de commandes dans le debugger noyau pour investiguer l’état de l’ordonnanceur d’entrées-sorties, qui se charge de programmer les accès disque dans un ordre le plus efficace possible (waddlesplash).

    La fonction vfork n’appelle plus les fonctions pre-fork. Haiku n’implémente pas complètement vfork, mais peut se permettre des optimisations sur le travail qu’un duo fork + exec classique demanderait normalement.

    La configuration de la randomization de l’espace mémoire (ASLR) est maintenant faite par la libroot et pas par le noyau. Ainsi une application peut utiliser une version différente de la libroot pour avoir une politique de randomization différente.

    Optimisation de l’accès par un thread à sa propre structure Thread

    Chargeur de démarrage

    L’écran de démarrage s’affiche correctement sur les systèmes EFI utilisant un mode écran avec une profondeur de couleur 16 bits (korli).

    Affichage de la taille des partitions démarrables dans le menu de démarrage, pour faciliter leur identification (waddlesplash).

    Activation des warnings du compilateur sur les chaînes printf invalides.

    Augmentation de la zone de mémoire utilisée pour la décompression de l’archive de démarrage lors du boot sur le réseau, l’archive était devenue trop grosse suite à l’ajout de nouveaux pilotes.

    Refactorisation du code de gestion de la mémoire entre le bootloader et le runtime_loader, ajout de tests pour cette implémentation, et optimisation de l’utilisation mémoire du bootloader.

    Amélioration du comportement si le device tree définit un port série sans spécifier de baudrate: le bootloader suppose que le baudrate est déjà configuré, et utilise le port sans essayer de le réinitialiser.

    Outils de compilation

    La compilation de Haiku est un processus relativement complexe: il faut utiliser deux compilateurs pour Haiku lui-même (un gcc récent plus une version plus ancienne pour assurer la compatibilité avec BeOS) ainsi que un compilateur pour le systême hôte de la compilation (qui peut être Linux, BSD, Mac OS ou Windows) pour générer des outils nécessaires à la compilation elle-même. L’outil retenu est Jam, une alternative à Make avec une meilleure gestion des règles génériques réutilisables.

    • Ajout de vérification pour éviter d’avoir un build partiellement configuré, avec des ConfigVars définies mais vides.
    • Retrait d’un warning incorrect dans l’outil de build jam si on spécifie à la fois un profil et une cible de compilation sur la ligne de commande.
    • Reconnaissance des processeurs hôtes ARM et RISC-V pour la compilation croisée, correction d’autres problèmes avec les architectures non-x86.
    • Ajout de dépendances manquantes dans les règles de compilation de packagefs.
    • Suppression de fichiers de licence fournis avec Haiku mais concernant du code qui avait été supprimé de Haiku auparavant.
    • Amélioration de la remontée d’erreur du script configure si un interpréteur Python n’a pas été trouvé.
    • Correction de messages d’avertissement de awk pour l’utilisation de fonctions qui n’existent plus dans le traitement des fichiers d’identifiants matériels USB et PCI.

    Documentation

    Documentation interne

    Ajout de documentation sur les détails d’implémentation de ioctl et posix_devctl et les spécificités de Haiku pour la première (PulkoMandy).

    Correction de fautes de frappe dans l’introduction au launch_daemon.

    Remplacement de toutes les références à "OpenBeOS" par "Haiku".

    Documentation d’API

    Ajout de documentation pour les méthodes GetFontAndColor et SetFontAndColor de BTextView.

    Ajout de documentation pour les classes BShelf et BGameSound.

    Réorganisation de la liste des caractères de contrôles dans la documentation du clavier, ajout d’entrées manquantes dans cette liste et ajoute de commentaires indiquant à quelles combinaisons de touches ces caractères sont normalement associés.

    Traductions de Haiku

    La traduction du système dans différentes langues est un facteur important d’inclusivité et d’accessibilité (même si la communication avec l’équipe de développeurs pour le support n’est pas toujours simple).

    Haiku est disponible dans 30 langues, la trentième étant le coréen, pour lequel il y a un nouveau responsable des traductions (le précédent avait cessé toute activité et laissé la traduction inachevée).

    Haiku recherche des volontaires pour s’occuper des traductions en biélorusse, croate, bulgare, hindi, punjabi et slovène, pour lesquelles les précédents responsables de relectures n’ont plus le temps d’assurer le rôle. Ainsi bien sûr que de l’aide pour la traduction du système, du manuel d’utilisation, et des applications tierces, que ce soit pour ajouter de nouvelles langues ou pour renforcer les équipes s’occupant de langues existantes. Le point d’entrée est le portail d’internationalisation de Haiku.

    La traduction du système Haiku s’effectue avec Pootle. L’outil n’est plus développé et des investigations sont en cours pour le remplacer par Weblate. La traduction du manuel d’utilisation s’effectue avec [un outil spécifiquement développé pour cela](https://github.com/haiku/userguide-translator. La traduction des applications s’effectue également avec un outil personnalisé nommé Polyglot.

    Commentaires : voir le flux Atom ouvrir dans le navigateur

    ❌