IdentifiantMot de passe
Loading...
Mot de passe oublié ?Je m'inscris ! (gratuit)
Navigation

Inscrivez-vous gratuitement
pour pouvoir participer, suivre les réponses en temps réel, voter pour les messages, poser vos propres questions et recevoir la newsletter

Entrée/Sortie Java Discussion :

Plantage aléatoire avec JNI


Sujet :

Entrée/Sortie Java

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut Plantage aléatoire avec JNI
    Bonjour,

    J'utilise JNI pour pouvoir accéder à l'API fmod (C++) à partir de mon application java.
    Pour ça, j'utilise la librairie nativeFmodEx.
    Dans tous mes tests que j'avais fait avant de me lancer, je n'ai eu aucun problème, je suis donc parti confiant sur mon projet !

    Seulement maintenant que je l'ai intégré dans mon lecteur audio, j'ai des soucis. Déjà, il faut savoir que toutes mes commandes JNI sont exécutées dans un thread à part.
    Pour éviter tout accès concurrent, j'ai mis en place un système de file d'attente qui exécute une à une les actions demandées depuis l'interface (chargement fichier, lecture, récupération de la position dans le média pour mettre à jour la position...).
    Le problème que j'ai, c'est quand j'appelle la méthode de la récupération de la position. J'ai un plantage lié à JNI (la mémoire ne peut pas être read...) de façon aléatoire (des fois ça plante dans la première seconde de la chanson, des fois elle peut être lue en entier...), sachant que cette méthode est appelée toute les 500ms (je rajoute une demande à la file d'attente toute les 500 ms).

    Ce qui m'étonne le plus dans tout ça, c'est que ce n'est pas la méthode qui récupère la position qui plante, mais le crash arrive quand je supprime l'action correspondante de ma file d'attente, après qu'elle ai été exécutée... voilà ma boucle de gestion de file d'attente :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
    11
    12
    13
    14
    15
    16
    17
    18
     
    public void threatQueue() {
    			LOGGER.info("ThreatQueue must treat " + PlayerActionQueue.this.actionsToDo.size() + " actions");
    			while (PlayerActionQueue.this.actionsToDo.size() > 0) {
    				LOGGER.info("Start " + PlayerActionQueue.this.actionsToDo.get(0).getClass().getSimpleName());
    				try {
    					PlayerActionQueue.this.actionsToDo.get(0).runAndDeallocate();
    				} finally {
    					LOGGER.info("Fin de l'action " + PlayerActionQueue.this.actionsToDo.get(0).getClass().getSimpleName());
    					synchronized (PlayerActionQueue.this.actionsToDo) {
    						LOGGER.info("Avant remove " + PlayerActionQueue.this.actionsToDo.size());
    						PlayerActionQueue.this.actionsToDo.remove(0); //ligne qui plante
    						LOGGER.info("Après remove");
    					}
    				}
    			}
    			LOGGER.info("ThreatQueue end of method");
    		}
    Je pense que c'est lié à la destruction de l'objet. J'ai donc essayé manuellement, à la fin de la méthode "runAndDeallocate", de mettre à null le seul pointeur qui accède à JNI, mais le plantage arrive toujours au même endroit...

    voilà le code de runAndDeallocate :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    public void runAndDeallocate() {
    		try {
    			run();
    		} finally {
    			this.player = null; //Player est un objet que j'ai codé et qui contient les objets du wrapper JNI
    		}
    	}
    Du coup la méthode de run() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    public void run() {
    		try {
    			this.player.checkCurrentSoundInitialized(); //vérifie juste que le pointeur du son n'est pas null
    			this.millisecondPosition = this.player.getCurrentSound().getMediaTime();
    		} catch (PlayerException e) {
    			this.logger.error(StackTracer.getStackTrace(e));
    			this.player.getMessageNotifier().sendError(e.getMessage());
    		} 
    	}
    et le code de this.player.getCurrentSound().getMediaTime() :

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
    9
    10
     
    protected int getMediaTime() throws PlayerException {
    		this.logger.info("JNI : Avant récupération position");
    		IntBuffer result = BufferUtils.newIntBuffer(1);
    		Player.errorCheck(this.channel.getPosition(result, FMOD_TIMEUNIT_MS));
    		this.logger.info("JNI : Après récupération positione");
    		int mediaTime = result.get();
    		result.clear();
    		return mediaTime;
    	}
    Pour info, l'instance de Player que je met à null est présente dans la fenêtre principale de mon application, donc il ne doit pas être détruit à ce moment là.
    Pour moi toutes les ressources sont proprement désallouées (clear sur le IntBuffer, et affectation de null pour le player de l'objet qui est supprimé de la liste, donc je ne voit pas ce qui peut géner la suppression de mon objet action. et vu que mon crash se produit quand mon objet action est enlevé de la liste des actions, je vois pas ce que ça peut être d'autre...

    Si quelqu'un à une piste je suis preneur, là je sèche complet, surtout que j'ai très peu d'expérience en ce qui concerne JNI...

    Merci et à plus !

  2. #2
    Membre émérite Avatar de JoeChip
    Profil pro
    Inscrit en
    Septembre 2008
    Messages
    536
    Détails du profil
    Informations personnelles :
    Localisation : Belgique

    Informations forums :
    Inscription : Septembre 2008
    Messages : 536

  3. #3
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Bonjour !

    Merci mais c'est déjà ce que j'utilise !

    A+ !

  4. #4
    Membre éprouvé
    Homme Profil pro
    Consultant informatique
    Inscrit en
    Mars 2004
    Messages
    102
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 55
    Localisation : France, Hauts de Seine (Île de France)

    Informations professionnelles :
    Activité : Consultant informatique
    Secteur : Finance

    Informations forums :
    Inscription : Mars 2004
    Messages : 102
    Par défaut
    Qu'est ce qui garantit que

    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
     
    PlayerActionQueue.this.actionsToDo.get(0).runAndDeallocate();
    est bien synchrone ?

  5. #5
    Membre confirmé
    Profil pro
    Inscrit en
    Novembre 2007
    Messages
    187
    Détails du profil
    Informations personnelles :
    Localisation : France

    Informations forums :
    Inscription : Novembre 2007
    Messages : 187
    Par défaut
    Bonjour,

    Effectivement, runAndDeallocate n'est pas déclaré comme étant synchrone.
    A mon avis ce n'est pas nécessaire(mais je ne connais pas beaucoup la programmation multi thread), cette méthode appartient à mes classes d'action, et n'est donc appelée qu'une fois sur chaque instance. Y a t'il besoin malgré ça de la mettre en synchrone?

    Merci pour ta réponse en tout cas !

Discussions similaires

  1. [PC fixe] Plantage aléatoire avec son métallique/électronique désagréagle
    Par baxou087 dans le forum Ordinateurs
    Réponses: 4
    Dernier message: 18/03/2014, 21h55
  2. Plantage aléatoire avec intellde
    Par arnaud_verlaine dans le forum Windows XP
    Réponses: 4
    Dernier message: 30/06/2007, 13h37
  3. Accès dll depuis java avec JNI
    Par romano21 dans le forum Entrée/Sortie
    Réponses: 11
    Dernier message: 25/10/2005, 14h53
  4. Plantage Mysql avec LEFT JOIN
    Par verticka dans le forum Requêtes
    Réponses: 2
    Dernier message: 01/09/2005, 11h45
  5. Réponses: 15
    Dernier message: 07/07/2005, 11h05

Partager

Partager
  • Envoyer la discussion sur Viadeo
  • Envoyer la discussion sur Twitter
  • Envoyer la discussion sur Google
  • Envoyer la discussion sur Facebook
  • Envoyer la discussion sur Digg
  • Envoyer la discussion sur Delicious
  • Envoyer la discussion sur MySpace
  • Envoyer la discussion sur Yahoo