Provided by: manpages-fr-dev_4.15.0-9_all bug

NOM

       malloc_info - Exporter l'état de malloc vers un flux

SYNOPSIS

       #include <malloc.h>

       int malloc_info(int options, FILE *stream);

DESCRIPTION

       La  fonction  malloc_info() exporte une chaîne XML décrivant l'état actuel de l'allocation
       mémoire pour l'appelant. Cette chaîne est écrite dans le flux stream. La  chaîne  exportée
       contient  des  informations  concernant  toutes  les  domaines  de  mémoires  (« arenas »,
       consultez malloc(3)).

       Dans la mise en œuvre actuelle, le paramètre options doit être nul.

VALEUR RENVOYÉE

       En cas de succès, malloc_info() renvoie 0. En  cas  d'erreur,  -1  est  renvoyé  et  errno
       contient le code d'erreur.

ERREURS

       EINVAL Le paramètre options n'était pas nul.

VERSIONS

       malloc_info() est disponible depuis la glibc 2.10.

ATTRIBUTS

       Pour une explication des termes utilisés dans cette section, consulter attributes(7).

       ┌────────────────────────────────────────────────────────┬──────────────────────┬─────────┐
       │InterfaceAttributValeur  │
       ├────────────────────────────────────────────────────────┼──────────────────────┼─────────┤
       │malloc_info()                                           │ Sécurité des threads │ MT-Safe │
       └────────────────────────────────────────────────────────┴──────────────────────┴─────────┘

CONFORMITÉ

       Cette fonction est une extension GNU.

NOTES

       L'information  d'allocation  mémoire  est  fournie  sous  forme de flux XML (plutôt que de
       structure C), car les informations fournies pourront évoluer dans le futur, en  raison  de
       modifications dans le code mis en œuvre. La sortie XML comporte un champ de version.

       La  fonction  open_memstream(3) peut être utilisée pour envoyer la sortie de malloc_info()
       directement dans un tampon en mémoire plutôt que dans un fichier.

       La fonction malloc_info() est conçue  pour  combler  les  manques  de  malloc_stats(3)  et
       mallinfo(3).

