-
[DLL] théorie réentrance
hello,
j aimerais savoir quelle modifications dans mon code je vais devoir effectuer pour rendre une DLL réentrante.:question:
Il y a surement des mécanismes à implementer non ? Au pire des cas il y a quand meme des points a respecter pour garantir la réentrance ?
je ferais mieux d'avoir une DLL liée dynamiquement ou statiquement (je doute que ce choix ai une implicaqtion pour la réentrance.. .) ?
:merci: pour vos indications
-
Ça dépend ce que tu appelles réentrance.
La seule différence que je connaisse entre édition de lien implicite (load-time, avec lib. statique d'importation) ou explicite (run-time, LoadLibrary() etc.) concerne le multithreading: Les variables globales __declspec(thread) ne marchent qu'en implicite.
À mon sens, pour qu'une DLL soit complètement réentrante, il suffit qu'elle ne contienne aucune variable globale (à part son HMODULE, à stocker dans le traitement de DLL_PROCESS_ATTACH et à ne plus jamais toucher par la suite. Et encore, seulement si ta DLL contient des ressources). Pour ça, le mieux est de refiler au programme utilisateur un pointeur opaque (du même genre que FILE*, nul n'est supposé savoir ce qu'il y a dedans) vers les données...
Et si tu es OBLIGÉ d'utiliser des variables globales, tu peux utiliser du thread-local storage (pour les structures dépendant du thread courant, genre GetLastError()) ou des données globales au processus dont l'accès est protégé par une CRITICAL_SECTION (initialisée dans DllMain())...