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

C++ Discussion :

FreeLibrary n'est pas très coopératif


Sujet :

C++

  1. #1
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    octobre 2011
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : octobre 2011
    Messages : 1 422
    Points : 4 457
    Points
    4 457
    Par défaut FreeLibrary n'est pas très coopératif
    Bonjour a tous,

    Dans le cadre d'un frontend retro, je dois charger et décharger des lib dynamiques pour changer d'émulateur.
    Tout fonctionne très bien hormis un irréductible MAME (émulateur arcade) qui pour une raison qui m'échappe refuse de se décharger.

    Pour éviter de mettre en cause mon code j'ai reproduit un exemple minimal, a savoir, charger, décharger, attendre 30sec(le temps de vérif. dans process explorer) et vous vous en doutez, il est toujours la, tapis dans l'obscurité.

    Nom : libretro-mame.png
Affichages : 179
Taille : 205,4 Ko

    Le code de test:


    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
     
    //Code java qui appelle ma lib, dans laquelle se trouve le code plus bas
    System.load("D:\\dev\\prj\\retro-player-emulator-libretro\\bin/libpxl.dll");
    LibRetro l = new LibRetro(Path.of("D:\\dev\\prj\\retro-player/data/local/emulators/libretro"));
    l.loadCore(LibRetroCore.MAME);
    Thread.sleep(30000);
    Code : Sélectionner tout - Visualiser dans une fenêtre à part
    1
    2
    3
    4
    5
    6
    7
    8
     
    PXLEXPORT void loadCore(const char* libPath) {
       auto hndl = LoadLibraryA(libPath);
       auto r = FreeLibrary(hndl);
       if(r) {
           pxlLogInfo("UNLOAD LIB");
       }
    }
    Si quelqu'un a une idée de pourquoi cette lib(libretro_mame.dll) est capricieuse alors que les autres, aucun soucis
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  2. #2
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2011
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2011
    Messages : 1 084
    Points : 2 682
    Points
    2 682
    Billets dans le blog
    1
    Par défaut
    J'ai eu un cas similaire, et c'était du fait que ma dll ne libérait pas des ressources qu'elle avait allouée, du coup elle ne se déchargeait pas de la mémoire. C'est une dll à toi ou tu n'as pas la main sur le code?
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  3. #3
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    octobre 2011
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : octobre 2011
    Messages : 1 422
    Points : 4 457
    Points
    4 457
    Par défaut
    C'est une lib externe, j'ai juste la main sur celle qui la charge, utilise et la decharge(enfin essaie de la decharger du moins)

    Meme en faisant un load puis free immediatement, des resources seraient allouee selon toi? (sachant que je n'ai pas trouve de maindll)
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  4. #4
    Expert éminent sénior
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    novembre 2006
    Messages
    7 875
    Détails du profil
    Informations personnelles :
    Localisation : France, Rhône (Rhône Alpes)

    Informations professionnelles :
    Activité : Développeur informatique

    Informations forums :
    Inscription : novembre 2006
    Messages : 7 875
    Points : 18 847
    Points
    18 847
    Par défaut
    Citation Envoyé par yildiz-online Voir le message
    Si quelqu'un a une idée de pourquoi cette lib(libretro_mame.dll) est capricieuse alors que les autres, aucun soucis
    tout est expliqué dans le MSDN.
    LoadLibrary en interne augmente des références et au besoin charge la dll concernée via le Kernel
    FreelLibrary ne fait que décrémenter les références.
    Si référence=0 alors la dll est déchargée de la mémoire.
    Tout simplement parce que la dll peut être appelée par d'autres programmes donc chercher pourquoi la dll n'est pas déréférencée ailleurs avec un autre FreeLibrary
    Ensuite il vaut mieux utiliser LoadLibraryEx.

  5. #5
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    octobre 2011
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : octobre 2011
    Messages : 1 422
    Points : 4 457
    Points
    4 457
    Par défaut
    J'ai bien compris le concept de reference counting pour le dechargement, et justement c'est bien ma question

    1) Mon application est la seule a utiliser cette lib.
    2) Process explorer n'a aucune trace d'une autre instance.
    3) Les librairies des autres emus n'ont pas ce probleme.

    Mon exemple simple montre bien un load/free immediat et pourtant la lib reste chargee jusqu'a ce l'application appelante termine

    Donc je seche
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  6. #6
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2011
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2011
    Messages : 1 084
    Points : 2 682
    Points
    2 682
    Billets dans le blog
    1
    Par défaut
    Tu as vérifier que tu n'as pas un thread qui appelle cette lib? Genre un thread créé par la lib au chargement (oui c'est un peu tordu comme idée, mais sait-on jamais)
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  7. #7
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    octobre 2011
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : octobre 2011
    Messages : 1 422
    Points : 4 457
    Points
    4 457
    Par défaut
    Oui c'est une possibilite qu'on m ' aussi soumise sur un autre forum, je n'ai pas vérifié. la base de code étant assez maousse, faudrait trop creuser.

    Je vais faire 2 autres tests demain: sous linux(enfin WSL), et un test avec juste le load et le free mais aussi le init/deinit entre les 2
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  8. #8
    Membre émérite
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    juin 2011
    Messages
    1 084
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 32
    Localisation : France, Loire Atlantique (Pays de la Loire)

    Informations professionnelles :
    Activité : Développeur informatique
    Secteur : High Tech - Éditeur de logiciels

    Informations forums :
    Inscription : juin 2011
    Messages : 1 084
    Points : 2 682
    Points
    2 682
    Billets dans le blog
    1
    Par défaut
    Après tu as aussi certaine librairie qui ont des variables globales, si c'est le cas, malheureusement tu ne pourras rien faire
    Pas de solution, pas de probleme

    Une réponse utile (ou +1) ->
    Une réponse inutile ou pas d'accord -> et expliquer pourquoi
    Une réponse à votre question


  9. #9
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    octobre 2011
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : octobre 2011
    Messages : 1 422
    Points : 4 457
    Points
    4 457
    Par défaut
    Citation Envoyé par skeud Voir le message
    Après tu as aussi certaine librairie qui ont des variables globales, si c'est le cas, malheureusement tu ne pourras rien faire
    J'ai teste sous linux et tout fonctionne parfaitement, la librairie est bien dechargee une fois le jeu quitte, donc c'est un probleme uniquement lie a windows, on peut donc je pense ecarter cette piste
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  10. #10
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    26 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 26 255
    Points : 209 346
    Points
    209 346
    Billets dans le blog
    91
    Par défaut
    Bonjour,

    Est-ce que le problème se produit pour toutes les bibliothèques que vous chargées/déchargées?
    Après, je pense que ce n'est pas un problème, dans le sens, faites confiance au système. Il a ses raisons . Si vous rechargez la bibliothèque juste après, elle ne sera pas instanciée deux fois, donc pas d'augmentation de mémoire.
    Aussi, avez vous vérifié s'il y avait une erreur (je doute qu'il y en ai):
    If the function fails, the return value is zero. To get extended error information, call the GetLastError function.
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  11. #11
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    octobre 2011
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : octobre 2011
    Messages : 1 422
    Points : 4 457
    Points
    4 457
    Par défaut
    Citation Envoyé par LittleWhite Voir le message
    Bonjour,

    Est-ce que le problème se produit pour toutes les bibliothèques que vous chargées/déchargées?
    Salut,
    Uniquement pour mame windows, les autres(snes9x, nestopia, gdx, mame linux,...) le dechargement est bien effectif.
    La dll mame fait 300 mo

    Citation Envoyé par LittleWhite Voir le message
    Après, je pense que ce n'est pas un problème, dans le sens, faites confiance au système. Il a ses raisons . Si vous rechargez la bibliothèque juste après, elle ne sera pas instanciée deux fois, donc pas d'augmentation de mémoire.
    Mon systeme n'a pas ete concu dans cette optique et relancer l'emu provoque un blocage

    Citation Envoyé par LittleWhite Voir le message
    Aussi, avez vous vérifié s'il y avait une erreur (je doute qu'il y en ai):
    Oui j'ai verifie, le dechargement de mame me dit bien ok, FreeLibrary me retourne un non 0
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

  12. #12
    Responsable 2D/3D/Jeux


    Avatar de LittleWhite
    Homme Profil pro
    Ingénieur développement logiciels
    Inscrit en
    mai 2008
    Messages
    26 255
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : France

    Informations professionnelles :
    Activité : Ingénieur développement logiciels

    Informations forums :
    Inscription : mai 2008
    Messages : 26 255
    Points : 209 346
    Points
    209 346
    Billets dans le blog
    91
    Par défaut
    Rapportez le bogue à l'équipe de MAME, peut être ils sauront .
    Vous souhaitez participer à la rubrique 2D/3D/Jeux ? Contactez-moi

    Ma page sur DVP
    Mon Portfolio

    Qui connaît l'erreur, connaît la solution.

  13. #13
    Expert confirmé Avatar de yildiz-online
    Homme Profil pro
    Architecte logiciel
    Inscrit en
    octobre 2011
    Messages
    1 422
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte logiciel

    Informations forums :
    Inscription : octobre 2011
    Messages : 1 422
    Points : 4 457
    Points
    4 457
    Par défaut
    Le problème est finalement résolu, en déchargeant la librairie MAME ainsi que la librairie appelante, ce qui est désormais possible avec java 19 via les MemorySession de la JEP 424.
    PXL le retro-gaming facile: Essayez-le

    Yildiz-Engine an open-source modular game engine: Website
    Yildiz-Online a 3D MMORTS in alpha: Facebook page / Youtube page

+ Répondre à la discussion
Cette discussion est résolue.

Discussions similaires

  1. Réponses: 12
    Dernier message: 18/04/2022, 17h44
  2. C'est pas très Clear
    Par Clotho dans le forum MATLAB
    Réponses: 4
    Dernier message: 14/09/2011, 09h31
  3. J'en perds mon latin (pas très élevé, c'est vrai)
    Par laurentSc dans le forum Général JavaScript
    Réponses: 11
    Dernier message: 15/10/2009, 12h12
  4. Programmer encore en VB 6 c'est pas bien ? Pourquoi ?
    Par Nektanebos dans le forum Débats sur le développement - Le Best Of
    Réponses: 85
    Dernier message: 10/03/2009, 14h43
  5. Problème d'affichage IE/Firefox (c'est pas très original)
    Par jpparmentier dans le forum Mise en page CSS
    Réponses: 1
    Dernier message: 01/02/2007, 12h01

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