EXEMPLES

       Le  programme  ci-dessous  accepte jusqu'à quatre paramètres en ligne de commande dont les
       trois premiers sont obligatoires. Le premier paramètre  indique  le  nombre  de  processus
       légers  (« threads »)  que  le  programme  doit  créer. Tous les threads, thread principal
       compris, allouent le nombre  de  blocs  de  mémoire  indiqué  en  deuxième  paramètre.  Le
       troisième  paramètre  contrôle la taille des blocs à allouer. Le thread principal crée des
       blocs de cette taille, le deuxième thread créé par le programme alloue des blocs deux fois
       plus  grands,  le  troisième  thread  alloue  des blocs trois fois plus grands et ainsi de
       suite.

       Le programme appelle malloc_info() deux fois pour afficher l'état de l'allocation mémoire.
       Le premier appel est effectué avant la création d’un thread ou l'allocation de mémoire. Le
       deuxième appel est effectué une fois que tous les threads ont alloué de la mémoire.

       Dans l'exemple suivant, les paramètres commandent la  création  d'un  thread  additionnel,
       allouant 10 000 blocs de mémoire, comme le thread principal. Une fois les blocs de mémoire
       alloués, malloc_info() affiche l'état des deux domaines de mémoire.

           $ getconf GNU_LIBC_VERSION
           glibc 2.13
           $ ./a.out 1 10000 100
           ============ Avant allocation des blocs ============
           <malloc version="1">
           <heap nr="0">
           <sizes>
           </sizes>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="135168"/>
           <system type="max" size="135168"/>
           <aspace type="total" size="135168"/>
           <aspace type="mprotect" size="135168"/>
           </heap>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="135168"/>
           <system type="max" size="135168"/>
           <aspace type="total" size="135168"/>
           <aspace type="mprotect" size="135168"/>
           </malloc>

           ============ Après allocation des blocs ============
           <malloc version="1">
           <heap nr="0">
           <sizes>
           </sizes>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="1081344"/>
           <system type="max" size="1081344"/>
           <aspace type="total" size="1081344"/>
           <aspace type="mprotect" size="1081344"/>
           </heap>
           <heap nr="1">
           <sizes>
           </sizes>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="1032192"/>
           <system type="max" size="1032192"/>
           <aspace type="total" size="1032192"/>
           <aspace type="mprotect" size="1032192"/>
           </heap>
           <total type="fast" count="0" size="0"/>
           <total type="rest" count="0" size="0"/>
           <system type="current" size="2113536"/>
           <system type="max" size="2113536"/>
           <aspace type="total" size="2113536"/>
           <aspace type="mprotect" size="2113536"/>
           </malloc>

   Source du programme
       #include <unistd.h>
       #include <stdlib.h>
       #include <pthread.h>
       #include <malloc.h>
       #include <errno.h>

       static size_t tailleBloc;
       static int nbThreads, nbBlocs;

       #define errExit(msg)    do { perror(msg); exit(EXIT_FAILURE); \
                               } while (0)

       static void *
       thread_func(void *arg)
       {
           int tn = (int) arg;

           /* Le multiplicateur '(2 + tn)' assure que chaque thread (dont
              le thread principal) alloue une quantité de mémoire différente. */

           for (int j = 0; j < numBlocks; j++)
               if (malloc(blockSize * (2 + tn)) == NULL)
                   errExit("malloc-thread");

           sleep(100);         /* Attendre que le thread principal se termine. */
           return NULL;
       }

       int
       main(int argc, char *argv[])
       {
           int sleepTime;

           if (argc < 4) {
               fprintf(stderr,
                       "%s nb-threads nb-blocs taille-bloc [tps-sommeil]\n",
                       argv[0]);
               exit(EXIT_FAILURE);
           }

           nbThreads = atoi(argv[1]);
           nbBlocs = atoi(argv[2]);
           tailleBloc = atoi(argv[3]);
           tpsSommeil = (argc > 4) ? atoi(argv[4]) : 0;

           pthread_t *thr = calloc(numThreads, sizeof(*thr));
           if (thr == NULL)
               errExit("calloc");

           printf("============ Avant allocation des blocs ============\n");
           malloc_info(0, stdout);

           /* Créer les threads allouant des quantités de mémoire différentes. */

           for (int tn = 0; tn < numThreads; tn++) {
               errno = pthread_create(&thr[tn], NULL, thread_func,
                                      (void *) tn);
               if (errno != 0)
                   errExit("pthread_create");

               /* Si un intervalle de sommeil existe après le démarrage de
                  chaque thread, les threads ne vont sans doute pas se battre
                  pour les mutex malloc et par conséquent les domaines de mémoire
                  supplémentaires ne seront pas alloués (consultez malloc(3)).
                  */

               if (tpsSommeil > 0)
                   sleep(tpsSommeil);
           }

           /* Le thread principal alloue également de la mémoire. */

           for (int j = 0; j < numBlocks; j++)
               if (malloc(blockSize) == NULL)
                   errExit("malloc");

           sleep(2);           /* Donner à tous les threads une chance
                                  de terminer les allocations. */

           printf("\n============ Après allocation des blocs ============\n");
           malloc_info(0, stdout);

           exit(EXIT_SUCCESS);
       }

VOIR AUSSI

       mallinfo(3), malloc(3), malloc_stats(3), mallopt(3), open_memstream(3)

COLOPHON

       Cette page fait partie de la publication 5.13 du projet man-pages Linux.  Une  description
       du  projet et des instructions pour signaler des anomalies et la dernière version de cette
       page peuvent être trouvées à l'adresse https://www.kernel.org/doc/man-pages/.

TRADUCTION

       La traduction française de cette  page  de  manuel  a  été  créée  par  Christophe  Blaess
       <https://www.blaess.fr/christophe/>,  Stéphan  Rafin  <stephan.rafin@laposte.net>, Thierry
       Vignaud <tvignaud@mandriva.com>, François Micaux, Alain  Portal  <aportal@univ-montp2.fr>,
       Jean-Philippe    Guérard   <fevrier@tigreraye.org>,   Jean-Luc   Coulon   (f5ibh)   <jean-
       luc.coulon@wanadoo.fr>,   Julien    Cristau    <jcristau@debian.org>,    Thomas    Huriaux
       <thomas.huriaux@gmail.com>, Nicolas François <nicolas.francois@centraliens.net>, Florentin
       Duneau <fduneau@gmail.com>, Simon Paillard <simon.paillard@resel.enst-bretagne.fr>,  Denis
       Barbier   <barbier@debian.org>,   David   Prévot  <david@tilapin.org>  et  Grégoire  Scano
       <gregoire.scano@malloc.fr>

       Cette traduction est une documentation libre ; veuillez vous reporter  à  la  GNU  General
       Public   License   version 3  ⟨https://www.gnu.org/licenses/gpl-3.0.html⟩  concernant  les
       conditions de copie et de distribution. Il n'y a aucune RESPONSABILITÉ LÉGALE.

       Si vous découvrez un bogue dans la traduction de cette page de manuel, veuillez envoyer un
       message à ⟨debian-l10n-french@lists.debian.org⟩.