Bonjour a tous,
J'ai un cas de figure un peu particulier, et étant débutant en C++, j'aimerais votre avis sur la marche a suivre.
Le contexte d'exécution:
App java -> charge dynamic lib A (en C++) -> charge dynamic lib B (en C).
App java est une application qui est 'self recoverable' elle gère donc les erreurs de manière gracieuse et peut recharger les modules qui échouent en garantissant un fonctionnement continu, dans les limites du possible et raisonnable bien sur.
Elle s'appuie sur lib A pour certaines opérations, lib A dont donc garantir la même robustesse et est chargée en continu(java ne permet pas de décharger une lib dynamique).
Lib A doit charger dynamiquement(dlopen et consorts) une lib B pour certaines opérations, et la décharger au terme de ces opérations, il y a plusieurs implémentations différentes de lib B qu'il est possible de charger suivant le besoin courant.
Lib A doit donc pour chaque chargement de lib B allouer des ressources propre a cette implémentation spécifique et les relâcher au terme de l'utilisation afin de garantir un contexte sain pour le prochain chargement et bien sur éviter les fuites mémoires.
Tout ca pour en venir aux contraintes:
1) Lib A ne peut pas cesser de fonctionner.
2) Lib A doit faire plusieurs réinitialisation complets au cours de son cycle de vie.
3) Lib A utilise des ressources bas niveau: fichiers, connexion réseau, vfs entoures par des wrappers...
En utilisant le RAII, lors de la réinitialisation du contexte, les destructeurs des wrappers peuvent donc lancer des exception, je vois plusieurs solutions mais aucune satisfaisante:
Laisser l'exception se propager: le wrapper étant détruit avant la propagation, on ne peut plus rien faire pour la ressource toujours ouverte, l'application pouvant rester chargée sur une durée indéterminée(jours/semaines) le risque de starvation augmente au fil du temps.
Catch exception dans le destructeur et garder le handler de la ressource dans un systeme async qui va réessayer le nettoyage? complexe mais dans le domaine du possible.
noexept: terminer le processus va a l'encontre de la contrainte 1
Quels sont vos conseils?
Merci.
Partager