Various shared memory-based collapsed forwarding improvements and fixes.
Lock transient entries while in use. Transient entry presence is used
used to detect collapsed entry aborts for not-yet-cached entries.
Store current transient locks and memory cache entry state in MemObject. Why
not in StoreEntry like the disk cache does? To avoid penalizing those Stores
that keep idle StoreEntries in RAM.
Mark collapsing entries specially (in MemObject) so that we can stop updating
(un-tie) local entries that tried to collapse but did not like the collapsed
hit object that they started to get from another worker. When this happens,
the client side creates a new StoreEntry, but without a flag Store cannot tell
whether that entry needs to be kept in sync with the collapsed writer because
both the old entry and the new one have the same key. We may eventually find
a better way to distinguish the two cases.
Do not require MemObjects to be disassociated from various caches during
shutdown because Squid is currently incapable of maintaining Store::Root()
during shutdown.
Support incremental shared memory caching. Maintain and honor the
ENTRY_FWD_HDR_WAIT flag. Maintain shared memory cache reading/writing states.
Better updates of collapsed entries. Detect aborted entries. Do not release
entries that are not yet cached anywhere at the update time.