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