Piotr Caban : wininet: Call FreeUrlCacheSpaceW when cache is full.
Alexandre Julliard
julliard at winehq.org
Fri Sep 21 14:22:41 CDT 2012
Module: wine
Branch: master
Commit: ed71ed596fcd2a613d982462c6b435b7eb808a98
URL: http://source.winehq.org/git/wine.git/?a=commit;h=ed71ed596fcd2a613d982462c6b435b7eb808a98
Author: Piotr Caban <piotr at codeweavers.com>
Date: Fri Sep 21 14:53:33 2012 +0200
wininet: Call FreeUrlCacheSpaceW when cache is full.
---
dlls/wininet/internet.c | 8 ++++++--
dlls/wininet/internet.h | 4 ++--
dlls/wininet/urlcache.c | 38 ++++++++++++++++++++++++++++++++++++--
3 files changed, 44 insertions(+), 6 deletions(-)
diff --git a/dlls/wininet/internet.c b/dlls/wininet/internet.c
index 9091ce8..a6dbaa1 100644
--- a/dlls/wininet/internet.c
+++ b/dlls/wininet/internet.c
@@ -292,7 +292,11 @@ BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
if (g_dwTlsErrIndex == TLS_OUT_OF_INDEXES)
return FALSE;
- URLCacheContainers_CreateDefaults();
+ if(!init_urlcache())
+ {
+ TlsFree(g_dwTlsErrIndex);
+ return FALSE;
+ }
WININET_hModule = hinstDLL;
break;
@@ -310,7 +314,7 @@ BOOL WINAPI DllMain (HINSTANCE hinstDLL, DWORD fdwReason, LPVOID lpvReserved)
case DLL_PROCESS_DETACH:
collect_connections(COLLECT_CLEANUP);
NETCON_unload();
- URLCacheContainers_DeleteAll();
+ free_urlcache();
if (g_dwTlsErrIndex != TLS_OUT_OF_INDEXES)
{
diff --git a/dlls/wininet/internet.h b/dlls/wininet/internet.h
index e3fb530..a4fcdaa 100644
--- a/dlls/wininet/internet.h
+++ b/dlls/wininet/internet.h
@@ -551,8 +551,8 @@ int sock_get_error(int) DECLSPEC_HIDDEN;
server_t *get_server(const WCHAR*,INTERNET_PORT,BOOL);
-extern void URLCacheContainers_CreateDefaults(void) DECLSPEC_HIDDEN;
-extern void URLCacheContainers_DeleteAll(void) DECLSPEC_HIDDEN;
+BOOL init_urlcache(void) DECLSPEC_HIDDEN;
+void free_urlcache(void) DECLSPEC_HIDDEN;
#define MAX_REPLY_LEN 0x5B4
diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c
index 379288a..81ef5b6 100644
--- a/dlls/wininet/urlcache.c
+++ b/dlls/wininet/urlcache.c
@@ -2326,6 +2326,22 @@ static BOOL DeleteUrlCacheEntryInternal(const URLCACHECONTAINER * pContainer,
return TRUE;
}
+static HANDLE free_cache_running;
+static DWORD WINAPI handle_full_cache_worker(void *param)
+{
+ FreeUrlCacheSpaceW(NULL, 20, 0);
+ ReleaseSemaphore(free_cache_running, 1, NULL);
+ return 0;
+}
+
+static void handle_full_cache(void)
+{
+ if(WaitForSingleObject(free_cache_running, 0) == WAIT_OBJECT_0) {
+ if(!QueueUserWorkItem(handle_full_cache_worker, NULL, 0))
+ ReleaseSemaphore(free_cache_running, 1, NULL);
+ }
+}
+
/***********************************************************************
* UnlockUrlCacheEntryFileA (WININET.@)
*
@@ -2712,7 +2728,6 @@ BOOL WINAPI CreateUrlCacheEntryW(
return FALSE;
}
-
/***********************************************************************
* CommitUrlCacheEntryInternal (Compensates for an MS bug)
*
@@ -2969,7 +2984,7 @@ static BOOL CommitUrlCacheEntryInternal(
pHeader->CacheUsage.QuadPart += file_size.QuadPart;
if (pHeader->CacheUsage.QuadPart + pHeader->ExemptUsage.QuadPart >
pHeader->CacheLimit.QuadPart)
- FIXME("file of size %s bytes fills cache\n", wine_dbgstr_longlong(file_size.QuadPart));
+ handle_full_cache();
}
cleanup:
@@ -4114,3 +4129,22 @@ DWORD WINAPI RunOnceUrlCache(HWND hwnd, HINSTANCE hinst, LPSTR cmd, int cmdshow)
FIXME("(%p, %p, %s, %d): stub\n", hwnd, hinst, debugstr_a(cmd), cmdshow);
return 0;
}
+
+BOOL init_urlcache(void)
+{
+ free_cache_running = CreateSemaphoreW(NULL, 1, 1, NULL);
+ if(!free_cache_running)
+ return FALSE;
+
+ URLCacheContainers_CreateDefaults();
+ return TRUE;
+}
+
+void free_urlcache(void)
+{
+ WaitForSingleObject(free_cache_running, INFINITE);
+ ReleaseSemaphore(free_cache_running, 1, NULL);
+ CloseHandle(free_cache_running);
+
+ URLCacheContainers_DeleteAll();
+}
More information about the wine-cvs
mailing list