library init: be recursive
authorAlexander Klauer <Alexander.Klauer@itwm.fraunhofer.de>
Thu, 14 Mar 2013 14:26:14 +0000 (15:26 +0100)
committerDaniel Stenberg <daniel@haxx.se>
Mon, 22 Apr 2013 21:24:50 +0000 (23:24 +0200)
Previously, a single call to ares_library_cleanup() would deinitialise
the c-ares library, regardless of how many times ares_library_init() was
called. This behaviour may cause problems in programs linking two or
more libraries which, in turn, use c-ares. The present commit fixes this
problem, deinitializing the library only after a number of calls to
ares_library_cleanup() matching the number of calls to
ares_library_init().

ares_library_init.c

index f0137a1..770e7c2 100644 (file)
@@ -101,7 +101,10 @@ int ares_library_init(int flags)
   int res;
 
   if (ares_initialized)
-    return ARES_SUCCESS;
+    {
+      ares_initialized++;
+      return ARES_SUCCESS;
+    }
   ares_initialized++;
 
   if (flags & ARES_LIB_INIT_WIN32)
@@ -122,6 +125,8 @@ void ares_library_cleanup(void)
   if (!ares_initialized)
     return;
   ares_initialized--;
+  if (ares_initialized)
+    return;
 
   if (ares_init_flags & ARES_LIB_INIT_WIN32)
     ares_win32_cleanup();