/* * Remove an entry, from the cache. * All the entry clients are removed too! (it may stop rendering of this * same resource on other windows, but nothing more). */ static void Cache_entry_remove(CacheEntry_t *entry, DilloUrl *url) { int i; CacheClient_t *Client; if (!entry && !(entry = Cache_entry_search(url))) return; if (entry->Flags & CA_InternalUrl) return; /* remove all clients for this entry */ for (i = 0; (Client = dList_nth_data(ClientQueue, i)); ++i) { if (Client->Url == entry->Url) { a_Cache_stop_client(Client->Key); --i; } } /* remove from DelayedQueue */ dList_remove(DelayedQueue, entry); /* remove from dicache */ a_Dicache_invalidate_entry(entry->Url); /* remove from cache */ dList_remove(CachedURLs, entry); Cache_entry_free(entry); }
/* * Remove a client from the cache client queue. * force = also abort the CCC if this is the last client. */ void a_Capi_stop_client(int Key, int force) { CacheClient_t *Client; _MSG("a_Capi_stop_client: force=%d\n", force); Client = a_Cache_client_get_if_unique(Key); if (Client && (force || Client->BufSize == 0)) { /* remove empty entries too */ a_Capi_conn_abort_by_url(Client->Url); } a_Cache_stop_client(Key); }