Piotr Caban : wininet: Stop urlcache clearing when dll is being unloaded.

Alexandre Julliard julliard at winehq.org
Fri Sep 21 14:22:41 CDT 2012


Module: wine
Branch: master
Commit: 34dc7964068a67d65cb71a15ec59c5b272069ad3
URL:    http://source.winehq.org/git/wine.git/?a=commit;h=34dc7964068a67d65cb71a15ec59c5b272069ad3

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Fri Sep 21 14:53:57 2012 +0200

wininet: Stop urlcache clearing when dll is being unloaded.

---

 dlls/wininet/urlcache.c |   15 ++++++++++++++-
 1 files changed, 14 insertions(+), 1 deletions(-)

diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c
index 48a88a2..8a221a8 100644
--- a/dlls/wininet/urlcache.c
+++ b/dlls/wininet/urlcache.c
@@ -2270,6 +2270,7 @@ static BOOL DeleteUrlCacheEntryInternal(const URLCACHECONTAINER * pContainer,
 }
 
 static HANDLE free_cache_running;
+static HANDLE dll_unload_event;
 static DWORD WINAPI handle_full_cache_worker(void *param)
 {
     FreeUrlCacheSpaceW(NULL, 20, 0);
@@ -2523,6 +2524,10 @@ BOOL WINAPI FreeUrlCacheSpaceW(LPCWSTR cache_path, DWORD size, DWORD filter)
 
                 /* Allow other threads to use cache while cleaning */
                 URLCacheContainer_UnlockIndex(container, header);
+                if(WaitForSingleObject(dll_unload_event, 0) == WAIT_OBJECT_0) {
+                    TRACE("got dll_unload_event - finishing\n");
+                    return TRUE;
+                }
                 Sleep(0);
                 header = URLCacheContainer_LockIndex(container);
             }
@@ -4342,9 +4347,15 @@ DWORD WINAPI RunOnceUrlCache(HWND hwnd, HINSTANCE hinst, LPSTR cmd, int cmdshow)
 
 BOOL init_urlcache(void)
 {
+    dll_unload_event = CreateEventW(NULL, FALSE, FALSE, NULL);
+    if(!dll_unload_event)
+        return FALSE;
+
     free_cache_running = CreateSemaphoreW(NULL, 1, 1, NULL);
-    if(!free_cache_running)
+    if(!free_cache_running) {
+        CloseHandle(dll_unload_event);
         return FALSE;
+    }
 
     URLCacheContainers_CreateDefaults();
     return TRUE;
@@ -4352,9 +4363,11 @@ BOOL init_urlcache(void)
 
 void free_urlcache(void)
 {
+    SetEvent(dll_unload_event);
     WaitForSingleObject(free_cache_running, INFINITE);
     ReleaseSemaphore(free_cache_running, 1, NULL);
     CloseHandle(free_cache_running);
+    CloseHandle(dll_unload_event);
 
     URLCacheContainers_DeleteAll();
 }




More information about the wine-cvs mailing list