// are we using a shared memory cache?
if (Config.memShared && IamWorkerProcess()) {
- assert(new_status != IN_MEMORY); // we do not call this otherwise
+ // enumerate calling cases if shared memory is enabled
+ assert(new_status != IN_MEMORY || EBIT_TEST(flags, ENTRY_SPECIAL));
// This method was designed to update replacement policy, not to
// actually purge something from the memory cache (TODO: rename?).
// Shared memory cache does not have a policy that needs updates.
if (mem_status == IN_MEMORY)
return;
+ if (EBIT_TEST(flags, ENTRY_SPECIAL))
+ return; // cannot trim because we do not load them again
+
if (!preserveSwappable) {
if (mem_obj->policyLowestOffsetToKeep(0) == 0) {
/* Nothing to do */
void
StoreController::reference(StoreEntry &e)
{
+ // special entries do not belong to any specific Store, but are IN_MEMORY
+ if (EBIT_TEST(e.flags, ENTRY_SPECIAL))
+ return;
+
/* Notify the fs that we're referencing this object again */
if (e.swap_dirn > -1)
{
bool keepInStoreTable = true; // keep if there are no objections
+ // special entries do not belong to any specific Store, but are IN_MEMORY
+ if (EBIT_TEST(e.flags, ENTRY_SPECIAL))
+ return keepInStoreTable;
+
/* Notify the fs that we're not referencing this object any more */
if (e.swap_filen > -1)
StoreController::handleIdleEntry(StoreEntry &e)
{
bool keepInLocalMemory = false;
+
+ if (EBIT_TEST(e.flags, ENTRY_SPECIAL)) {
+ // Icons (and cache digests?) should stay in store_table until we
+ // have a dedicated storage for them (that would not purge them).
+ // They are not managed [well] by any specific Store handled below.
+ keepInLocalMemory = true;
+ } else
if (memStore) {
memStore->considerKeeping(e);
// leave keepInLocalMemory false; memStore maintains its own cache
return;
}
+ debugs(20, 5, HERE << "keepInLocalMemory: " << keepInLocalMemory);
+
// TODO: move this into [non-shared] memory cache class when we have one
if (keepInLocalMemory) {
e.setMemStatus(IN_MEMORY);