Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / ManagedLibraries / Remoting / Channels / IPC / PortCache.cs / 1305376 / PortCache.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //============================================================================ // File: PortCache.cs // Author: [....]@Microsoft.Com // Summary: Implements a cache for port handles // //========================================================================= using System; using System.Collections; using System.Threading; using System.Security.Principal; namespace System.Runtime.Remoting.Channels.Ipc { internal class PortConnection { private IpcPort _port; private DateTime _socketLastUsed; internal PortConnection(IpcPort port) { _port = port; _socketLastUsed = DateTime.Now; } internal IpcPort Port { get { return _port; } } internal DateTime LastUsed { get { return _socketLastUsed; } } } internal class ConnectionCache { // collection of RemoteConnection's. private static Hashtable _connections = new Hashtable(); // socket timeout data private static RegisteredWaitHandle _registeredWaitHandle; private static WaitOrTimerCallback _socketTimeoutDelegate; private static AutoResetEvent _socketTimeoutWaitHandle; private static TimeSpan _socketTimeoutPollTime = TimeSpan.FromSeconds(10); private static TimeSpan _portLifetime = TimeSpan.FromSeconds(10); static ConnectionCache() { InitializeConnectionTimeoutHandler(); } private static void InitializeConnectionTimeoutHandler() { _socketTimeoutDelegate = new WaitOrTimerCallback(TimeoutConnections); _socketTimeoutWaitHandle = new AutoResetEvent(false); _registeredWaitHandle = ThreadPool.UnsafeRegisterWaitForSingleObject( _socketTimeoutWaitHandle, _socketTimeoutDelegate, "IpcConnectionTimeout", _socketTimeoutPollTime, true); // execute only once } // InitializeSocketTimeoutHandler private static void TimeoutConnections(Object state, Boolean wasSignalled) { DateTime currentTime = DateTime.UtcNow; lock (_connections) { foreach (DictionaryEntry entry in _connections) { PortConnection connection = (PortConnection)entry.Value; if (DateTime.Now - connection.LastUsed > _portLifetime) connection.Port.Dispose(); } } _registeredWaitHandle.Unregister(null); _registeredWaitHandle = ThreadPool.UnsafeRegisterWaitForSingleObject( _socketTimeoutWaitHandle, _socketTimeoutDelegate, "IpcConnectionTimeout", _socketTimeoutPollTime, true); // execute only once } // TimeoutConnections // The key is expected to of the form portName public IpcPort GetConnection(String portName, bool secure, TokenImpersonationLevel level, int timeout) { PortConnection connection = null; lock (_connections) { bool cacheable = true; if (secure) { try { WindowsIdentity currentId = WindowsIdentity.GetCurrent(true/*ifImpersonating*/); if (currentId != null) { cacheable = false; currentId.Dispose(); } } catch(Exception) { cacheable = false; } } if (cacheable) { connection = (PortConnection)_connections[portName]; } if (connection == null || connection.Port.IsDisposed) { connection = new PortConnection(IpcPort.Connect(portName, secure, level, timeout)); connection.Port.Cacheable = cacheable; } else { // Remove the connection from the cache _connections.Remove(portName); } } return connection.Port; } // GetSocket public void ReleaseConnection(IpcPort port) { string portName = port.Name; PortConnection connection = (PortConnection)_connections[portName]; if (port.Cacheable && (connection == null || connection.Port.IsDisposed)) { lock(_connections) { _connections[portName] = new PortConnection(port); } } else { // there should have been a connection, so let's just close // this socket. port.Dispose(); } } // ReleasePort } // ConnectionCache } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //============================================================================ // File: PortCache.cs // Author: [....]@Microsoft.Com // Summary: Implements a cache for port handles // //========================================================================= using System; using System.Collections; using System.Threading; using System.Security.Principal; namespace System.Runtime.Remoting.Channels.Ipc { internal class PortConnection { private IpcPort _port; private DateTime _socketLastUsed; internal PortConnection(IpcPort port) { _port = port; _socketLastUsed = DateTime.Now; } internal IpcPort Port { get { return _port; } } internal DateTime LastUsed { get { return _socketLastUsed; } } } internal class ConnectionCache { // collection of RemoteConnection's. private static Hashtable _connections = new Hashtable(); // socket timeout data private static RegisteredWaitHandle _registeredWaitHandle; private static WaitOrTimerCallback _socketTimeoutDelegate; private static AutoResetEvent _socketTimeoutWaitHandle; private static TimeSpan _socketTimeoutPollTime = TimeSpan.FromSeconds(10); private static TimeSpan _portLifetime = TimeSpan.FromSeconds(10); static ConnectionCache() { InitializeConnectionTimeoutHandler(); } private static void InitializeConnectionTimeoutHandler() { _socketTimeoutDelegate = new WaitOrTimerCallback(TimeoutConnections); _socketTimeoutWaitHandle = new AutoResetEvent(false); _registeredWaitHandle = ThreadPool.UnsafeRegisterWaitForSingleObject( _socketTimeoutWaitHandle, _socketTimeoutDelegate, "IpcConnectionTimeout", _socketTimeoutPollTime, true); // execute only once } // InitializeSocketTimeoutHandler private static void TimeoutConnections(Object state, Boolean wasSignalled) { DateTime currentTime = DateTime.UtcNow; lock (_connections) { foreach (DictionaryEntry entry in _connections) { PortConnection connection = (PortConnection)entry.Value; if (DateTime.Now - connection.LastUsed > _portLifetime) connection.Port.Dispose(); } } _registeredWaitHandle.Unregister(null); _registeredWaitHandle = ThreadPool.UnsafeRegisterWaitForSingleObject( _socketTimeoutWaitHandle, _socketTimeoutDelegate, "IpcConnectionTimeout", _socketTimeoutPollTime, true); // execute only once } // TimeoutConnections // The key is expected to of the form portName public IpcPort GetConnection(String portName, bool secure, TokenImpersonationLevel level, int timeout) { PortConnection connection = null; lock (_connections) { bool cacheable = true; if (secure) { try { WindowsIdentity currentId = WindowsIdentity.GetCurrent(true/*ifImpersonating*/); if (currentId != null) { cacheable = false; currentId.Dispose(); } } catch(Exception) { cacheable = false; } } if (cacheable) { connection = (PortConnection)_connections[portName]; } if (connection == null || connection.Port.IsDisposed) { connection = new PortConnection(IpcPort.Connect(portName, secure, level, timeout)); connection.Port.Cacheable = cacheable; } else { // Remove the connection from the cache _connections.Remove(portName); } } return connection.Port; } // GetSocket public void ReleaseConnection(IpcPort port) { string portName = port.Name; PortConnection connection = (PortConnection)_connections[portName]; if (port.Cacheable && (connection == null || connection.Port.IsDisposed)) { lock(_connections) { _connections[portName] = new PortConnection(port); } } else { // there should have been a connection, so let's just close // this socket. port.Dispose(); } } // ReleasePort } // ConnectionCache } // File provided for Reference Use Only by Microsoft Corporation (c) 2007.
Link Menu
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- DES.cs
- ExtenderProviderService.cs
- BrowserCapabilitiesCodeGenerator.cs
- MetadataItem_Static.cs
- ActivationArguments.cs
- InputMethodStateTypeInfo.cs
- ExtensionSurface.cs
- X500Name.cs
- ListDataHelper.cs
- PassportIdentity.cs
- EDesignUtil.cs
- HttpHandlersInstallComponent.cs
- DesignerCommandAdapter.cs
- ConvertBinder.cs
- DecimalConstantAttribute.cs
- XmlSortKeyAccumulator.cs
- PathNode.cs
- ApplicationId.cs
- TypefaceMap.cs
- XmlExceptionHelper.cs
- DataBindingHandlerAttribute.cs
- BinaryUtilClasses.cs
- StandardBindingReliableSessionElement.cs
- Rotation3DKeyFrameCollection.cs
- SmtpSection.cs
- CellRelation.cs
- WebServiceEnumData.cs
- QilChoice.cs
- MsmqIntegrationSecurityMode.cs
- AlphaSortedEnumConverter.cs
- OdbcDataReader.cs
- XmlLanguage.cs
- GlobalizationAssembly.cs
- Label.cs
- PropertyValueChangedEvent.cs
- CodeArgumentReferenceExpression.cs
- WorkflowInvoker.cs
- HtmlSelectionListAdapter.cs
- PairComparer.cs
- DurableOperationAttribute.cs
- NavigationCommands.cs
- JoinElimination.cs
- SocketElement.cs
- ObjectTag.cs
- FrameworkContextData.cs
- DescriptionAttribute.cs
- HealthMonitoringSection.cs
- XmlEntity.cs
- SelectionPatternIdentifiers.cs
- FileChangesMonitor.cs
- ReadOnlyAttribute.cs
- ReverseComparer.cs
- AddInToken.cs
- HatchBrush.cs
- StorageAssociationSetMapping.cs
- UserPreferenceChangingEventArgs.cs
- MemoryFailPoint.cs
- DetailsViewRow.cs
- CaseStatement.cs
- XPathNodePointer.cs
- SecurityUtils.cs
- CachedPathData.cs
- DotExpr.cs
- InertiaExpansionBehavior.cs
- Point3DAnimationBase.cs
- AutomationElementCollection.cs
- TextCompositionManager.cs
- StrokeNodeOperations.cs
- MetaModel.cs
- HtmlInputSubmit.cs
- SessionEndingCancelEventArgs.cs
- TextEditorDragDrop.cs
- HtmlElementCollection.cs
- Parser.cs
- recordstatefactory.cs
- CharacterMetrics.cs
- DoubleStorage.cs
- MenuAdapter.cs
- XmlNamespaceManager.cs
- HtmlInputSubmit.cs
- HttpCacheVaryByContentEncodings.cs
- MaterialGroup.cs
- TextEditorTyping.cs
- InheritanceService.cs
- FontWeightConverter.cs
- RectangleHotSpot.cs
- EntityDataSourceDataSelectionPanel.designer.cs
- AuthStoreRoleProvider.cs
- BuildProviderUtils.cs
- Int16KeyFrameCollection.cs
- ProcessHostServerConfig.cs
- CultureInfo.cs
- ScrollBar.cs
- COM2ExtendedBrowsingHandler.cs
- TextEffectCollection.cs
- RemoteWebConfigurationHost.cs
- ResourceSet.cs
- Hash.cs
- SystemParameters.cs
- FormViewDeleteEventArgs.cs