Vue lecture

Nouvelles de Haiku - Automne 2025

Haiku est un système d’exploitation pensé pour les ordinateurs de bureau. Il est basé sur BeOS mais propose aujourd’hui une implémentation modernisée, performante, et qui conserve les idées qui rendaient BeOS intéressant: une interface intuitive mais permettant une utilisation avancée, une API unifiée et cohérente, et une priorisation de l’interface graphique par rapport à la ligne de commande pour l’administration du système.

Le projet est actuellement (depuis 2021) en phase de beta test. La plupart des fonctionnalités sont implémentées et l’attention des développeurs se porte sur la correction de bugs, l’amélioration de la stabilité et des performances, et plus généralement, les finitions et petits détails. Une autre part du travail est le suivi de l’évolution de l’environnement technologique: nouveaux pilotes de périphériques, suivi des derniers standards du web, etc.

Ce trimestre, les changements se concentrent sur l'amélioration des performances, l'amélioration des outils internes de debug, et, du côté de l'interface graphique, la poursuite du travail sur le mode sombre et le nettoyage du code du Tracker.

Sommaire

Optimisation des performances de git status

Depuis longtemps, l'exécution de git status est beaucoup plus lente sous Haiku que sous Linux, ce qui est particulièrement visible (et ennuyant) lorsqu'on travaille avec de gros dépôts git. Les raisons de cette lenteur sont nombreuses, mais la plus importante était la "lock contention" dans les cache disques.

Waddlesplash a refactorisé la gestion du cache d'entrées de répertoires et du cache de blocs de disque dans le noyau, afin d'utiliser des opérations atomiques à la place de verrous dans les cas les plus fréquents: la lecture d'un bloc qui est déjà dans le cache, et l'insertion d'un élément dans le cache d'entrées. Ces changements sont complexes à développer et encore plus difficiles à tester: il y a bien sur des risque de "race conditions", qui disparaissent dès qu'on essaie d'ajouter des traces ou d'exécuter le code pas à pas, puisque cela modifie le timing de l'exécution. La seule façon de s'en sortir est d'être rigoureux lors de l'écriture puis de la relecture du code.

Ces efforts ont été payants: sur un test en condition réelles, l'exécution de git status sur le dépôt buildtools de Haiku (qui contient tout le code source de gcc et des binutils, soit plus de 160 000 fichiers) passe de 33 secondes à 20 secondes si le cache disque est à froid, et de 15 à 2.5 secondes si le cache est pré-rempli.

C'est encore loin des performances de Linux (seulement 0.3 secondes pour un test avec le même dépôt git). Les mesures pour Haiku sont faites avec un noyau compilé en mode KDEBUG, c'est à dire avec des vérifications d'intégrité supplémentaires, mais cela ne justifie tout de même pas des performances 10 fois plus mauvaises. On peut voir le verre à moitié plein et se dire que Haiku est 6 fois plus rapide qu'avant, ce qui est déjà très bien.

Nouveau "tas gardé" (guarded heap) pour le noyau

Le tas est la structure de données dans laquelle sont gérées toutes les allocations mémoires dynamiques. Certains utilisateurs de Haiku sont probablement familiers du "tas gardé" pour l'espace utilisateur, que l'on demande d'activer pour investiguer des plantages logiciels, avec une commande ressemblant à LD_PRELOAD=libroot_debug.so MALLOC_DEBUG=g programme. Le principe de fonctionnement est que chaque allocation (avec la fonction malloc par exemple) est placée dans sa propre page mémoire, et alignée à la fin de la page. Ainsi, tout accès hors des limites de la page peut être détecté immédiatement lorsqu'il survient, et, si on désactive en plus la réutilisation de la mémoire libérée, cela permet de détecter également l'accès à de la mémoire libérée et la double libération (double free) de mémoire. Bien sûr, cette approche est très inefficace en termes de consommation mémoire, mais elle a l'avantage de pouvoir être utilisée sans avoir besoin de recompiler le logiciel défectueux.

Le changement ce mois-ci ne porte pas sur le tas gardé pour l'espace utilisateur, mais sur celui du noyau. À l'origine, le principe de fonctionnement du tas gardé du noyau était similaire à celui de l'espace utilisateur. Cependant, la gestion de la mémoire dans le noyau s'avère plus complexe, puisque le noyau utilise sa propre mémoire pour le suivi des allocations de zones mémoire (areas) et toute sorte de choses importantes au fonctionnement du système. En conséquence, lors d'un appel à malloc par du code s'exécutant dans le noyau, il n'est pas toujours possible d'allouer de la mémoire sur le moment, parce que le code se trouve lui-même dans une section critique dédiée à la gestion de la mémoire. Cela provoquerait une récursion ou un deadlock. L'implémentation de malloc doit dans ce cas utiliser de la mémoire réservée par avance à cet effet. Mais l'allocateur mémoire du noyau a par contre un gros avantage sur celui de l'espace utilisateur: il dispose d'un accès direct au code et aux données de gestion de la mémoire virtuelle et des tables de pages, sans avoir besoin de passer par l'abstraction fournie par les appels systèmes pour l'espace utilisateur.

L'ancienne implémentation du tas gardé pour le noyau ne tirait pas parti de cette possibilité, et en plus, elle n'avait pas été synchronisée avec des évolutions faites dans son pendant en espace utilisateur. Par exemple, la version en espace utilisateur utilise MAP_NORESERVE pour indiquer des réservations d'espace d'adressage sans allocation de mémoire (overcommit), ainsi que l'utilisation de madvise pour libérer les pages mémoires qui ne sont plus utiles. Cela permet d'utiliser le tas gardé en mode "désactiver la réutilisation d'espace d'adresses" pendant assez longtemps, même avec beaucoup d'allocations/déallocations, surtout sur les machines avec un espace d'adressage 64-bit où il y a beaucoup de place. Le tas gardé du noyau est demeuré incapable de faire ce genre de chose, ce qui fait que, même sur un système 64-bit, il consommait assez rapidement tout l'espace d'adressage disponible. Pour couronner le tout, cette implémentation avait besoin de code spécifique dans les modules de gestion de la mémoire virutelle et des tables de pages, qui n'étaient pas implémentés sur les architectures non-x86.

Waddlesplash a donc pratiquement réécrit le tas gardé à partir de zéro, en reprenant l'ancien code seulement là où c'était pertinent et avec une nouvelle structure de suivi des allocations. La nouvelle implémentation s'interface directement avec les autres composants du noyau sans avoir besoin de points d'entrée spécifiques. Elle est capable de libérer la mémoire physique qui n'est plus utile, ce qui permet d'utiliser Haiku pendant quelques temps même avec le mode "désactiver la réutilisation de l'espace d'adressage" (il est maintenant possible dans ce mode de démarrer le bureau puis de lancer quelques compilations). Enfin, si le tas détecte un problème, le kernel panic qui se déclenche affiche maintenant des informations de diagnostic supplémentaires, le rendant aussi pratique que la version pour l'espace utilisateur: affichage de l'adresse de la zone mémoire concernée, mais aussi des informations sur le code qui l'a allouée et éventuellement libérée.

Contrairement à la version pour l'espace utilisateur, il est nécessaire de recompiler le noyau pour activer ce tas gardé. Ce n'est pas activé par défaut, mais il sera possible de fournir des builds spécifiques de Haiku à certains utilisateurs afin de voir s'ils détectent de nouveaux bugs, ou si cela peut aider à investiguer certains bugs déjà identifiés mais non expliqués (quelques rapports de bugs récents ont d'ailleurs motivé tout ce travail).

Applications

Tracker

Tracker est le navigateur de fichiers de Haiku. Il s'agit d'une des parties du code de BeOS qui avait été publié en logiciel libre lors de l'abandon de BeOS par Be inc. Ce code n'est pas aux standards de qualité actuels, le travail de Be datant en grande partie d'avant la standardisation du C++98, et il s'est passé beaucoup de choses depuis.

Jscipione continue d'améliorer le Tracker, à la fois en nettoyant le code, en corrigeant des bugs, et en ajoutant de nouvelles fonctionnalités. Chaque modification entraîne immanquablement son lot de régressions, qu'il faut ensuite corriger.

Ce trimestre, on trouve:
- la correction d'un crash dans les panneaux d'ouverture et d'enregistrement de fichiers,
- une amélioration du code de remplissage du menu des add-ons pour éviter de le regénérer à chaque clic de souris,
- l'affichage du menu "disques" dans le menu "rayon X" (menu permettant de naviguer rapidement dans les sous-dossiers) du bureau si l'option "montrer les disques" est activée,
- ajout des options "modifier la requête" et "fermer toutes les fenêtres du workspace" dans la fenêtre de requêtes,
- correction de raccourcis clavier qui ne fonctionnaient pas dans les fenêtres pour ouvrir et enregistrer des fichiers,
- correction d'une régression sur la détection d'intersection entre le curseur de la souris et les icônes.

Waddlesplash a corrigé les couleurs de fond des titres de colonnes dans la fenêtre principale et dans la fenêtre "Informations sur le fichier".

