• [^] # Re: ma chaussette d'or de la journée

    Posté par . En réponse au journal [mavie] Le javascript ca pue. Évalué à 3.

    Arf, deux jours à corriger ce p...n de bug :

    Je devais faire du traitement d'image bien bourrin sur des images à n plans (= n couleurs, avec 1 <= n <= 32). Pour aller vite je lançais m (= nombre de processeur) threads. Pour limiter la fragmentation, j'ai eu la (mauvaise) idée de ne faire qu'un gros malloc() au premier thread qui entrait dans la fonction.

    Là où ça devient gore, c'est que j'avais un table fixe à p élements (p = nombre supposé max de couleurs soit 32), et l'indice 0 pointait sur le début du bloc mémoire et j'initialisais les autres indices au fur et à mesure que les threads entraient dans la fonction, avec un truc du genre :

    table[canal] = table[0] + width * height * (id_thread % nb_plans)

    Le % est pour diminuer la quantité de mémoire à allouer, vu que tout était fait à la volée et stocké illico dans des fichiers. Donc à un instant t, il n'y avait besoin que de MIN(m, nb_plans) buffers (et avec des images de 60000x60000 pixels, ce n'est pas du luxe, même avec quelques Go de RAM). Donc, l'oeuil averti aura tout de suite vu mon erreur : si le thread 1 traitait le canal 0, l'instruction se transformait en :

    table[0] = table[0] + width * height

    Pouf, décalage du buffer, en fonction de l'ordonnancement des threads, écriture en zone mémoire non allouée, plantage aléatoire. Par chance, je suis tombé sur un fichier à 11 plans qui merdait quasi systématiquement.

    Rhâa, deux jours :-(