Piotr Caban : wininet: Unlock urlcache entries that were locked for over a day.

Alexandre Julliard julliard at winehq.org
Tue Sep 18 14:04:30 CDT 2012


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

Author: Piotr Caban <piotr at codeweavers.com>
Date:   Tue Sep 18 14:43:44 2012 +0200

wininet: Unlock urlcache entries that were locked for over a day.

---

 dlls/wininet/urlcache.c |   43 +++++++++++++++++++++++++++++++++++++------
 1 files changed, 37 insertions(+), 6 deletions(-)

diff --git a/dlls/wininet/urlcache.c b/dlls/wininet/urlcache.c
index 1b62fda..e1d189e 100644
--- a/dlls/wininet/urlcache.c
+++ b/dlls/wininet/urlcache.c
@@ -1553,6 +1553,38 @@ static BOOL URLCache_DeleteCacheDirectory(LPCWSTR lpszPath)
 }
 
 /***********************************************************************
+ *           URLCache_IsLocked (Internal)
+ *
+ *  Checks if entry is locked. Unlocks it if possible.
+ */
+static BOOL URLCache_IsLocked(struct _HASH_ENTRY *hash_entry, URL_CACHEFILE_ENTRY *url_entry)
+{
+    FILETIME cur_time;
+    ULARGE_INTEGER acc_time, time;
+
+    if ((hash_entry->dwHashKey & ((1<<HASHTABLE_FLAG_BITS)-1)) != HASHTABLE_LOCK)
+        return FALSE;
+
+    GetSystemTimeAsFileTime(&cur_time);
+    time.u.LowPart = cur_time.dwLowDateTime;
+    time.u.HighPart = cur_time.dwHighDateTime;
+
+    acc_time.u.LowPart = url_entry->LastAccessTime.dwLowDateTime;
+    acc_time.u.HighPart = url_entry->LastAccessTime.dwHighDateTime;
+
+    time.QuadPart -= acc_time.QuadPart;
+
+    /* check if entry was locked for at least a day */
+    if(time.QuadPart > (ULONGLONG)24*60*60*10000000) {
+        URLCache_HashEntrySetFlags(hash_entry, HASHTABLE_URL);
+        url_entry->dwUseCount = 0;
+        return FALSE;
+    }
+
+    return TRUE;
+}
+
+/***********************************************************************
  *           FreeUrlCacheSpaceW (WININET.@)
  *
  * Frees up some cache.
@@ -2193,9 +2225,8 @@ static BOOL DeleteUrlCacheEntryInternal(const URLCACHECONTAINER * pContainer,
     }
 
     pUrlEntry = (URL_CACHEFILE_ENTRY *)pEntry;
-    if ((pHashEntry->dwHashKey & ((1<<HASHTABLE_FLAG_BITS)-1)) == HASHTABLE_LOCK)
+    if(URLCache_IsLocked(pHashEntry, pUrlEntry))
     {
-        /* FIXME: implement timeout object unlocking */
         TRACE("Trying to delete locked entry\n");
         pUrlEntry->CacheEntryType |= PENDING_DELETE_CACHE_ENTRY;
         SetLastError(ERROR_SHARING_VIOLATION);
@@ -2736,11 +2767,11 @@ static BOOL CommitUrlCacheEntryInternal(
 
     if (URLCache_FindHash(pHeader, lpszUrlNameA, &pHashEntry))
     {
-        if ((pHashEntry->dwHashKey & ((1<<HASHTABLE_FLAG_BITS)-1)) == HASHTABLE_LOCK)
+        URL_CACHEFILE_ENTRY *pUrlEntry = (URL_CACHEFILE_ENTRY*)((LPBYTE)pHeader + pHashEntry->dwOffsetEntry);
+        if (URLCache_IsLocked(pHashEntry, pUrlEntry))
         {
-            /* FIXME: implement timeout object unlocking */
-            FIXME("Trying to overwrite locked entry\n");
-            SetLastError(ERROR_SHARING_VIOLATION);
+            TRACE("Trying to overwrite locked entry\n");
+            error = ERROR_SHARING_VIOLATION;
             goto cleanup;
         }
 




More information about the wine-cvs mailing list