Hello,

Je travaille sur une API de génération de chart graphique (bar, line, pie etc)
et nous avons détecté un bug bien bizarre sous plateforme AIX

Contexte :
-Machine AIX, avec jvm IBM 1.5 (1.4 c'est pareil)
-Tomcat avec des webapps qui utilisent notre API
-ligne de commande java utilisée :
java -Djava.awt.headless=true -Xmx512m -XX:MaxPermSize=256
(apperement le MaxPermSize n'est pas prise en compte sous jvm IBM)
-Ce bug n'a été reproduit QUE sur cette plateforme avec SEULEMENT une JVM IBM (pas de jvm fourni par Sun pour cete plate forme)

Bug :
Après une bonne centaine de génération de chart de type Pie (des camemberts), les nouveaux pie sont mal dessinés. J'ai mis énormément de temps a détecter que, c'est une variable de type double qui change de valeur lors de l'appel d'une méthode en particulier....

code appelant :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
1
2
3
sectors[i].setPos(cx - extraXDepth, cy + extraYDepth, rx, ry, rx2, ry2,
util.mod2pi(lastAngle + initialAngle), util.mod2pi(currentAngle + initialAngle), 
xDepth + extraXDepth, yDepth + extraYDepth, z, (null != depths) && (0 < depths.length));
Méthode appelée :
Code : Sélectionner tout - Visualiser dans une fenêtre à part
void setPos(int cx, int cy, int rx, int ry, int rx2, int ry2, double sAngle, double eAngle, int xDepth, int yDepth, double zAngle, boolean multiDepthMode)
A noté que c'est toujours le second double qui foire, jamais le premier.
J'ai rajouté des logs avant l'appel de la méthode et dans la méthode appelée
voila ce que ca donne :
127 PieChart before setPos 5.410963497592858
127 PieChart in setPos 1.265E-321


Remarques :
-j'ai identifié 3 méthodes qui bug de cette maniere
-la nouvelle valeur dans la méthode appelée est TOUJOURS la même dans l'instance de la jvm quand le bug apparrait (il faut redémarrer TOUTE la plateforme pour que le bug ne se reproduise plus...), donc ce n'est pas lié a une instance en particulier d'un objet
-le tout est monothreadé (en tout cas dans la webapps qui appelle notre API)
-Il y a plusieurs facon de 'résoudre' ce bug :
° changer la signature de la méthode et mettre les double en début de méthode.
° enlever les caluls fait 'pendant' l'appel de la méthode, c'est a dire que dans le code appelant, les appels a util.mod2pi, les additions... sont réalisés avant l'appel de la méthode et stockés dans des variables temporaires.



On a écrit une classe de test unitaire DoubleTest.java pour esayer de reproduire le bug, cette classe génère des double et int random et effectue en boucle des appels a des méthodes avec diverses paramètres et des calculs pendant l'appel de la méthode, si on lance cette classe 'seule' (java -cp . DoubleTest) pendant une heure, tout fonctionne correctement.
Par contre j'ai inclu un appel a cette méthode a chaque génération de pie, les valeurs changent assez vite pour un paramètre double.


Je sais que ca peut paraitre assez léger pour bien comprendre, néanmoins je cherche pas spécialement a résoudre entierement le bug, mais plutot a savoir si un tel comportement aurait déja été identifié, et si des ténors javaistes auraient une idée sur le pourquoi du comment

Si vous voulez d'autres infos n'éhésitez pas.

Merci