Madmax a également contribué une correction d'un crash lorsque des commandes de scripting (envoyées au Tracker par une autre application) sont utilisées en combinaison avec le type-ahead filtering (filtrage des fichiers visibles dans une fenêtre du Tracker en tapant une partie du nom au clavier).

Remote desktop

Haiku dispose d'un "bureau à distance" permettant de se connecter à une machine Haiku depuis un autre système. Il existe deux clients: l'un fonctionnant sur une autre machine Haiku, et l'autre sous forme d'une application web HTML5 affichant le bureau dans un canvas javascript. Cette dernière a été publiée à l'origine sous forme d'un poisson d'avril, mais les technologies web font que c'est finalement une solution tout à fait utilisable.

Anarchos a corrigé l'initialisation du curseur lors de l'ouverture d'une session de bureau à distance. Le curseur initial n'était pas celui de la machine distante, et cela se corrigeait uniquement lors du prochain changement de curseur au gré des déplacements de la souris.

AboutSystem

L'application AboutSystem affiche les noms de tous les développeurs participant au projet, les licenses de certains composants logiciels, ainsi que des informations sur la machine sur laquelle Haiku s'exécute (mémoire disponible, CPUdétecté, uptime, version du système).

Nipos a amélioré le calcul de la largeur minimale du panneau d'information dans AboutSystem, afin que le texte s'affiche sans retours à la ligne disgracieux quelles que soient la police de caractères choisie et sa taille.

MediaPlayer

MediaPlayer permet de lire les fichiers audio et vidéo.

Nipos a rectifié le choix de couleurs dans la liste de lecture pour qu'elle fonctionne mieux en mode sombre.

Icon-O-Matic

Icon-O-Matic permet d'éditer les icônes au format HVIF, un format compact qui permet de stocker des images complexes dans le peu d'espace disponible dans les inodes du système de fichiers. Ceci permet un affichage très rapide des icônes, même sur un support de stockage lent.

Nipos a désactivé le menu "supprimer" lorsqu'il n'y a aucune sélection à supprimer.

magnetProgramming a ajouté un message d'avertissement lors de l'export en SVG, si l'icône exporté utilise des dégradés de couleurs qui ne peuvent pas être représentés dans un fichier SVG.

WebPositive

WebPositive est le navigateur web de Haiku. Il est basé sur le moteur WebKit, qui est co-développé principalement par Apple, Igalia et Sony.

Correction d'un crash pouvant survenir au démarrage de l'application (PulkoMandy).

Devices

L'application Devices affiche les différents composants matériels présents sur la machine.

Affichage du nom complet des périphériques ACPI à la place de leur identifiant à 4 lettres, losqu'ils en ont un (PulkoMandy).

Terminal

Le terminal permet d'accéder à toutes les applications en ligne de commande.

Plusieurs améliorations par korli:

  • Ajout du texte "surligné" (avec une ligne au-dessus du texte)
  • Ajout de la commande DECRQM permettant aux applications de connaître l'état du terminal
  • Correction d'un bug dans la commande CSI REP qui permet de répéter plusieurs fois un caractère (utilisé par exemple pour tracer rapidement une ligne horizontale)

Nipos a amélioré la synchronisation entre le presse-papier interne du terminal et le presse papier système lors de l'ouverture de nouveaux onglets (le terminal implémente un presse-papier de sélection similaire à celui de X11).

TextSearch

TextSearch est un outil de recherche de texte, une version graphique de la commande grep.

humdinger a corrigé le fonctionnement des actions "Montrer dans le Tracker" et "Réduire à la sélection", et aussi ajouté un menu pop-up proposant les différentes actions possibles sur un résultat de recherche.

AutoRaise

AutoRaise permet de faire passer en avant-plan automatiquement une fenêtre qui devient active, après un délai, dans le cas du focus-follows-mouse.

L'icône d'AutoRaise dans la DeskBar se met à l'échelle en fonction de la taille de police d'affichage (nipos).

ShowImage

ShowImage est la visionneuse d'image de Haiku.

Correction de problèmes pour retourner à la première image d'un slideshow lorsqu'on atteint la fin, et inversement si on veut revenir en arière. Amélioration des messages d'erreurs lorsqu'une image ne peut pas être affichée (nipos).

Préférences d'horloge

Ce panneau de préférence permet de régler l'heure, la date, le fuseau horaire et de configurer la synchronisation NTP.

Correction d'un problème d'affichage du point central de l'horloge en mode sombre (PulkoMandy et nipos).

DriveSetup

DriveSetup est le gestionnaire de partitions disques.

Conversion de la fenêtre principale pour utiliser un "layout" dynamique afin de faciliter de futures modifications (PulkoMandy).

DiskProbe

DiskProbe est un éditeur hexadécimal.

Utilisation de "layout" dynamique pour les panneaux de l'éditeur, et correction de la couleur du texte en mode sombre à plusieurs endroits (nipos).

DeskCalc

DeskCalc est une calculatrice, utilisable dans une fenêtre ou bien sous forme d'un "replicant" attaché sur le bureau.

DeskCalc enregistre sa couleur seulement si ce n'est pas celle par défaut. Cette fonctionnalité permet de recolorer la calculatrice, mais de la garder de la même couleur que les autres applications si on a pas demandé une couleur spécifique (nipos).

ActivityMonitor

ActivityMonitor permet d'afficher des graphiques à partir de toutes sortes d'informations sur le système.

Affichage de la température du système récupérée via le pilote acpi_thermal s'il est disponible (PulkoMandy).

Installer

Cette application permet d'installer Haiku en effectuant un clonage d'un système existant vers une nouvelle partition.

Dans certains cas, le bouton "Quitter" à la fin de l'installation était incorrectement appelé "Commencer" (nipos).

Playground

Playground est une application de démonstration permettant d'expérimenter la plupart des contrôles de l'interface de Haiku (boutons, cases à cocher, …).

Amélioration du calcul de la taille des barres de défilement (nipos).

Outils en ligne de commande

La commande iroster, permettant d'activer et désactiver les périphériques d'entrée, a maintenant une option --help affichant un petit mode d'emploi (OscarL).

Le service cddb_lookup, permettant de récupérer les titres des pistes sur les CD audio, ne fait plus sa requête DNS pour localiser le serveur CDDB dès le démarrage du système. Il attend maintenant qu'un CD audio soit inséré avant de le faire, ce qui réduit une possibilité d'identifier le système par son traffic réseau (nipos).

Dans le gestionnaire de paquets pkgman, ajout d'une option --show pour sélectionner certains champs à afficher (par exemple: pkgman coreutils --show provides), ce qui peut être utilisé dans des scripts d'analyse des dépôts de paquets - la commande package disposait déjà de certaines fonctions, mais n'est utilisable qu'avec les paquets disponibles localement sur la machine (OscarL et PulkoMandy).

Dans la commande sysinfo, ajout des foncionnalités des processeurs remontées dans la "leaf 7" de l'instruction CPUID, comme, par exemple, la disponibilité des jeux d'instructions AVX2 et AVX512.

Kits

Les "kits" sont les composants de la bibliothèque standard de Haiku. Ils regroupent chacun un ensemble de classes C++ (et quelques fonctions C) qui sont fonctionnellement proches.

Application Kit

L'application kit implémente les bases des applications Haiku: boucles d'évènements, envoi et réception de messages.

Meilleure gestion du débordement des numéros de token pour les BHandler. BHandler est la classe qui permet de recevoir et de traiter des messages (via la fonction MessageReceived). Chaque instance se voit attribuer un numéro identifiant sur 31 bits (un entier signé 32 bits, dont les valeurs négatives servent à indiquer des erreurs). Si, au cours de l'exécution du système, plus de 2 milliards d'instances sont crées, la valeur de l'identifiant déborde et devient négative (X512).

Interface Kit

L'interface kit regroupe toutes les APIs pour l'affichage de fenêtres à l'écran.

Optimisation de BView::Invalidate(). Cette fonction permet de demander au serveur graphique de déclencher le ré-affichage d'une partie d'une vue. Cette opération est relativement coûteuse puisque elle nécessite une communication entre l'application et le serveur graphique. L'optimisation consiste à détecter dans le code s'exécutant dans l'application, avant toute communication avec le serveur, si la zone à réafficher est visible à l'écran, ou si, par exemple, la fenêtre est cachée, ou la zone concernée n'est pas visible parce qu'une barre de défilement l'a déplacée hors de l'écran. Dans ce cas, il n'est pas nécessaire de déclencher une communication avec le serveur graphique. Ces optimisations avaient d'abord été réalisées dans la classe BColumnListView mais elles peuvent être généralisées à toutes les vues (waddlesplash).

