Module: wine Branch: master Commit: ed71ed596fcd2a613d982462c6b435b7eb808a98 URL: http://source.winehq.org/git/wine.git/?a=commit;h=ed71ed596fcd2a613d982462c6...
Author: Piotr Caban piotr@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(); +}