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