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.
- lien nᔠ1 : Rapport d'activité de février 2025
- lien nᔠ2 : Rapport d'activité de mars 2025
- lien nᔠ3 : Rapport d'activité d'avril 2025
Sommaire
- Google Summer of Code
- Applications
- Kits
- Serveurs
- Pilotes
- SystĂšmes de fichiers
- libroot
- Noyau
- Scripts de compilation
- Documentation
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