public override void SetAndReleaseItemExclusive (HttpContext context,
string id,
SessionStateStoreData item,
object lockId,
bool newItem)
{
EnsureGoodId (id, true);
string CacheId = CachePrefix + id;
Cache cache = HttpRuntime.InternalCache;
InProcSessionItem inProcItem = cache [CacheId] as InProcSessionItem;
ISessionStateItemCollection itemItems = null;
int itemTimeout = 20;
HttpStaticObjectsCollection itemStaticItems = null;
if (item != null) {
itemItems = item.Items;
itemTimeout = item.Timeout;
itemStaticItems = item.StaticObjects;
}
if (newItem || inProcItem == null) {
inProcItem = new InProcSessionItem ();
inProcItem.timeout = itemTimeout;
inProcItem.expiresAt = DateTime.UtcNow.AddMinutes (itemTimeout);
if (lockId.GetType() == typeof(Int32))
inProcItem.lockId = (Int32)lockId;
} else {
if (lockId == null || lockId.GetType() != typeof(Int32) || inProcItem.lockId != (Int32)lockId)
return;
inProcItem.resettingTimeout = true;
cache.Remove (CacheId);
}
bool locked = false;
try {
if (inProcItem.rwlock.TryEnterWriteLock (lockAcquireTimeout))
locked = true;
else
throw new ApplicationException ("Failed to acquire lock");
inProcItem.locked = false;
inProcItem.items = itemItems;
inProcItem.staticItems = itemStaticItems;
InsertSessionItem (inProcItem, itemTimeout, CacheId);
} catch {
throw;
} finally {
if (locked)
inProcItem.rwlock.ExitWriteLock ();
}
}