Win32: implement variable cleanup more similar to POSIX...
authorRémi Denis-Courmont <remi@remlab.net>
Tue, 23 Nov 2010 21:36:17 +0000 (23:36 +0200)
committerRémi Denis-Courmont <remi@remlab.net>
Tue, 23 Nov 2010 21:46:32 +0000 (23:46 +0200)
...and less prone to deadlocks. This restarts until all keys are NULL,
in case cleaning up reset one key back to a non-NULL value.
There is still a slight difference with POSIX still. POSIX will restarts
only after all destructors have been invoked, not after the first one.

src/win32/thread.c

index 8552ea7..9bcc645 100644 (file)
@@ -517,13 +517,19 @@ static void vlc_threadvar_cleanup (void)
 {
     vlc_threadvar_t key;
 
+retry:
     /* TODO: use RW lock or something similar */
     vlc_mutex_lock (&super_mutex);
     for (key = vlc_threadvar_last; key != NULL; key = key->prev)
     {
         void *value = vlc_threadvar_get (key);
         if (value != NULL)
+        {
+            vlc_mutex_unlock (&super_mutex);
+            vlc_threadvar_set (key, NULL);
             key->destroy (value);
+            goto retry;
+        }
     }
     vlc_mutex_unlock (&super_mutex);
 }