+
+ debugs(20, 7, "entry " << e);
+
+ switch (e.mem_obj->memCache.io) {
+ case MemObject::MemCache::ioUndecided:
+ if (!shouldCache(e) || !startCaching(e)) {
+ e.mem_obj->memCache.io = MemObject::MemCache::ioDone;
+ Store::Root().transientsAbandon(e);
+ CollapsedForwarding::Broadcast(static_cast<cache_key*>(e.key));
+ return;
+ }
+ break;
+
+ case MemObject::MemCache::ioDone:
+ case MemObject::MemCache::ioReading:
+ return; // we should not write in all of the above cases
+
+ case MemObject::MemCache::ioWriting:
+ break; // already decided to write and still writing
+ }
+
+ try {
+ copyToShm(e);
+ if (e.store_status == STORE_OK) // done receiving new content
+ completeWriting(e);
+ CollapsedForwarding::Broadcast(static_cast<cache_key*>(e.key));
+ return;
+ }
+ catch (const std::exception &x) { // TODO: should we catch ... as well?
+ debugs(20, 2, "mem-caching error writing entry " << e << ": " << x.what());
+ // fall through to the error handling code
+ }
+
+ Store::Root().transientsAbandon(e);
+ disconnect(*e.mem_obj);
+ CollapsedForwarding::Broadcast(static_cast<cache_key*>(e.key));
+}
+
+void
+MemStore::completeWriting(StoreEntry &e)
+{
+ assert(e.mem_obj);
+ const int32_t index = e.mem_obj->memCache.index;
+ assert(index >= 0);
+ assert(map);
+
+ debugs(20, 5, "mem-cached all " << e.mem_obj->memCache.offset << " bytes of " << e);
+
+ e.mem_obj->memCache.index = -1;
+ e.mem_obj->memCache.io = MemObject::MemCache::ioDone;
+ map->closeForWriting(index, false);
+}
+
+void
+MemStore::unlink(StoreEntry &e)
+{
+ assert(e.mem_status == IN_MEMORY);
+ MemObject *mem_obj = e.findMemObject();
+ assert(mem_obj);
+ if (mem_obj->memCache.index >= 0) {
+ map->freeEntry(mem_obj->memCache.index);
+ disconnect(*mem_obj);