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