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