Amélioration du choix de couleur pour BSlider (contrôle permettant de sélectionner une valeur en déplaçant un bouton sur une ligne horizontale ou verticale), pour donner de meilleurs résultats en mode sombre ou avec des thèmes de couleur très personnalisés (jscipione). Nephele a effectué des changements similaires dans du code plus générique (au niveau de la classe BControlLook qui définit l'apparence globale de Haiku et permet d'implémenter des thèmes différents allant au-delà d'un simple changement de couleurs). Toujours dans la catégorie de l'amélioration du mode sombre, nipos a sélectionné une meilleure couleur pour le texte "<empty>" s'affichant lorsqu'on ouvre un menu ne comportant aucun élément.

Changement du format de stockage des régions (une liste de rectangles décrivant une zone arbitraire de l'écran ou d'un autre espace de coordonnées) dans BPicture (une classe permettant d'enregistrer des opérations de dessin pour les reproduire ailleurs ou plus tard). Le format utilisé était incompatible avec celui de BeOS, ce qui pose des problèmes à certaines applications qui utilisent des "pictures" pré-enregistrées. Et en plus, il était moins performant, donc il n'y avait pas de raison de le conserver (X512).

Ajout d'un effet de surbrillance (discret) lorsqu'un BMenuField (liste déroulante) est survolé par la souris, comme c'était déjà le cas pour les boutons (nipos).

Dans BColumnListView, rectification de la position des barres de défilement après la suppression de lignes. Le bug était particulièrement visible dans l'application HaikuDepot (apl).

X512 a entrepris de nettoyer le code permettant l'interfaçage entre l'Interface Kit et app_server:
- regroupement des méthodes dans un ordre plus logique dans le fichier source,
- optimisation de l'envoi de BRegion,
- correction d'un problème dans l'envoi de BAffineTransform qui envoyait tout l'objet C++ (avec sa vtable) au lieu de seulement envoyer la matrice de transformation,
- ajout d'identifiant d'écran là où c'est nécessaire pour un véritable support de l'affichage sur plusieurs écrans,
- retravail de la gestion de mémoire partagée entre le serveur graphique et les applications, afin de garder un comptage de références et une map de ces zones de mémoire gérée entièrement par le serveur graphique (sans risque de fuite de la mémoire si une application plante, par exemple). Cela améliore également les performances en réduisant la communication nécessaire entre les applications et le serveur.

Synchronisation de FlatControlLook (un thème d'apparence "plat", avec moins de dégradés que le thème par défaut) avec le code de BeControlLook (ledit thème par défaut) suite aux modifications effectuées précédement pour simplifier et uniformiser les calculs de couleurs du thème (waddlesplash).

Correction d'une confusion dans la gestion des raccourcis claviers pour les menus. Historiquement, les menus ont forcément un raccourci qui implique la touche "CMD" (Alt) du clavier ou bien un autre modifieur. Une extension de l'API permet de définir des raccourcis n'utilisant aucun modifieur (par exemple, F2 tout seul pour renommer un fichier, F1 pour afficher de l'aide, …). Le code permettant de traiter ce cas n'était pas tout à fait correct, ce qui déclenchait un certain nombre de comportement étranges ou parfois même de plantages en particulier dans Tracker (waddlesplash).

Waddlesplash et X512 ont également corrigé un problème dans le cas de l'envoi d'une BRegion vide ne comportant aucun rectangle , ce qui n'était pas traité correctement et causait entre autre des problèmes d'affichage dans l'application de dessin Wonderbrush.

Nipos a corrigé des artefacts graphique qui pouvaient apparaître lors du redimensionnement d'un contrôle "barber pole" (barre de progression sans fin).

Locale Kit

Le Locale kit implémente tout ce qui est nécessaire à la localisation et l'internationalisation du système.

humdinger a modifié de BDate::LongDayName() pour afficher le nom complet des jours et pas une abbréviation sur 3 lettres (le bug était simplement causé par une erreur d'interfaçage avec ICU).

Pilotes matériels

Intel_extreme (composants graphiques Intel)

Ajout des composants graphiques pour les porcesseurs Intel de génération "Apollo Lake" (Habbie).

usb_disk (stockage de masse USB)

Deux améliorations de la part de waddlesplash:

  • Correction de l'ordre de verrouillage: acquisition de la mémoire I/O avant de verrouiller le lock correspondant afin d'éviter un problème d'inversion de verrous.
  • Utilisation de l'ordonnanceur d'entrées-sorties générique, qui permet de réordonner et de regrouper les demandes d'accès disque et de mieux gérer les opérations asynchrones. Cela corrige au moins un KDL (kernel panic) et améliore la fluidité du système lorsqu'il fonctionne sur un disque USB lent (par exemple en mode live USB, souvent utilisé pour avoir une première impression de Haiku).

XHCI (USB3) et EHCI (USB2)

Lorsque c'est possible (en fonction des contraintes du contrôleur DMA), utilisation directe des zones de mémoire fournies par les pilotes de périphériques USB au lieu de passer par un "bounce buffer". Ce changement combiné avec les modifications du pilote usb_disk devrait réduire le nombre de copies intermédiaires de données pour les accès disque en permettant au pilote USB de transférer les données directement vers et depuis le cache disque (waddlesplash). Cependant, il manque encore une pièce du puzzle pour vraiment tirer partie de cette optimisation: dans cette configuration, l'ordonnanceur d'entrées-sorties n'est pas informé des contraintes réelles du contrôleur DMA. Il ne peut donc pas organiser ses requêtes de façon à ce qu'elles puissent systématiquement utiliser ce chemin d'exécution plus rapide. C'est pénalisant en particulier pour EHCI, dont le contrôleur DMA est plus limité.

Couche de compatibilité FreeBSD et OpenBSD

Haiku réutilise les pilotes réseau de FreeBSD et OpenBSD via une couche de compatibilité.

Waddlesplash a amélioré la compatibilité avec les pilotes USB de FreeBSD dans le but de remplacer certains pilotes USB développés spécifiquement pour Haiku par les équivalents venant de FreeBSD. Pour l'instant, les nouveaux pilotes ne fonctionnent pas ou bien il n'y a personne en mesure de les tester, puisque les anciens fonctionnent très bien, ce n'est pas la priorité des utilisateurs.

Dans la couche de compatibilité OpenBSD, rectification du comptage des paquets réseaux envoyés, qui ne fonctionnait pas (waddlesplash).

Refonte de l'interfaçage du bus réseau MII avec les pilotes réseau, ce qui ouvre la voie à l'utilisation des pilotes OpenBSd et FreeBSD pour des périphériques déclarés dans un device tree FDT, plutôt que découverts via les bus PCI ou USB (waddlesplash).

TTY (ports série et terminaux virtuels)

Correction de la notification de déconnexion via select() lorsqu'un TTY est fermé. Cela corrige un problème lorsqu'on tue un Terminal, où les programmes lancés à l'intérieur ne s'arrêtaient pas et restaient bloqués (waddlesplash).

C-States (économie d'énergie du CPU)

Le pilote C-State affiche un message d'erreur lorsqu'il ne peut pas s'exécuter en indiquant pour quelle raison (par exemple s'il n'a pas trouvé de processeur compatible). Cela permet d'identifier les machines qui pourraient avoir besoin d'un autre pilote pour l'économie d'énergie, ou de compléter le pilote C-States si nécessaire.

ACPI C-States

Waddleplash a mis à jour le module CPU idle "ACPI C-States" qui était à l'abandon au moins depuis 2013 pour s'interfacer avec les versions actuelles des modules ACPI et CPU. Cela a demandé un gros travail non seulement pour la mise à jour mais aussi pour le déboguage de ce module, qui ne fonctionne toujours pas correctement sur le matériel qui a pu être testé. Il reste donc pour l'instant désactivé.

Contrairement au module C-States ci-dessus, celui-ci n'accède pas directement au matériel mais passe par ACPI. Cela lui permet en principe de fonctionner sur des machines anciennes ne disposant pas d'une interface matériel standardisée pour le contrôle des C-States et de la mise en veille du processeur.

USB-RNDIS

Ce pilote permet l'utilisation du "tethering" USB (partage de connection réseau via USB) avec la plupart des téléphones Android. Amélioration des messages de log et de la gestion des erreurs, dans le cadre d'investigations en cours pour comprendre pourquoi le pilote ne fonctionne plus après avoir débranché puis rebranché le câble USB (PulkoMandy).

NVMe (SSD)

Support d'adresses de blocs logiques sur 64 bits, permettant d'utiliser des disques de plus de 2 To (korli).

SDHCI (lecteurs de cartes SD)

Correction de la gestion des interruptions en utilisant une ConditionVariable en remplacement de sémaphores et correction de divers autres problèmes (PulkoMandy).

Détection des contrôleurs SDHCI ACPI en utilisant le CID standard "PNP0D40" au lieu d'une liste de HID spécifiques (SED4906).

acpi_termal (sondes de température)

Implémentation de B_GET_DEVICE_NAME pour récupérer le nom de la zone thermique dont la température est reportée (PulkoMandy).

Systèmes de fichiers

FAT

FAT est un système de fichier développé par Microsoft, souvent utilisé aujourd'hui pour les support amovibles (clés USB, cartes SD) en raison de sa simplicité et de son support dans à peu près tous les systèmes.

Jim906 a ajouté le support des disques avec des secteurs logiques de plus de 512 octets dans le pilote FAT. Cela reste quelque peu hypothétique car la plupart des périphériques de stockage continuent à fonctionner avec des secteurs de 512 octets, bien qu'ils utilisent en interne des zones beaucoup plus larges.

ext2/3/4

Les systèmes de fichiers ext2, 3 et 4 sont utilisés par défaut sous Linux. La structure des données sur le disque est très simialire entre les 3 versions, ce qui permet de supporter ces trois versions avec un seul pilote.

Korli a retiré la gestion des listes d'orphelins dans le pilote ext2/3/4. Cette fonctionnalité permet en principe de stocker des fichiers qui ont été unlink (plus présents dans auncun dossier du disque) mais pas encore supprimés (par exemple parce qu'ils sont encore ouverts par une application). Cette fonctionnalité semble obsolète: le pilote de FreeBSD ne l'implémente pas non plus, et ces fichiers peuvent très bien être gérés sans une structure de données spécifique stockée sur le disque. Dans ce même pilote, korli a également rectifié le décomptagee des blocs libres et utilisés lorsqu'un noeud est élargi ou rétréci.

NFS

NFS est un système de fichier en réseau, permettant donc à un serveur de rendre accessible ses fichiers à plusieurs autres machines. Haiku implémente actuellement uniquement la partie client, pour monter et accéder aux fichiers d'une autre machine.

Jim906 continue à améliorer le pilote NFS4:

  • Ajout d'informations de debug et de diagnostic (à activer lors de la compilation),
  • Améliorations du traitement des "délégations" de fichiers, qui provoquaient auparavant un kernel panic ou de très nombreuses erreurs dans les logs.
  • Ajout d'un verrou pour empêcher la destruction d'une ConditionVariable pendant son utilisation par un autre thread.

ramfs

Ramfs est un système de fichier qui stocke les fichiers directement dans la mémoire RAM. Contrairement à un "RAM disk", il n'a pas besoin de simuler un "block device" et peut allouer et libérer de la mémoire dynamiquement en fonction des besoins. Cela le rend peu gourmand et très rapide. Il est donc utilisé pour stocker des fichiers temporaires.

Nettoyage et correction de bugs dans la gestion de l'index des attributs étendus de ramfs. Le résultat est un système de fichier plus fiable, légèrement plus rapide, ainsi que l'ajout d'assertions pour détecter d'autres problèmes du même type s'ils devaient survenir (waddlesplash).

Retrait de vérifications inutiles de pré-conditions déjà garanties par le VFS, déplacement de vérifications du système de fichier dans le VFS afin que tous les systèmes de fichiers puissent en bénéficier, et au passage, harmonisation des codes de retour de différents systèmes de fichiers pour certaines erreurs (waddlesplash).

VFS

Le VFS (virtual filesystem) est le composant de Haiku qui permet l'accès à tous les systèmes de fichiers sous forme d'une unique hiérarchie de répertoires. Il regroupe tout le code commun à tous les systèmes de fichiers afin de réduire la complexité de ces derniers, et de s'assurer que le comportement des fichiers est similaire, même si le stockage peut être très différent.

Correction d'une incohérence sur la gestion de la racine de chaque système de fichier monté. Le VFS (le code qui gère les systèmes de fichiers) repose sur le principe du comptage de références pour savoir quels fichiers et dossiers doivent être maintenus en mémoire. Une supposition dans ce code est que chaque système de fichier maintient une référence sur son dossier racine, mais il n'y avait aucune vérification que c'était bien le cas, et la plupart des systèmes de fichiers ne le faisaient pas. Le problème a d'abord été identifié par korli dans le pilote ext2/3/4. Waddlesplash a ensuite ajouté des vérifications supplémentaires dans le VFS pour détecter ce cas ainsi que d'autres problèmes de comptage de références. Enfin, waddlesplash, jmairboeck, OscarL et Jim906 ont corrigé tous les autres systèmes de fichiers qui présentaient le même problème.

Ajout dans le VFS d'implémentation "de secours" pour certaines opérations: si le système de fichier ne les implémente pas directement, le VFS fournit une implémentation par défaut moins performante. Cela simplifie l'écriture du système de fichier, en particulier pour ramfs où il n'y a pas d'implémentation plus rapide possible (waddlesplash).

Autres

Ajout d'un périphérique /dev/full, qui répond qu'il est plein lorsqu'on essaie d'écrire dedans. Linux et FreeBSD disposent d'un tel périphérique et il est utile pour certains tests. L'implémentation a été l'occasion de fusionner le code des pilotes /dev/null et /dev/zero avec ce troisième périphérique, car ils sont tous les trois très simples et très similaires (korli).

Ajout de vérification d'erreurs dans les systèmes de fichiers "overlay" (attribute_overlay, log_overlay et write_overlay). Ces systèmes de fichiers permettent de rajouter des fonctionnalités à un autre système de fichier: respectivement la gestion des attributs étendus, un log de toutes les opérations effectuées, et le support de l'écriture. Deux d'entre eux sont notamment utilisés dans certaines configuration de démarrage sur un live CD (le système de fichier ISO9660 étant en lecture seule et sans gestion des attributs étendus). Les erreurs qui n'étaient pas traitées pouvaient déclencher un kernel panic, alors que ce sera désormais un simple message d'erreur dans les logs.

libroot

La libroot regroupe les fonctions C standard, les fonctions POSIX, et quelques extensions spécifiques à BeOS et Haiku. Elle est l'équivalent des libc, libm, et libpthread sous Linux.

Ajout de macros dans sys/time.h pour les conversions entre les structures timeval et timespec, compatibles avec les macros proposées par Linux et FreeBSD (Habbie).

Correction de la définition des macros CPU_* dans le fichier sched.h. D'une part, elles n'étaient pas tout à fait indentiques à celle de la glibc, et d'autre part, elles n'étaient pas compatibles avec les anciennes versions du standard C, ce qui posait un problème pour porter certains logiciels (korli).

Mise en conformité avec POSIX 1-2024

La spécification POSIX a reçu une nouvelle version, et Haiku implémente petit à petit toutes les nouvelles fonctionnalités et changements apparus dans cette nouvelle version.

  • Ajout de WCOREDUMP dans sys/wait.h (jmairboeck).
  • Ajout de l'option IPV6_ONLY pour les sockets (korli).
  • Mise à jour de la famille de fonctions strftime() à partir de la version de la librairie C musl (korli).
  • Ajout de macros supplémentaires dans complex.h (korli).

Correction d'un double-free dans un cas particulier dans l'implémentation de select() (waddlesplash).

Correction d'une fuite de référence à un groupe de processus lors du traitement des signaux, et ajout de vérifications de l'état de la "team" (processus) dans setpgid() (korli).

Noyau

Nettoyage de code pour la configuration des timers APIC et la détection de fonctionnalités de certains vieux processeurs AMD (waddlesplash).

Utilisation des instructions MWAITX (pour les processeurs AMD) ou TPAUSE (processeurs Intel) dans la boucle d'attente du debugger noyau. Dans ce cas particulier, les interruptions sont désactivées, donc les mécanismes habituels pour attendre (comme l'instruction HLT) ne peuvent pas être utilisés. Sur une machine équipée d'un Ryzen 3700X, la réduction de consommation électrique est d'environ 35 Watts, à comparer à une réduction de 54 Watts par la gestion d'énergie classique de Haiku lorsque le noyau fonctionne normalement. Ce n'est pas aussi bon que ce qu'arrive à faire Windows sur cette même machine, sans surprise puisque la gestion d'énergie dans Haiku est loin d'être complètement prise en charge (waddlesplash).

Au passage, waddlesplash a également optimisée la boucle d'attente spin(), utilisée dans le noyau pour implémenter un court délai lorsque les interruptions sont désactivées. Une instruction de sosustraction a pu être déplacée hors de la boucle principale de cette fonction.

Modification de l'implémentation de l'allocateur mémoire interne du kernel pour mieux détecter certaines erreurs en particulier lorsque KDEBUG est activé (c'est le cas pour les nightly builds de Haiku). L'allocateur recycle les blocs libéré pour de nouvelles allocations lorsque c'est possible, mais en mode KDEBUG, il essaie de conserver les blocs le plus longtemps possible dans la liste des blocs libérés, et réutilise d'abord les plus anciens. Cela augmente la probabilité de détecter si un bloc est encore utilisé après sa libération (et avant son recyclage pour une nouvelle allocation). Cela a déjà permis d'identifier au moins un nouveau bug (waddlesplash).

Correction de crashs dans certaines utilisations inhabituelles de recvmsg et sendmsg, et ajout de programmes de test pour reproduire facilement ces cas de figure (waddlesplash).

Correction d'une petite erreur dans l'implémentation de ConditionVariable qui pouvait dans certains cas très particuliers, réveiller incorrectement trop de threads attendant une notification. La conséquence du bug était seulement une dégradation des performances (PulkoMandy).

Amélioration d'une assertion pour détecter l'accès à de la mémoire libérée dans l'allocateur "slab" du noyau (waddlesplash).

Ajout d'un "return" manquant dans un cas d'erreur dans la gestion des sockets, qui pourrait être la cause de plusieurs kernel panics remontés récemment par des utilisateurs (waddlesplash).

Ajout d'un nouveau mécanisme de découverte de l'adresse du point d'entrée SMBIOS, en utilisant les EFI boot services. Ce changement ajoute également la possibilité de transmettre des informations arbitraires entre le bootloader et le noyau, de façon à pouvoir démarrer un ancien noyau avec un bootloader récent, ou inversement, lorsque de nouveaux paramètres sont ajoutés (korli).

Amélioration de la commande rwlock du debugger noyau pour afficher les threads ayant verrouillé le lock en lecture. Ceci est possible seulement si l'option KDEBUG_RW_LOCK_DEBUG est activée, ce qui n'est pas le cas par défaut car l'option a un trop gros coût en performances (waddlesplash).

Ajout également d'assertions liées aux verrous dans la gestion de la mémoire virtuelle et dans le VFS. Ces modifications ont ensuite permis de trouver et de corriger un double verrouillage en lecture (waddlesplash).

Ajout d'assertions pour s'assurer que l'allocation de zones de mémoire "early boot" n'échoue jamais. Ce changement a été initié suite au travail sur le tas gardé, pour lequel il aurait été bien utile. Mais il a aussi permi de détecter un gros problème dans la version ARM64 de Haiku, qui pourrait expliquer que cette version plante très tôt pendant le démarrage suite à un changement dans la carte mémoire du bootloader (waddlesplash).

Correction d'une libération de mémoire mal assortie (allocation avec un mécanisme, mais libération avec un autre) dans le VFS, qui déclenchait une assertion et donc un KDL (waddlesplash).

Retravail de la fonction de découpage de zones mémoire (cut_area) pour mieux traiter des cas particuliers avec des zones qui étaient partagées entre plusieurs processus, mais ne le sont plus suite au découpage (waddlesplash).

Système de compilation

smrobtzz a modifié la compilation de unzip pour ajouter l'option -std=c99, en effet, les sources utilisées sont anciennes et ne compilent pas avec les dernières versions du standard C, en particulier celle utilisée par défaut dans GCC 15.

X512 a retiré les permissions +x sur certains fichiers du dépôt git qui n'en avaient pas besoin.

PulkoMandy a fait du nettoyage dans les règles de compilations pour retirer certaines dépendances optionnelles qui ne sont en fait jamais utilisées.

jscipione a corrigé la compilation croisée depuis les dernières versions de macOS.

waddlesplash a corrigé plusieurs problèmes de compatibilité avec clang (le code de Haiku est habituellement compilé avec GCC).

Documentation

PulkoMandy a corrigé plusieurs problèmes de syntaxe Doxygen dans la documentation de l'API, et ajouté un nouveau chapitre documentant la classe ConditionVariable et son utilisation dans le noyau.

Commentaires : voir le flux Atom ouvrir dans le navigateur

  •  

Haiku a 24 ans - nouvelles de l'été 2025

Haiku est un système d’exploitation pensé pour les ordinateurs de bureau. Il est basé sur BeOS mais propose aujourd’hui une implémentation modernisée, performante, et qui conserve les idées qui rendaient BeOS intéressant: une interface intuitive mais permettant une utilisation avancée, une API unifiée et cohérente, et une priorisation de l’interface graphique par rapport à la ligne de commande pour l’administration du système.

Le projet est actuellement (depuis 2021) en phase de beta test. La plupart des fonctionnalités sont implémentées et l’attention des développeurs se porte sur la correction de bugs, l’amélioration de la stabilité et des performances, et plus généralement, les finitions et petits détails. Une autre part du travail est le suivi de l’évolution de l’environnement technologique: nouveaux pilotes de périphériques, suivi des derniers standards du web, etc.

Les trois derniers mois ont été un peu plus calmes que d’habitude pour Haiku, mais cela est largement compensé par une très forte activité du côté de Haikuports. Cela révèle que le système lui-même devient plus mature et qu’il devient de plus en plus facile de développer ou de porter une application sans tomber sur des problèmes du système qui doivent être corrigés au préalable.

Sommaire

Applications

Tracker

Tracker est le navigateur de fichiers de Haiku. Le code est hérité directement de BeOS (cette partie avait été publiée sous licence libre lors de l’abandon de BeOS par Be) et fait l’objet depuis de nombreuses années d’un gros travail de nettoyage et de modernisation.

Pas de grosses nouveautés ces derniers mois, mais des corrections pour plusieurs régressions suites à du nettoyage effectué précédemment. Par exemple, les icônes des disques montés sont à nouveaux affichés sur le bureau dans les dialogues d’ouverture et d’enregistrement de fichiers. L’annulation du filtrage du contenu d’un dossier en tapant un nom de fichier partiel est correctement annulé si on appuie sur échap.

Enfin, des problèmes de synchronisation de l’icône de la poubelle, qui apparaissait pleine alors qu’elle était vide, ont été corrigés. Ces problèmes étaient déjà présents dans BeOS.

Terminal

Le terminal permet de lancer des applications en ligne de commande.

Un chantier en cours consiste à rendre le terminal utilisable comme un “replicant”, c’est-à-dire de pouvoir l’intégrer dans d’autres applications telles que l’IDE Genio. Cette approche demande de restructurer beaucoup de choses, et pour l’instant, il est plus simple pour les développeurs de Genio de recopier une partie des sources du Terminal dans leur projet et de les intégrer de façon plus statique. Les problèmes sont corrigés petit à petit.

Une autre correction mérite d’être mentionnée: le terminal se plaçait lui-même dans le dossier de travail du shell lancé lors de l’ouverture d’un nouvel onglet. Si ce dossier se trouve dans un disque qu’on essaie par la suite de démonter, le démontage échoue (même si l’application lancée dans le terminal a elle-même changé de dossier entretemps). Désormais le terminal ne modifie pas son dossier actif et ne bloque plus le démontage des disques.

Mail

L’application Mail permet de lire et d’envoyer du courrier électronique. Elle est composée d’un serveur de synchronisation et d’une interface graphique indépendante. Entre les deux, les mails sont stockés sous forme de fichiers augmentés d’attributs étendus, ce qui permet d’utiliser Tracker et les requêtes BFS comme outil principal pour traiter les messages.

Les changements listés ici concernent l’application de lecture et rédaction de messages:

  • Correction du comportement du menu « Fermer et marquer comme… » lorsqu’il est appliqué à plusieurs messages.

    • Modifications pour éviter de montrer des informations vides, en double, ou absentes dans les détails des adresses mail (nom d’expéditeur, de destinataire, etc).

HaikuDepot

HaikuDepot est à la fois le gestionnaire de paquets et le magasin d’applications de Haiku. Ce double rôle conduit pour l’instant à une interface qui prête un peu à confusion, et l’interface devrait être repensée pour un fonctionnement plus intuitif. En attendant, quelques petites améliorations ont tout de même été faites pour rendre les problèmes moins gênants.

Lorsqu’une recherche dans la vue « paquets mis en avant » ne donne aucun résultat, il y a affichage d’un lien permettant de poursuivre la recherche dans la liste complète des paquets. En effet, de nombreux utilisateurs se sont plaints de ne pas trouver certains logiciels en effectuant une recherche, sans se rendre compte qu’ils faisaient une recherche dans une liste de quelques dizaines de paquets et pas dans tout ce qui est disponible.

TextSearch

TextSearch est un outil de recherche dans le contenu des fichiers par expressions régulières (une version graphique de grep).

Il reçoit ce trimestre une fonction pour filtrer les fichiers à rechercher, équivalent à l’option grep --include.

Debug Analyzer

Debug Analyzer est un outil de profiling et d’analyse de traces d’exécution.

Correction d’un problème de compilation suite à des changements dans l’API de BObjectList (cet outil n’est pas compilé par défaut, il avait donc été oublié lors du changement d’API au trimestre précédent).

Préférences d’apparence

Dans la configuration des couleurs du système, renommage de la couleur « barre d’état » en « barre de progression ». Le nom « barre d’état » (status bar en anglais) correspond à la classe BStatusBar utilisée par BeOS et Haiku, mais tout le monde appelle ça une barre de progression. On peut au moins éviter la confusion pour les utilisateurs, à défaut de pouvoir le faire pour les développeurs d’applications en renommant la classe elle-même (ce qui causerait des problèmes de compatibilité d’API et d’ABI).

Utilisation de IconMenuItem

Ce changement concerne l’application ShowImage (visualiseur d’images) ainsi que FileTypes (les préférences d’association de types fichiers avec des applications). Ces deux applications utilisent un menu pour sélectionner une application (pour ouvrir une image dans un éditeur, ou pour associer un type de fichier à une application, respectivement).

Les applications pour Haiku utilisant des icônes colorées et facilement identifiables, c’est beaucoup mieux qu’une liste de noms pour s’y retrouver rapidement. Ces deux applications utilisent donc maintenant des IconMenuItem dans ces menus, pour afficher les applications avec leur icône respective.

Adaptation aux écrans à très haute réolution

Un travail en cours sur les applications concerne l’adaptation aux écrans à très haute résolution.

Presque toutes les applications pour Haiku utilisent un système de mise en page dynamique, et toutes les ressources (police de caractères, icônes…) sont vectorielles. Cela permet en théorie d’afficher l’interface avec un niveau de zoom arbitraire. Cependant, une partie du code a été écrit avec des tailles en pixels « en dur » et ne s’adapte pas comme il faudrait (la bonne façon de faire est de se baser par exemple sur la taille de la police de caractères sélectionnée par l’utilisateur).

Ce trimestre, on trouve des évolutions à ce sujet dans plusieurs applications:

  • Expander (décompression d’archives)
  • SerialConnect (communication par port série)
  • Mise à l’échelle de la barre de défilement
  • Préférences d’imprimantes
  • Mise à l’échelle des icônes

Outils en ligne de commande

Remote Desktop

L’outil de connexion au bureau à distance n’est pas vraiment une application en ligne de commande. Cependant, il nécessite pour l’instant un lancement depuis un terminal avec les bonnes options, et selon les cas, la mise en place d’un tunnel SSH. Une interface grapique plus simple d’uitlisation sera probablement ajoutée plus tard.

  • Amélioration du parsing de la ligne de commande et en particulier de l’option pour choisir un port SSH
  • Activation de l’option SO_REUSEADDR permettant de plus facilement relancer l’outil s’il plante, sans attendre un timeout de la connexion précédente qui n’a pas été fermée proprement

Time

Le panneau de préférences de date et heure peut être lancé en ligne de commande avec une option spécifique pour forcer une synchronisation NTP. Cette fonctionnalité n’est pas vraiment documentée, à l’origine il s’agit plutôt d’une astuce interne au système. L’application reconnaît maintenant l’option --help standardisée et affiche un message d’aide qui documente cette fonctionnalité.

Il peut être utile de relancer cette commande manuellement si jamais la synchronisation au démarrage n’a pas fonctionné (par exemple si le réseau n’était pas disponible à ce moment-là). En particulier, cela peut être utilisé dans des scripts d’automatisation et pour des machines où l’interface graphique n’est pas facilement accessible (serveurs de build par exemple).

pkgman

pkgman est une commande permettant d’installer, mettre à jour et rechercher des paquets logiciels.

Ajout d’une option --no-refresh pour ne pas retélécharger la base de données des paquets.

Cette base de données contient non seulement les noms des paquets, mais aussi leur description courte et la liste des “provides” (par exemple: commandes et bibliothèques fournies par chaque paquet). pkgman vérifié déjà si une nouvelle version de la base de données est disponible, mais cette dernière peut être mise à jour plusieurs fois par jour par l’intégration continue.

Le nombre de paquets augmentant, la taille de la base de données devient non négligeable (plusieurs méga-octets), ce qui pose problème en particulier pour les utilisateurs et développeurs ne disposant pas d’un accès internet illimité.

su

La commande su est peu utilisée puisque l’utilisateur par défaut a déjà tous les droits. Son implémentation était donc un peu incomplète. Elle peut toutefois être utile pour avoir des utilisateurs supplémentaires restraints, par exemple pour un accès à distance par ssh.

  • La commande su ne demande pas de mot de passe si l’utilisateur dispose déjà de l’accès root
  • Toutes les commandes liées à la gestion des utilisateurs (su, login…) configurent les groupes actifs lors du changement d’utilisateur

listarea

listarea est une commande de debug permettant de lister les zones mémoire allouées à différentes applications. Elle affiche maintenant le verrouillage et les protections de ces zones (swappable ou non, exécutabele ou non, accessible en écriture ou non).

fdinfo

fdinfo permet d’examiner les descripteurs de fichiers ouverts (un peu comme lsof). Cette commande peut maintenant afficher en plus le dossier courant de chaque application (ce qui aurait été bien utile pour identifier le problème avec le dossier courant du Terminal ci-dessus).

install-wifi-firmwares

Ce script permet d’installer les firmwares pour certaines très anciennes cartes Wifi. Les firmwares publiés à l’époque sont disponibles avec des licenses n’autorisant pas la redistribution ou les modifications de packaging, ce qui empêche l’intégration dans le système de paquets habituel. Le problème a été corrigé depuis longtemps par les fabricants de cartes Wifi, mais les anciens firmwares n’ont jamais été republiés avec des licenses mises à jour.

Le script a été mis à jour pour récupérer certains firmwares depuis un nouveau serveur, l’ancien emplacement utilisé n’étant plus disponible.

Kits

La bibliothèque de fonctions de Haiku est découpée en kits qui regroupent des ensembles de fonctions et de classes par thématique (stockage sur disque, interface graphique…). Dans certains cas il s’agit principalement d’une méthode d’organisation du code source et de la documentation (les kits pouvent être très interdépendants). Certains kits sont toutefois fournis sous forme de bibliothèques séparées.

Support kit

Ce kit contient diverses fonctions utilitaires et basiques du système.

Changement d’API pour la classe BUrl. Dans l’ancienne version de cette classe, il était possible de construire un objet BUrl représentant une URL encodée ou non-encodée (échappement des caractères réservés). Cela rendait trop facile d’oublier d’encoder une URL avant de l’utiliser, ou bien d’encoder plusieurs fois une URL et de se retrouver avec un lien invalide.

La nouvelle API impose d’indiquer dès la création d’un objet BUrl si la chaîne de caractères servant de base est déjà encodée ou non. L’objet BUrl construit représentera toujours une URL déjà encodée, qui peut éventuellement être décodée pour affichage si nécessaire.

Interface kit

Ce kit contient tout ce qui se rapporte à l’interface graphique: fenêtres, vues, contrôles, mise en page…

Retour en arrière sur une modification des raccourcis claviers de BTextView pour naviguer vers les mots suivant et précédent. Les nouveaux raccourcis entrent en conflit avec des raccourcis déjà utilisés par plusieurs applications, et n’apportaient pas grand-chose.

Correction de problèmes de compatibilité dans le format des données stockées par la classe BPicture (il s’agit d’un enregistrement de commandes envoyées au serveur graphique, qui peuvent être rejouées plus tard). Le format des données stockées était différent de celui de BeOS. Certaines applications utilisant un objet BPicture enregistré dans une ressource de l’application, ne s’affichaient pas correctement.

Amélioration de la gestion des sous-menus, en particulier cela corrige un crash si un sous-menu est fermé en utilisant la touche échap.

Remise à plat de tous les calculs accumulés au cours des années pour générer les couleurs de l’interface graphique en fonction des couleurs choisies par l’utilisateur. Chaque morceau de code concernait faisait ses propres calculs pour générer de jolis dégradés, des variantes plus sombres et plus claires, etc. Cela fonctionnait bien avec le thème par défaut, mais pas forcément avec des choix de couleurs qui en sont très éloignés. Le nouveau code est plus simple, plus prédictible, et permet de rassembler ces calculs dans la classe « control look », qui peut être remplacée par un add-on pour fournir une apparence complètement différente.

Cela peut nécessiter d’ajuster un peu les couleurs dans les préférences d’apparence si vous les avez personnalisées.

Storage kit

Ce kit regroupe tout ce qui concerne le stockage de masse et la gestion des fichiers.

Harmonisation de la nouvelle fonction BQuery::SetFlags avec d’autres fonctions similaires, et ajout d’une page de documentation pour cette fonction.

Correction d’un crash lorsqu’on enregistre un type MIME alors que le type parent n’existe pas (par exemple si on enregistre image/gif alors que le type image n’existe pas).

Ajout d’une constante pour identifier les systèmes de fichiers FAT16 parmi la liste des systèmes de fichiers connus.

Shared kit

Le shared kit contient des fonctions expérimentales en cours de développement mais déjà utilisées par plusieurs applications.

Contrairement aux autres kits, il est fourni sous forme d’une bibliothèque statique, ainsi chaque application peut en utiliser une version différente (choisie au moment de la compilation) et il n’y a pas de contraintes pour conserver une stabilité d’API ou d’ABI. Les fonctions développées dans le shared kit peuvent ensuite être migrées vers les autres kits une fois qu’elles sont finalisées.

La classe « color list » (utilisée par exemple dans les préférences d’apparence) accepte maintenant le glisser-déposer de couleurs.

Serveurs

Les serveurs sont des applications lancées au démarrage du système. Ils sont similaires aux services systemd. Ils fournissent des services utiles à l’implémentation de la bibliothèque standard, car tout ne peut pas être fait dans une bibliothèque partagée.

app_server

app_server regroupe le serveur graphique de Haiku (utilisé au travers de l’interface kit) ainsi que la gestion des applications en lien avec l’application kit.

Correction d’un problème d’initialisation de variables indiquant dans quels workspaces (bureaux virtuels) une fenêtre doit être présente. Cela se manifestait par l’apparition de morceaux incomplets de la fenêtre si on change de bureau virtuel pendant son apparition. Le bug existait depuis 15 ans mais n’avait jusque-là pas pu être identifié.

Les curseurs de souris ne sont plus générés en bitmap à la compilation à partir des sources vectorielles. C’est maintenant fait lors de l’initialisation du serveur graphique, ce qui permet d’avoir un plus gros curseur sur les écrans à très haute résolution.

input_server

input_server se charge des périphériques d’entrée utilisateurs (claviers, souris et autres périphériques de saisie et de pointage).

Correction de la keymap espagnole latino-américaine dans laquelle plusieurs combinaisons de touches ne fonctionnaient pas comme sur les autres systèmes.

Pilotes

ACPI, gestion d’énergie, système

Mise à jour de ACPICA pour la prise en charge de ACPI avec la dernière version disponible.

Correction de problèmes dans le pilote poke (permettant l’accès direct à la mémoire pour écrire certains pilotes en espace utilisateur) pour mieux valider les paramètres des ioctl et éviter de pouvoir facilement déclencher un kernel panic suite à une mauvaise utilisation du pilote.

Réseau

Correction d’un problème dans la pile TCP ou les retransmissions de paquets lors de l’établissement de la connexion n’étaient pas faits, si le premier paquet était perdu, la connexion ne s’établissait jamais.

Lorsque IP_HDRINCL est activé (une application demande à envoyer et recevoir elle-même les en-têtes IP des paquets reçus), la pile réseau s’assure tout de même que les en-têtes générés ont bien un checksum valide. Cela permet à traceroute de fonctionner correctement par exemple.

Mise en place de l’infrastructure pour la découverte de MTU deu chemin. Cela permet de déterminer la taille maximale des paquets qu’on peut envoyer vers un serveur, sans que de la fragmentation IP soit mise en jeu en cours de route (ce qui, au mieux dégraderait les performances, au pire empêcherait la connexion de fonctionner correctement):

  • Ajout de l’option IP_DONTFRAG pour demander aux routeurs de ne pas redécouper certains paquets,
  • Remontée de l’information ICMP FRAGMENTATION_NEEDED pour détecter qu’on a essayé d’envoyer un paquet trop gros.

Cela permet déjà de détecter les problèmes de MTU, mais pas encore de les corriger automatiquement. La suite du code est encore en cours de test.

Remplacement du pilote iprowifi3945 par la version mise à jour disponible dans OpenBSD (pilote “wpi”) à la place de celle de FreeBSD qui est actuellement moins bien maintenue.

Interface homme-machine

Ajout de la tablette Intuos 4 dans le pilote pour les tablettes Wacom, ainsi que du support de la molette présente sur certaines tablettes.

Systèmes de fichiers

NFS4

NFS est un système de fichier en réseau. Une machine serveur se charge réellement du stockage des fichiers, et d’autres machines peuvent monter ce disque et accéder aux fichiers partagés. Plusieurs machines peuvent accéder au même serveur en même temps et modifier les fichiers, ce qui nécessite une attention particulière lors de l’implémentation d’un système de fichier client.

Le travail sur le pilote NFSv4 se poursuit pour le stabiliser et améliorer sa compatibilité avec les serveurs NFS existants.

Correction de problèmes de gestion du cache et de libération anticipée d’inodes`, points sur lesquels NFS est un peu inhabituel par rapport à d’autres systèmes de fichiers puisque des évènements peuvent arriver du serveur NFS concernant un fichier qui a été supprimé localement, par exemple.

Correction d’un problème qui pouvait conduire un fichier nouvellement redimensionné à contenir des données non initialisées au lieu d’octets à 0.

Cela permet de corriger des problèmes détectés par des tests NFSv4 existants pour d’autres systèmes.

EXT4

Le pilote ext4 permet de monter, en lecture et en écriture, les systèmes de fichiers ext2, ext3 et ext4 développés pour Linux.

Implémentation et activation de la fonctionnalité « metadata_csum_seed » qui est activée par défaut pour les systèmes de fichiers nouvellement créés sous Linux.

Corrections dans le « tree splitting » qui n’était pas implémenté correctement, empêchant d’accéder à des dossiers contenant un trop grand nombre de fichiers.

RAMFS

RAMFS est un système de fichiers non persistant, stockant les fichiers uniquement dans la RAM. Il est plus rapide qu’un système de fichier traditionnel.

Correction de crashs lors de la création de gros fichiers et lors du remplacement d’un hardlink par un autre fichier.

FAT

FAT est un système de fichiers développé par Microsoft pour DOS et les anciennes versions de Windows. Il est assez répandu et sert un peu de format d’échange standard en particulier pour les supports de stockage externes (clés USB, cartes SD, disquettes…).

Ajout d’assertions et de vérifications d’intégrité supplémentaires. Le pilote FAT utilisé actuellement provient de FreeBSD, dont les développeurs nous ont assuré qu’il était bien testé et maintenu. Mais, de façon similaire aux pilotes Wifi, on se rend compte que les bases d’utilisateurs de Haiku et de BSD ne sont pas du tout les mêmes, et nous sommes face à beaucoup de systèmes de fichiers FAT corrompus ou inhabituels, ce qui se produit peut-être moins souvent dans les utilisations de FreeBSD sur un serveur par exemple.

libroot

La libroot contient l’équivalent de la libc, libdl, libpthread et libm d’un système UNIX standard, ainsi que des fonctions bas niveau spécifiques à BeOS.

Les extensions GNU et BSD sont déportées dans des bibliothèques séparées (libgnu et libbsd), ce qui permet de respecter au mieux la spécification POSIX sans avoir à utiliser des astuces telles que des « weak symbols ».

Mise à jour de la libio

La bibliothèque standard de Haiku est à l’origine un fork de la glibc, utilisant exactement la même version que BeOS afin de garantir une compatibilité d’ABI optimale avec ce dernier. Cependant, cette version ancienne et obsolète ne répond pas aux besoins des applications modernes.

Petit à petit, des parties de la bibliothèque C sont donc remplacées par des composants venant de FreeBSD, NetBSD, OpenBSD ou plus récemment de musl. Certaines choses sont très bien standardisées et ne posent pas de problèmes, pour d’autres parties, des symboles internes de la bibliothèque sont exposés et parfois exploités par des applications (directement par des développeurs applicatifs pour contourner un bug, ou alors parce que les développeurs de la glibc ont mal isolé les choses et ont exposé des détails internes).

Ce trimestre, la partie libio (gestion des flux d’entrée-sortie) a été mise à jour avec la dernière version de la glibc. Il n’est pas possible d’utiliser une autre bibliothèque C pour cette partie sans casser l’ABI, mais la mise à jour est possible.

Correction de multiples problèmes dans les fonctions standard C et les extensions BSD:

  • Ajout d’une vérification de la locale passée à setlocale pour retourner une erreur si la locale demandée est invalide.

  • L’ouverture d’un chemin se finissant par un / avec open() échoue si le fichier n’est pas un dossier (par exemple open("/home/user/foo.txt/")).

  • Validation du paramètre “how” de la fonction shutdown() et retour d’une erreur si le paramètre n’est pas une valeur connue.

  • Les queues d’évènement créées par kqueue ne sont pas conservées lors d’un fork (même comportement que les BSD).

  • Un socket sur lequel il n’y a jamais eu d’appel à listen() ou connect() ne doit pas déclencher les erreurs EPIPE ni ENOTCONN.

  • La fonction socket() retourne maintenant les bons codes d’erreurs détaillés si elle ne peut pas créer le socket: EPROTOTYPE si le type de protocole est inconnu, EPROTONOSUPPORT s’il est connu mais pas disponible, EAFNOSUPPORT si la famille d’adresse n’est pas disponible. Auparavant, tous ces cas renvoyaient EAFNOSUPPORT.

  • Amélioration de la gestion des erreurs dans accept()

  • Gestion de cas particuliers pour bind() en UDP

  • Ajout de l’option RTLD_GROUP pour dlopen(). Il s’agit d’une extension développée par Solaris qui permet d’avoir plusieurs espaces de noms pour la résolution de symboles lors du chargement de bibliothèques partagées. En particulier, dosemu l’utilise pour fournir aux programmes DOS une bibliothèque C indépendante de celle de l’hôte (fournissant donc des fonctions memcpy, memset… qui entreraient en conflit avec celles de l’hôte). L’implémentation est triviale, car le même comportement était déjà en place pour la gestion des add-ons de BeOS; il n’était simplement pas accessible au travers de l’API POSIX dlopen(). Linux implémente ce flag sous un autre nom, cependant, la documentation de la glibc n’est pas correcte, et FreeBSD a implémenté ce qui est documenté pour la glibc avec le même nom. C’est pourquoi le nom utilisé par Solaris, qui n’est pas ambigu, est utilisé pour l’instant, en espérant que la méprise entre Linux et FreeBSD pourra être corrigée.

  • sethostname() retourne une erreur si le hostname proposé est trop long (auparavant il était simplement tronqué).

Intégration des changements de POSIX-2024

La spécification POSIX a été mise à jour en 2024. Cette mise à jour est assez importante grâce à un changement de la méthode de travail de l’Austin Group qui maintient la spéficication. Le groupe de travail a ouvert un bug tracker sur lequel il est possible de remonter des problèmes et de proposer des améliorations (à conditions que ces dernières soient déjà implémentées sous forme d’extensions sur un assez grand nombre de systèmes).

Cela a permis à plus de monde de prendre part à la spécification et de standardiser beaucoup de nouvelles choses. Haiku intègre ces changements petits à petits, parfois par anticipation, parfois parce que l’extension correspondante était déjà disponible, et parfois parce que le portage d’un logiciel le nécessite.

  • Ajout de O_CLOFORK, MSG_CMSG_CLOEXEC, et MSG_CMSG_CLOFORK pour fermer des descripteurs de fichiers lors d’un fork (équivalent de O_CLOEXEC qui ferme lors d’un exec, typiquement après un fork). Au passage, ajout dans la libbsd de closefrom() et closerange(), ces deux fonctions permettant de lancer des tests développés pour BSD pour ces nouveaux drapeaux.
  • Ajout de fdatasync(), une fonction qui s’assure que le contenu d’un fichier est bien enregistré sur disque et pas seulement dans le cache.

Améliorations sur la gestion de la mémoire

La gestion de la mémoire est un sujet central pour un système POSIX. L’API proposée (malloc, realloc, calloc et free) est à la fois très simple d’utilisation et très générique. Elle a donc tendance à être très sollicitée par les applications, ce qui en fait un composant critique de l’optilisation des performances du système. De plus, les applications sont de plus en plus consommatrices de mémoire et le matériel a tendance à en contenir de plus en plus.

L’allocateur mémoire a été remplacé il y a quelques mois, l’ancien allocateur hoard2 ne permettant pas d’agrandir dynamiquement l’espace alloué à une application. Après plusieurs essais, c’est pour l’instant l’allocateur d’OpenBSD qui a été retenu. En effet, beaucoup d’allocateurs plus modernes supposent un espace d’adressage 64 bit et sont peu économes en termes de réservation d’espace mémoire.

Cependant, même l’allocateur d’OpenBSD montrait ses limites sur les systèmes 32 bit. Son paramétrage a été amélioré, et d’autres modifications ont également été faites pour réduire la fragmentation de l’espace mémoire. Cela corrige des problèmes ou GCC ne parvient pas à allouer assez de mémoire lors de la compilation de très gros fichiers (par exemple lors de la compilation de clang ou de webkit). Il reste recommandé de désactiver l’ASLR (randomization de l’espace d’adressage) dans les cas où on a besoin de beaucoup de mémoire pour une application 32 bits.

Noyau

Le noyau de Haiku est un noyau monolithique tout à fait classique pour un système UNIX. Il permet le chargement dynamique de modules, et fournit une API relativement stable pour ces derniers, ce qui permet de maintenir des pilotes facilement en dehors du dépôt de sources de Haiku.

Correction de problèmes causant le kernel panic « failed to acquire spinlock for a long time » lorsque l’affichage à l’écran des logs du noyau est activé.

Ajout d’assertions supplémentaires dans le code de gestion de la mémoire virtuelle pour essayer de détecter des problèmes au plus tôt et avant de risquer de corrompre des données importantes.

Correction de l’affichage des paramètres des appels systèmes dans strace sur x86.

Correction de problèmes dans la gestion des permissions pour write_stat (modification des informations sur un fichier comme la date de modification) dans le noyau ainsi que dans les systèmes de fichiers RAMFS, BFS et EXT4. Cela corrige des comportements étranges observés lors de l’utilisation de rsync.

Ajout d’un test vérifiant le bon fonctionnement des exceptions remontées par le FPU lors de calculs en virgule flottante (ces exceptions sont un peu difficiles à traiter dans un système multitâche, et en particulier dans Haiku où le code du noyau peut lui-même utiliser le FPU alors que ce n’est pas le cas pour d’autres systèmes).

Correction de problèmes liés au découpage et au redimensionnement des areas (zones de mémoires allouées par les APIs prévues à cet effet de BeOS, ou indirectement par mmap et d’autres fonctions permettant de manipuler l’espace mémoire). Cela corrige des problèmes pour RAMFS ainsi qu’un kernel panic observé lors du lancement de dosemu.

Correction de problèmes avec les areas en lecture seule, qui pouvaient aboutir dans certains cas à une sous-évaluation de la mémoire utilisée, aboutissant à un kernel panic, car il n’y a plus de mémoire disponible à un moment où le noyau ne s’y attend pas. Cela a été mis en évidence en particulier avec l’utilisation mémoire de certains navigateurs web, qui ont tendance à gérer la mémoire directement sans passer par l’allocateur standard du système, pour des raisons de performance.

Remise en route de guarded_heap (un allocateur mémoire qui détecte les dépassements de buffers, au prix d’une consommation mémoire fortement augmentée). Correction de problèmes mis en évidence par cet allocateur dans quelques pilotes.

Dans la structure mcontext/ucontext passée aux fonctions de traitement de signaux, ajout de plusieurs registres manquants (registres de segments, addresse de faute…). Cela est utilisé par le JIT de dosemu et va probablement permettre d’utiliser le JIT dans d’autres applications également. En effet, une approche possible pour le JIT est de déclencher volontairement un signal, afin d’intercepter l’état des registres, éventuellement de le manipuler, puis de reprendre l’exécution là où elle s’était arrêtée.

Ajout de vérification de permissions manquantes dans l’appel système get_extended_team_info.

Correction d’une possible fuite d’un descripteur de fichier dans le VFS.

Bootloader

Mise à 0 de tous les registres non utilisés lors de l’appel de fonctions du BIOS, afin d’aider à investiguer des problèmes avec certains BIOS capricieux.

Amélioration des messages d’erreurs lorsque le bootloader ne parvient pas à charger le fichier ELF du noyau. Le chargeur de fichiers ELF du noyau est volontairement incomplet pour simplifier les choses (après tout, il a besoin seulement de charger le noyau), mais cela pose problème lors de mises à jour de GCC ou lors du portage sur de nouvelles architectures, si l’organisation du fichier ELF du noyau se trouve modifiée.

Correction de problèmes de compilation lorsque des logs de debug optionels sont activés.

Documentation

La documentation de Haiku se découpe principalement en trois parties:

  • Un guide de l’utilisateur,
  • Une documentation d’API pour les développeurs d’applications,
  • Une documentation d’implémentation pour les développeurs du système lui-même.

API (Haiku book)

Documentation de la classe BControl (classe abstraite qui fournit l’API standard de la plupart des contrôles utilisables dans l’interface graphique, les rendant interchangeables dans une certaine mesure).

Documentation de AdoptSystemColors et HasSystemColors pour la classe BButton.

Ajout de documentation pour les extensions à dlfcn.h par rapport à ce qui est déjà spécifié par POSIX.

Environnement de compilation

Haiku est écrit en C++ et utilise jam (un concurrent de make) comme outil principal de compilation. Cet outil a été retenu, car il permet de définir des règles de compilation génériques et réutilisables pour faire toutes sortes de choses. La compilation de Haiku pouvant mettre en jeu trois compilateurs différents (un pour le système hôte, un pour le système Haiku cible, et un troisième pour la couche de compatibilité avec BeOS), la plupart des autres outils ne répondent pas bien aux besoins.

Suppression de règles Jam redondantes. Jam repose sur des règles nommées pour savoir quelles actions sont nécessaires pour générer une cible à partir de sources. Les règles “Application”, “Server”, “Preferences” et “Executable” étaient toutes identiques, elles ont donc toutes été remplacées par “Application” pour simplifier le système de build.

Correction de “warnings” du compilateur pour des variables inutilisées et suppression de code mort (dans le cadre du maintien d’un code propre et lisible, une tâche plus ou moins continue pour suivre l’évolution des bonnes pratiques, la disponibilité de nouveaux outils d’analyse, et absorber la dette technique qui peut s’accumuler au cours d’un projet aussi ancien).

Début de support pour GCC 15: il est ajouté dans la liste des versions du compilateur reconnues pour le système hôte, ce qui permet de compiler Haiku depuis un système Linux très récent. L’intégration en tant que compilateur cible viendra plus tard.

Remplacement de la commande which utilisée dans certains scripts de build par l’équivalent command -v, ce qui évite une dépendance à une commande non standard qui n’est pas forcément installée par défaut partout.

Dans le makefile engine (un template de makefile proposé pour développer facilement des applications pour Haiku), ajout de documentation et d’exemples pour les variables INSTALL_DIR et TARGET_DIR.

Portage de Haiku sur d’autres CPUs

RISC-V

Correction d’un problème dans un script de link qui empêchait le démarrage du noyau.

Mise à jour de paquets utilisés pour compiler le système de base.

Mise en place d’un serveur de compilation de paquets pour RISC-V, ce qui permet de remplir le dépôt de paquets pour cette architecture et d’envisager une version officielle de Haiku pour RISC-V lors de la prochaine version bêta. L’architecture RISC-V s’ajoutera ainsi au x86 (32 et 64 bit) déjà supporté.

Commentaires : voir le flux Atom ouvrir dans le navigateur

  •