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++

Vue hybride

Message précédent Message précédent   Message suivant Message suivant
  1. #1
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 448
    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 : 332
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

  2. #2
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    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 091
    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?

  3. #3
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 448
    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)

  4. #4
    Expert confirmé
    Avatar de Mat.M
    Profil pro
    Développeur informatique
    Inscrit en
    Novembre 2006
    Messages
    8 553
    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 : 8 553
    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
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 448
    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

  6. #6
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    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 091
    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)

  7. #7
    Membre Expert Avatar de yildiz-online
    Homme Profil pro
    Architecte de domaine
    Inscrit en
    Octobre 2011
    Messages
    1 448
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Localisation : Belgique

    Informations professionnelles :
    Activité : Architecte de domaine

    Informations forums :
    Inscription : Octobre 2011
    Messages : 1 448
    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

  8. #8
    Membre Expert
    Avatar de skeud
    Homme Profil pro
    Développeur informatique
    Inscrit en
    Juin 2011
    Messages
    1 091
    Détails du profil
    Informations personnelles :
    Sexe : Homme
    Âge : 35
    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 091
    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

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

Discussions similaires

  1. Réponses: 12
    Dernier message: 18/04/2022, 18h44
  2. C'est pas très Clear
    Par Clotho dans le forum MATLAB
    Réponses: 4
    Dernier message: 14/09/2011, 10h31
  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, 13h12
  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, 15h43
  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, 13h01

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