File: net\System\Net\_SSPISessionCache.cs
Project: ndp\fx\src\System.csproj (System)
/*++
Copyright (c) Microsoft Corporation
 
Module Name:
 
    _SspiSessionCache.cs
 
Abstract:
    The file implements trivial SSPI credential caching mechanism based on lru list
 
 
Author:
 
    Alexei Vopilov    20-Oct-2004
 
Revision History:
 
 
--*/
namespace System.Net.Security {
using System.Net;
using System.Threading;
using System.Collections;
 
 
    //
    // Implements delayed SSPI handle release, like a finalizable object though the handles are kept alive until being pushed out
    // by the newly incoming ones.
    //
    internal static class SSPIHandleCache
    {
          private const int                         c_MaxCacheSize = 0x1F;  // must a (power of 2) - 1
          private static SafeCredentialReference[]  _CacheSlots = new SafeCredentialReference[c_MaxCacheSize+1];
          private static int                        _Current = -1;
 
          internal static void CacheCredential(SafeFreeCredentials newHandle)
          {
                try {
                    SafeCredentialReference newRef = SafeCredentialReference.CreateReference(newHandle);
                    if (newRef == null)
                        return;
                    unchecked
                    {
                        int index = Interlocked.Increment(ref _Current) & c_MaxCacheSize;
                        newRef = Interlocked.Exchange<SafeCredentialReference>(ref _CacheSlots[index], newRef);
                    }
                    if (newRef != null)
                        newRef.Close();
                }
                catch(Exception e) {
                    if (!NclUtilities.IsFatal(e)){
                        GlobalLog.Assert("SSPIHandlCache", "Attempted to throw: " + e.ToString());
                    }
                }
          }
    }
}