Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Runtime / Remoting / LifetimeServices.cs / 1305376 / LifetimeServices.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //+---------------------------------------------------------------------------- // // Microsoft Windows // File: LifetimeServices.cs // // Contents: Used to obtain a lease < // //+--------------------------------------------------------------------------- namespace System.Runtime.Remoting.Lifetime { using System; using System.Threading; using System.Security; using System.Security.Permissions; using System.Runtime.Remoting.Contexts; using System.Runtime.Remoting.Messaging; using System.Globalization; // access needs to be restricted [System.Security.SecurityCritical] // auto-generated_required [System.Runtime.InteropServices.ComVisible(true)] public sealed class LifetimeServices { // Set once boolean private static bool isLeaseTime = false; private static bool isRenewOnCallTime = false; private static bool isSponsorshipTimeout = false; // Default values private static TimeSpan m_leaseTime = TimeSpan.FromMinutes(5); private static TimeSpan m_renewOnCallTime = TimeSpan.FromMinutes(2); private static TimeSpan m_sponsorshipTimeout = TimeSpan.FromMinutes(2); private static TimeSpan m_pollTime = TimeSpan.FromMilliseconds(10000); // Testing values //private static TimeSpan m_leaseTime = TimeSpan.FromSeconds(20); //private static TimeSpan m_renewOnCallTime = TimeSpan.FromSeconds(20); //private static TimeSpan m_sponsorshipTimeout = TimeSpan.FromSeconds(20); //private static TimeSpan m_pollTime = TimeSpan.FromMilliseconds(10000); private static Object s_LifetimeSyncObject = null; private static Object LifetimeSyncObject { get { if (s_LifetimeSyncObject == null) { Object o = new Object(); Interlocked.CompareExchange(ref s_LifetimeSyncObject, o, null); } return s_LifetimeSyncObject; } } // This should have been a static class, but wasn't as of v3.5. Clearly, this is // broken. We'll keep this in V4 for binary compat, but marked obsolete as error // so migrated source code gets fixed. [Obsolete("Do not create instances of the LifetimeServices class. Call the static methods directly on this type instead", true)] public LifetimeServices() { // Should be a static type - this exists in V4 for binary compatiblity. } // Initial Lease Time span for appdomain public static TimeSpan LeaseTime { get{ return m_leaseTime; } [System.Security.SecurityCritical] // auto-generated [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] set { lock(LifetimeSyncObject) { if (isLeaseTime) throw new RemotingException(Environment.GetResourceString("Remoting_Lifetime_SetOnce", "LeaseTime")); m_leaseTime = value; isLeaseTime = true; } } } // Initial renew on call time span for appdomain public static TimeSpan RenewOnCallTime { get{ return m_renewOnCallTime; } [System.Security.SecurityCritical] // auto-generated [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] set { lock(LifetimeSyncObject) { if (isRenewOnCallTime) throw new RemotingException(Environment.GetResourceString("Remoting_Lifetime_SetOnce", "RenewOnCallTime")); m_renewOnCallTime = value; isRenewOnCallTime = true; } } } // Initial sponsorshiptimeout for appdomain public static TimeSpan SponsorshipTimeout { get{ return m_sponsorshipTimeout; } [System.Security.SecurityCritical] // auto-generated [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] set { lock(LifetimeSyncObject) { if (isSponsorshipTimeout) throw new RemotingException(Environment.GetResourceString("Remoting_Lifetime_SetOnce", "SponsorshipTimeout")); m_sponsorshipTimeout = value; isSponsorshipTimeout = true; } } } // Initial sponsorshiptimeout for appdomain public static TimeSpan LeaseManagerPollTime { get{ return m_pollTime; } [System.Security.SecurityCritical] // auto-generated [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] set { lock(LifetimeSyncObject) { m_pollTime = value; if (LeaseManager.IsInitialized()) LeaseManager.GetLeaseManager().ChangePollTime(m_pollTime); } } } [System.Security.SecurityCritical] // auto-generated internal static ILease GetLeaseInitial(MarshalByRefObject obj) { ILease lease = null; LeaseManager leaseManager = LeaseManager.GetLeaseManager(LeaseManagerPollTime); lease = (ILease)leaseManager.GetLease(obj); if (lease == null) lease = CreateLease(obj); return lease; } [System.Security.SecurityCritical] // auto-generated internal static ILease GetLease(MarshalByRefObject obj) { ILease lease = null; LeaseManager leaseManager = LeaseManager.GetLeaseManager(LeaseManagerPollTime); lease = (ILease)leaseManager.GetLease(obj); return lease; } //internal static ILease CreateLease(MarshalByRefObject obj, IMessageSink nextSink) [System.Security.SecurityCritical] // auto-generated internal static ILease CreateLease(MarshalByRefObject obj) { return CreateLease(LeaseTime, RenewOnCallTime, SponsorshipTimeout, obj); } [System.Security.SecurityCritical] // auto-generated internal static ILease CreateLease(TimeSpan leaseTime, TimeSpan renewOnCallTime, TimeSpan sponsorshipTimeout, MarshalByRefObject obj ) { // Will create leaseManager if not already created. LeaseManager.GetLeaseManager(LeaseManagerPollTime); return (ILease)(new Lease(leaseTime, renewOnCallTime, sponsorshipTimeout, obj)); } } [Serializable] internal class LeaseLifeTimeServiceProperty : IContextProperty, IContributeObjectSink { public String Name { [System.Security.SecurityCritical] // auto-generated get {return "LeaseLifeTimeServiceProperty";} } [System.Security.SecurityCritical] // auto-generated public bool IsNewContextOK(Context newCtx) { return true; } [System.Security.SecurityCritical] // auto-generated public void Freeze(Context newContext) { } // Initiates the creation of a lease // Creates a sink for invoking a renew on call when an object is created. [System.Security.SecurityCritical] // auto-generated public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink nextSink) { bool fServer; ServerIdentity identity = (ServerIdentity)MarshalByRefObject.GetIdentity(obj, out fServer); BCLDebug.Assert(identity != null, "[LifetimeServices.GetObjectSink] identity != null"); // NOTE: Single Call objects do not have a lease associated with it because they last // only for the duration of the call. // Singleton objects on the other hand do have leases associated with them and they can // be garbage collected. if (identity.IsSingleCall()) { BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, no lease SingleCall",obj,", NextSink "+nextSink); return nextSink; } // Create lease. InitializeLifetimeService is a virtual method which can be overridded so that a lease with // object specific properties can be created. Object leaseObj = obj.InitializeLifetimeService(); BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, return from InitializeLifetimeService obj ",obj,", lease ",leaseObj); // InitializeLifetimeService can return a lease in one of conditions: // 1) the lease has a null state which specifies that no lease is to be created. // 2) the lease has an initial state which specifies that InitializeLifeTimeService has created a new lease. // 3) the lease has another state which indicates that the lease has already been created and registered. if (leaseObj == null) { BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, no lease ",obj,", NextSink "+nextSink); return nextSink; } if (!(leaseObj is System.Runtime.Remoting.Lifetime.ILease)) throw new RemotingException(Environment.GetResourceString("Remoting_Lifetime_ILeaseReturn", leaseObj)); ILease ilease = (ILease)leaseObj; if (ilease.InitialLeaseTime.CompareTo(TimeSpan.Zero) <= 0) { // No lease { BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, no lease because InitialLeaseTime is Zero ",obj); if (ilease is System.Runtime.Remoting.Lifetime.Lease) { ((Lease)ilease).Remove(); } return nextSink; } } Lease lease = null; lock(identity) { if (identity.Lease != null) { // Lease already exists for object, object is being marsalled again BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, Lease already exists for object ",obj); lease = (Lease)identity.Lease; lease.Renew(lease.InitialLeaseTime); // Reset initial lease time } else { // New lease if (!(ilease is System.Runtime.Remoting.Lifetime.Lease)) { // InitializeLifetimeService created its own ILease object // Need to create a System.Runtime.Remoting.Lease object BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, New Lease, lease not of type Lease ",obj); lease = (Lease)LifetimeServices.GetLeaseInitial(obj); if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = ilease.InitialLeaseTime; lease.RenewOnCallTime = ilease.RenewOnCallTime; lease.SponsorshipTimeout = ilease.SponsorshipTimeout; } } else { // An object of Type Lease was created BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, New Lease, lease is type Lease ",obj); lease = (Lease)ilease; } // Put lease in active state // Creation phase of lease is over, properties can no longer be set on lease. identity.Lease = lease; // Place lease into identity for object // If the object has been marshaled activate // the lease if (identity.ObjectRef != null) { lease.ActivateLease(); } } } if (lease.RenewOnCallTime > TimeSpan.Zero) { // RenewOnCall create sink BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, lease created ",obj); return new LeaseSink(lease, nextSink); } else { // No RenewOnCall so no sink created BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, No RenewOnCall so no sink created ",obj); return nextSink; } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== //+---------------------------------------------------------------------------- // // Microsoft Windows // File: LifetimeServices.cs // // Contents: Used to obtain a lease < // //+--------------------------------------------------------------------------- namespace System.Runtime.Remoting.Lifetime { using System; using System.Threading; using System.Security; using System.Security.Permissions; using System.Runtime.Remoting.Contexts; using System.Runtime.Remoting.Messaging; using System.Globalization; // access needs to be restricted [System.Security.SecurityCritical] // auto-generated_required [System.Runtime.InteropServices.ComVisible(true)] public sealed class LifetimeServices { // Set once boolean private static bool isLeaseTime = false; private static bool isRenewOnCallTime = false; private static bool isSponsorshipTimeout = false; // Default values private static TimeSpan m_leaseTime = TimeSpan.FromMinutes(5); private static TimeSpan m_renewOnCallTime = TimeSpan.FromMinutes(2); private static TimeSpan m_sponsorshipTimeout = TimeSpan.FromMinutes(2); private static TimeSpan m_pollTime = TimeSpan.FromMilliseconds(10000); // Testing values //private static TimeSpan m_leaseTime = TimeSpan.FromSeconds(20); //private static TimeSpan m_renewOnCallTime = TimeSpan.FromSeconds(20); //private static TimeSpan m_sponsorshipTimeout = TimeSpan.FromSeconds(20); //private static TimeSpan m_pollTime = TimeSpan.FromMilliseconds(10000); private static Object s_LifetimeSyncObject = null; private static Object LifetimeSyncObject { get { if (s_LifetimeSyncObject == null) { Object o = new Object(); Interlocked.CompareExchange(ref s_LifetimeSyncObject, o, null); } return s_LifetimeSyncObject; } } // This should have been a static class, but wasn't as of v3.5. Clearly, this is // broken. We'll keep this in V4 for binary compat, but marked obsolete as error // so migrated source code gets fixed. [Obsolete("Do not create instances of the LifetimeServices class. Call the static methods directly on this type instead", true)] public LifetimeServices() { // Should be a static type - this exists in V4 for binary compatiblity. } // Initial Lease Time span for appdomain public static TimeSpan LeaseTime { get{ return m_leaseTime; } [System.Security.SecurityCritical] // auto-generated [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] set { lock(LifetimeSyncObject) { if (isLeaseTime) throw new RemotingException(Environment.GetResourceString("Remoting_Lifetime_SetOnce", "LeaseTime")); m_leaseTime = value; isLeaseTime = true; } } } // Initial renew on call time span for appdomain public static TimeSpan RenewOnCallTime { get{ return m_renewOnCallTime; } [System.Security.SecurityCritical] // auto-generated [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] set { lock(LifetimeSyncObject) { if (isRenewOnCallTime) throw new RemotingException(Environment.GetResourceString("Remoting_Lifetime_SetOnce", "RenewOnCallTime")); m_renewOnCallTime = value; isRenewOnCallTime = true; } } } // Initial sponsorshiptimeout for appdomain public static TimeSpan SponsorshipTimeout { get{ return m_sponsorshipTimeout; } [System.Security.SecurityCritical] // auto-generated [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] set { lock(LifetimeSyncObject) { if (isSponsorshipTimeout) throw new RemotingException(Environment.GetResourceString("Remoting_Lifetime_SetOnce", "SponsorshipTimeout")); m_sponsorshipTimeout = value; isSponsorshipTimeout = true; } } } // Initial sponsorshiptimeout for appdomain public static TimeSpan LeaseManagerPollTime { get{ return m_pollTime; } [System.Security.SecurityCritical] // auto-generated [SecurityPermissionAttribute(SecurityAction.Demand, Flags=SecurityPermissionFlag.RemotingConfiguration)] set { lock(LifetimeSyncObject) { m_pollTime = value; if (LeaseManager.IsInitialized()) LeaseManager.GetLeaseManager().ChangePollTime(m_pollTime); } } } [System.Security.SecurityCritical] // auto-generated internal static ILease GetLeaseInitial(MarshalByRefObject obj) { ILease lease = null; LeaseManager leaseManager = LeaseManager.GetLeaseManager(LeaseManagerPollTime); lease = (ILease)leaseManager.GetLease(obj); if (lease == null) lease = CreateLease(obj); return lease; } [System.Security.SecurityCritical] // auto-generated internal static ILease GetLease(MarshalByRefObject obj) { ILease lease = null; LeaseManager leaseManager = LeaseManager.GetLeaseManager(LeaseManagerPollTime); lease = (ILease)leaseManager.GetLease(obj); return lease; } //internal static ILease CreateLease(MarshalByRefObject obj, IMessageSink nextSink) [System.Security.SecurityCritical] // auto-generated internal static ILease CreateLease(MarshalByRefObject obj) { return CreateLease(LeaseTime, RenewOnCallTime, SponsorshipTimeout, obj); } [System.Security.SecurityCritical] // auto-generated internal static ILease CreateLease(TimeSpan leaseTime, TimeSpan renewOnCallTime, TimeSpan sponsorshipTimeout, MarshalByRefObject obj ) { // Will create leaseManager if not already created. LeaseManager.GetLeaseManager(LeaseManagerPollTime); return (ILease)(new Lease(leaseTime, renewOnCallTime, sponsorshipTimeout, obj)); } } [Serializable] internal class LeaseLifeTimeServiceProperty : IContextProperty, IContributeObjectSink { public String Name { [System.Security.SecurityCritical] // auto-generated get {return "LeaseLifeTimeServiceProperty";} } [System.Security.SecurityCritical] // auto-generated public bool IsNewContextOK(Context newCtx) { return true; } [System.Security.SecurityCritical] // auto-generated public void Freeze(Context newContext) { } // Initiates the creation of a lease // Creates a sink for invoking a renew on call when an object is created. [System.Security.SecurityCritical] // auto-generated public IMessageSink GetObjectSink(MarshalByRefObject obj, IMessageSink nextSink) { bool fServer; ServerIdentity identity = (ServerIdentity)MarshalByRefObject.GetIdentity(obj, out fServer); BCLDebug.Assert(identity != null, "[LifetimeServices.GetObjectSink] identity != null"); // NOTE: Single Call objects do not have a lease associated with it because they last // only for the duration of the call. // Singleton objects on the other hand do have leases associated with them and they can // be garbage collected. if (identity.IsSingleCall()) { BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, no lease SingleCall",obj,", NextSink "+nextSink); return nextSink; } // Create lease. InitializeLifetimeService is a virtual method which can be overridded so that a lease with // object specific properties can be created. Object leaseObj = obj.InitializeLifetimeService(); BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, return from InitializeLifetimeService obj ",obj,", lease ",leaseObj); // InitializeLifetimeService can return a lease in one of conditions: // 1) the lease has a null state which specifies that no lease is to be created. // 2) the lease has an initial state which specifies that InitializeLifeTimeService has created a new lease. // 3) the lease has another state which indicates that the lease has already been created and registered. if (leaseObj == null) { BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, no lease ",obj,", NextSink "+nextSink); return nextSink; } if (!(leaseObj is System.Runtime.Remoting.Lifetime.ILease)) throw new RemotingException(Environment.GetResourceString("Remoting_Lifetime_ILeaseReturn", leaseObj)); ILease ilease = (ILease)leaseObj; if (ilease.InitialLeaseTime.CompareTo(TimeSpan.Zero) <= 0) { // No lease { BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, no lease because InitialLeaseTime is Zero ",obj); if (ilease is System.Runtime.Remoting.Lifetime.Lease) { ((Lease)ilease).Remove(); } return nextSink; } } Lease lease = null; lock(identity) { if (identity.Lease != null) { // Lease already exists for object, object is being marsalled again BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, Lease already exists for object ",obj); lease = (Lease)identity.Lease; lease.Renew(lease.InitialLeaseTime); // Reset initial lease time } else { // New lease if (!(ilease is System.Runtime.Remoting.Lifetime.Lease)) { // InitializeLifetimeService created its own ILease object // Need to create a System.Runtime.Remoting.Lease object BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, New Lease, lease not of type Lease ",obj); lease = (Lease)LifetimeServices.GetLeaseInitial(obj); if (lease.CurrentState == LeaseState.Initial) { lease.InitialLeaseTime = ilease.InitialLeaseTime; lease.RenewOnCallTime = ilease.RenewOnCallTime; lease.SponsorshipTimeout = ilease.SponsorshipTimeout; } } else { // An object of Type Lease was created BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, New Lease, lease is type Lease ",obj); lease = (Lease)ilease; } // Put lease in active state // Creation phase of lease is over, properties can no longer be set on lease. identity.Lease = lease; // Place lease into identity for object // If the object has been marshaled activate // the lease if (identity.ObjectRef != null) { lease.ActivateLease(); } } } if (lease.RenewOnCallTime > TimeSpan.Zero) { // RenewOnCall create sink BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, lease created ",obj); return new LeaseSink(lease, nextSink); } else { // No RenewOnCall so no sink created BCLDebug.Trace("REMOTE", "LeaseLifeTimeServiceProperty.GetObjectSink, No RenewOnCall so no sink created ",obj); return nextSink; } } } } // 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
- WebMessageFormatHelper.cs
- Sql8ConformanceChecker.cs
- FrameSecurityDescriptor.cs
- SequenceDesigner.cs
- Resources.Designer.cs
- XmlQueryRuntime.cs
- Identity.cs
- SettingsPropertyWrongTypeException.cs
- HttpStreams.cs
- HtmlControlPersistable.cs
- XmlSchemaType.cs
- QilGeneratorEnv.cs
- DBSqlParserTableCollection.cs
- Set.cs
- MediaEntryAttribute.cs
- RepeaterItem.cs
- ColorKeyFrameCollection.cs
- ManipulationDeltaEventArgs.cs
- EntityDataSourceViewSchema.cs
- TokenBasedSetEnumerator.cs
- EmptyEnumerable.cs
- HtmlValidatorAdapter.cs
- CollectionViewSource.cs
- UInt16Storage.cs
- ContentElement.cs
- XmlCompatibilityReader.cs
- Delegate.cs
- UrlAuthFailedErrorFormatter.cs
- DataSvcMapFileSerializer.cs
- WizardPanel.cs
- FlowDocumentView.cs
- PageThemeParser.cs
- AdCreatedEventArgs.cs
- XmlSchemaRedefine.cs
- PauseStoryboard.cs
- DatatypeImplementation.cs
- SiteMap.cs
- RenderDataDrawingContext.cs
- TreeNodeBindingCollection.cs
- InputLanguage.cs
- DragCompletedEventArgs.cs
- Pen.cs
- Misc.cs
- MetadataPropertyAttribute.cs
- WebReferencesBuildProvider.cs
- WbmpConverter.cs
- FigureHelper.cs
- AnnotationHelper.cs
- Transform3D.cs
- CodeEventReferenceExpression.cs
- CodePageUtils.cs
- XmlSchemaValidator.cs
- ConstrainedGroup.cs
- SettingsPropertyNotFoundException.cs
- CodeNamespace.cs
- BaseParagraph.cs
- QueryContinueDragEvent.cs
- BrowserCapabilitiesFactory.cs
- SiteIdentityPermission.cs
- HttpProtocolImporter.cs
- path.cs
- RuntimeConfigLKG.cs
- DesignerActionPanel.cs
- MatrixConverter.cs
- HyperLinkStyle.cs
- AutomationElement.cs
- DbParameterCollection.cs
- DoubleCollectionValueSerializer.cs
- ProvidePropertyAttribute.cs
- IndexExpression.cs
- CapacityStreamGeometryContext.cs
- SectionVisual.cs
- SplashScreen.cs
- TextDocumentView.cs
- Vector.cs
- TreeViewAutomationPeer.cs
- SelectedGridItemChangedEvent.cs
- RelationshipFixer.cs
- DataGridViewTextBoxCell.cs
- TextSpan.cs
- ValidateNames.cs
- JavaScriptObjectDeserializer.cs
- ConfigurationStrings.cs
- SubordinateTransaction.cs
- PersonalizationState.cs
- CustomAssemblyResolver.cs
- RunInstallerAttribute.cs
- IOThreadTimer.cs
- EventQueueState.cs
- ApplicationSecurityManager.cs
- FloatSumAggregationOperator.cs
- DefaultObjectMappingItemCollection.cs
- DataGridTextBox.cs
- RepeaterItemCollection.cs
- HttpListenerElement.cs
- DiagnosticsConfiguration.cs
- DataGridViewCellErrorTextNeededEventArgs.cs
- EncodingNLS.cs
- ValidatedControlConverter.cs
- Transaction.cs