Code:
/ 4.0 / 4.0 / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / clr / src / BCL / System / Runtime / Remoting / ServerIdentity.cs / 1305376 / ServerIdentity.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== namespace System.Runtime.Remoting { using System; using System.Collections; using System.Threading; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Remoting.Activation; using System.Runtime.Remoting.Contexts; using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting.Proxies; using System.Runtime.ConstrainedExecution; using System.Runtime.CompilerServices; using System.Globalization; // ServerIdentity derives from Identity and holds the extra server specific information // associated with each instance of a remoted server object. // internal class ServerIdentity : Identity { // Internal members internal Context _srvCtx; // This is used to cache the last server type private class LastCalledType { public String typeName; public Type type; } // These two fields are used for (purely) MarshalByRef object identities // For context bound objects we have corresponding fields in RemotingProxy // that are used instead. This is done to facilitate GC in x-context cases. internal IMessageSink _serverObjectChain; // disable csharp compiler warning #0414: field assigned unused value #pragma warning disable 0414 internal StackBuilderSink _stackBuilderSink; #pragma warning restore 0414 // This manages the dynamic properties registered on per object/proxy basis internal DynamicPropertyHolder _dphSrv; internal Type _srvType; // type of server object private LastCalledType _lastCalledType; // cache the last type object internal bool _bMarshaledAsSpecificType = false; internal int _firstCallDispatched = 0; internal GCHandle _srvIdentityHandle; internal Type GetLastCalledType(String newTypeName) { LastCalledType lastType = _lastCalledType; if (lastType == null) return null; String typeName = lastType.typeName; Type t = lastType.type; if (typeName==null || t==null) return null; if (typeName.Equals(newTypeName)) return t; return null; } // GetLastCalledMethod internal void SetLastCalledType(String newTypeName, Type newType) { LastCalledType lastType = new LastCalledType(); lastType.typeName = newTypeName; lastType.type = newType; _lastCalledType = lastType; } // SetLastCalledMethod [System.Security.SecurityCritical] // auto-generated internal void SetHandle() { bool fLocked = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref fLocked); if (!_srvIdentityHandle.IsAllocated) _srvIdentityHandle = new GCHandle(this, GCHandleType.Normal); else _srvIdentityHandle.Target = this; } finally { if (fLocked) { Monitor.Exit(this); } } } [System.Security.SecurityCritical] // auto-generated internal void ResetHandle() { bool fLocked = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref fLocked); _srvIdentityHandle.Target = null; } finally { if (fLocked) { Monitor.Exit(this); } } } internal GCHandle GetHandle() { return _srvIdentityHandle; } // Creates a new server identity. This form is used by RemotingServices.Wrap // [System.Security.SecurityCritical] // auto-generated internal ServerIdentity(MarshalByRefObject obj, Context serverCtx) : base(obj is ContextBoundObject) { if(null != obj) { if(!RemotingServices.IsTransparentProxy(obj)) { _srvType = obj.GetType(); } else { RealProxy rp = RemotingServices.GetRealProxy(obj); _srvType = rp.GetProxiedType(); } } _srvCtx = serverCtx; _serverObjectChain = null; _stackBuilderSink = null; } // This is used by RS::SetObjectUriForMarshal [System.Security.SecurityCritical] // auto-generated internal ServerIdentity(MarshalByRefObject obj, Context serverCtx, String uri) : this(obj, serverCtx) { SetOrCreateURI(uri, true); // calling from the constructor } // Informational methods on the ServerIdentity. // Get the native context for the server object. internal Context ServerContext { [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] get {return _srvCtx;} } internal void SetSingleCallObjectMode() { BCLDebug.Assert( !IsSingleCall() && !IsSingleton(), "Bad serverID"); _flags |= IDFLG_SERVER_SINGLECALL; } internal void SetSingletonObjectMode() { BCLDebug.Assert( !IsSingleCall() && !IsSingleton(), "Bad serverID"); _flags |= IDFLG_SERVER_SINGLETON; } internal bool IsSingleCall() { return ((_flags&IDFLG_SERVER_SINGLECALL) != 0); } internal bool IsSingleton() { return ((_flags&IDFLG_SERVER_SINGLETON) != 0); } [System.Security.SecurityCritical] // auto-generated internal IMessageSink GetServerObjectChain(out MarshalByRefObject obj) { obj = null; // NOTE: Lifetime relies on the Identity flags for // SingleCall and Singleton being set by the time this getter // is called. if (!this.IsSingleCall()) { // This is the common case if (_serverObjectChain == null) { bool fLocked = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref fLocked); if(_serverObjectChain == null) { MarshalByRefObject srvObj = (MarshalByRefObject) this.TPOrObject; _serverObjectChain = _srvCtx.CreateServerObjectChain( srvObj); } } finally { if (fLocked) { Monitor.Exit(this); } } } BCLDebug.Assert( null != _serverObjectChain, "null != _serverObjectChain"); return _serverObjectChain; } else { // ---------- SINGLE CALL WKO -------------- // In this case, we are expected to provide // a fresh server object for each dispatch. // Since the server object chain is object // specific, we must create a fresh chain too. // We must be in the correct context for this // to succeed. // < BCLDebug.Assert(Thread.CurrentContext==_srvCtx, "Bad context mismatch"); MarshalByRefObject srvObj = null; IMessageSink objChain = null; if (_tpOrObject != null && _firstCallDispatched == 0 && Interlocked.CompareExchange(ref _firstCallDispatched, 1, 0) == 0) { // use the instance of server object created to // set up the pipeline. srvObj = (MarshalByRefObject) _tpOrObject; objChain = _serverObjectChain; if (objChain == null) { objChain = _srvCtx.CreateServerObjectChain(srvObj); } } else { // For singleCall we create a fresh object & its chain // on each dispatch! srvObj = (MarshalByRefObject) Activator.CreateInstance((Type)_srvType, true); // make sure that object didn't Marshal itself. // (well known objects should live up to their promise // of exporting themselves through exactly one url) String tempUri = RemotingServices.GetObjectUri(srvObj); if (tempUri != null) { throw new RemotingException( String.Format( CultureInfo.CurrentCulture, Environment.GetResourceString( "Remoting_WellKnown_CtorCantMarshal"), this.URI)); } // Set the identity depending on whether we have the server // or proxy if(!RemotingServices.IsTransparentProxy(srvObj)) { #if _DEBUG Identity idObj = srvObj.__RaceSetServerIdentity(this); #else srvObj.__RaceSetServerIdentity(this); #endif #if _DEBUG BCLDebug.Assert(idObj == this, "Bad ID state!" ); BCLDebug.Assert(idObj == MarshalByRefObject.GetIdentity(srvObj), "Bad ID state!" ); #endif } else { RealProxy rp = null; rp = RemotingServices.GetRealProxy(srvObj); BCLDebug.Assert(null != rp, "null != rp"); // #if _DEBUG // Identity idObj = (ServerIdentity) rp.SetIdentity(this); // #else rp.IdentityObject = this; // #endif #if false #if _DEBUG // #endif #endif } // Create the object chain and return it objChain = _srvCtx.CreateServerObjectChain(srvObj); } // This is passed out to the caller so that for single-call // case we can call Dispose when the incoming call is done obj = srvObj; return objChain; } } internal Type ServerType { get { return _srvType; } set { _srvType = value; } } // ServerType internal bool MarshaledAsSpecificType { get { return _bMarshaledAsSpecificType; } set { _bMarshaledAsSpecificType = value; } } // MarshaledAsSpecificType [System.Security.SecurityCritical] // auto-generated internal IMessageSink RaceSetServerObjectChain( IMessageSink serverObjectChain) { if (_serverObjectChain == null) { bool fLocked = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref fLocked); if (_serverObjectChain == null) { _serverObjectChain = serverObjectChain; } } finally { if (fLocked) { Monitor.Exit(this); } } } return _serverObjectChain; } /*package*/ [System.Security.SecurityCritical] // auto-generated internal bool AddServerSideDynamicProperty( IDynamicProperty prop) { if (_dphSrv == null) { DynamicPropertyHolder dphSrv = new DynamicPropertyHolder(); bool fLocked = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref fLocked); if (_dphSrv == null) { _dphSrv = dphSrv; } } finally { if (fLocked) { Monitor.Exit(this); } } } return _dphSrv.AddDynamicProperty(prop); } /*package*/ [System.Security.SecurityCritical] // auto-generated internal bool RemoveServerSideDynamicProperty(String name) { if (_dphSrv == null) { throw new ArgumentException(Environment.GetResourceString("Arg_PropNotFound") ); } return _dphSrv.RemoveDynamicProperty(name); } internal ArrayWithSize ServerSideDynamicSinks { [System.Security.SecurityCritical] // auto-generated get { if (_dphSrv == null) { return null; } else { return _dphSrv.DynamicSinks; } } } [System.Security.SecurityCritical] // auto-generated internal override void AssertValid() { base.AssertValid(); if((null != this.TPOrObject) && !RemotingServices.IsTransparentProxy(this.TPOrObject)) { BCLDebug.Assert(MarshalByRefObject.GetIdentity((MarshalByRefObject)this.TPOrObject) == this, "Server ID mismatch with Object"); } } } } // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== namespace System.Runtime.Remoting { using System; using System.Collections; using System.Threading; using System.Runtime.InteropServices; using System.Runtime.Serialization; using System.Runtime.Remoting.Activation; using System.Runtime.Remoting.Contexts; using System.Runtime.Remoting.Messaging; using System.Runtime.Remoting.Proxies; using System.Runtime.ConstrainedExecution; using System.Runtime.CompilerServices; using System.Globalization; // ServerIdentity derives from Identity and holds the extra server specific information // associated with each instance of a remoted server object. // internal class ServerIdentity : Identity { // Internal members internal Context _srvCtx; // This is used to cache the last server type private class LastCalledType { public String typeName; public Type type; } // These two fields are used for (purely) MarshalByRef object identities // For context bound objects we have corresponding fields in RemotingProxy // that are used instead. This is done to facilitate GC in x-context cases. internal IMessageSink _serverObjectChain; // disable csharp compiler warning #0414: field assigned unused value #pragma warning disable 0414 internal StackBuilderSink _stackBuilderSink; #pragma warning restore 0414 // This manages the dynamic properties registered on per object/proxy basis internal DynamicPropertyHolder _dphSrv; internal Type _srvType; // type of server object private LastCalledType _lastCalledType; // cache the last type object internal bool _bMarshaledAsSpecificType = false; internal int _firstCallDispatched = 0; internal GCHandle _srvIdentityHandle; internal Type GetLastCalledType(String newTypeName) { LastCalledType lastType = _lastCalledType; if (lastType == null) return null; String typeName = lastType.typeName; Type t = lastType.type; if (typeName==null || t==null) return null; if (typeName.Equals(newTypeName)) return t; return null; } // GetLastCalledMethod internal void SetLastCalledType(String newTypeName, Type newType) { LastCalledType lastType = new LastCalledType(); lastType.typeName = newTypeName; lastType.type = newType; _lastCalledType = lastType; } // SetLastCalledMethod [System.Security.SecurityCritical] // auto-generated internal void SetHandle() { bool fLocked = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref fLocked); if (!_srvIdentityHandle.IsAllocated) _srvIdentityHandle = new GCHandle(this, GCHandleType.Normal); else _srvIdentityHandle.Target = this; } finally { if (fLocked) { Monitor.Exit(this); } } } [System.Security.SecurityCritical] // auto-generated internal void ResetHandle() { bool fLocked = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref fLocked); _srvIdentityHandle.Target = null; } finally { if (fLocked) { Monitor.Exit(this); } } } internal GCHandle GetHandle() { return _srvIdentityHandle; } // Creates a new server identity. This form is used by RemotingServices.Wrap // [System.Security.SecurityCritical] // auto-generated internal ServerIdentity(MarshalByRefObject obj, Context serverCtx) : base(obj is ContextBoundObject) { if(null != obj) { if(!RemotingServices.IsTransparentProxy(obj)) { _srvType = obj.GetType(); } else { RealProxy rp = RemotingServices.GetRealProxy(obj); _srvType = rp.GetProxiedType(); } } _srvCtx = serverCtx; _serverObjectChain = null; _stackBuilderSink = null; } // This is used by RS::SetObjectUriForMarshal [System.Security.SecurityCritical] // auto-generated internal ServerIdentity(MarshalByRefObject obj, Context serverCtx, String uri) : this(obj, serverCtx) { SetOrCreateURI(uri, true); // calling from the constructor } // Informational methods on the ServerIdentity. // Get the native context for the server object. internal Context ServerContext { [ReliabilityContract(Consistency.WillNotCorruptState, Cer.Success)] get {return _srvCtx;} } internal void SetSingleCallObjectMode() { BCLDebug.Assert( !IsSingleCall() && !IsSingleton(), "Bad serverID"); _flags |= IDFLG_SERVER_SINGLECALL; } internal void SetSingletonObjectMode() { BCLDebug.Assert( !IsSingleCall() && !IsSingleton(), "Bad serverID"); _flags |= IDFLG_SERVER_SINGLETON; } internal bool IsSingleCall() { return ((_flags&IDFLG_SERVER_SINGLECALL) != 0); } internal bool IsSingleton() { return ((_flags&IDFLG_SERVER_SINGLETON) != 0); } [System.Security.SecurityCritical] // auto-generated internal IMessageSink GetServerObjectChain(out MarshalByRefObject obj) { obj = null; // NOTE: Lifetime relies on the Identity flags for // SingleCall and Singleton being set by the time this getter // is called. if (!this.IsSingleCall()) { // This is the common case if (_serverObjectChain == null) { bool fLocked = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref fLocked); if(_serverObjectChain == null) { MarshalByRefObject srvObj = (MarshalByRefObject) this.TPOrObject; _serverObjectChain = _srvCtx.CreateServerObjectChain( srvObj); } } finally { if (fLocked) { Monitor.Exit(this); } } } BCLDebug.Assert( null != _serverObjectChain, "null != _serverObjectChain"); return _serverObjectChain; } else { // ---------- SINGLE CALL WKO -------------- // In this case, we are expected to provide // a fresh server object for each dispatch. // Since the server object chain is object // specific, we must create a fresh chain too. // We must be in the correct context for this // to succeed. // < BCLDebug.Assert(Thread.CurrentContext==_srvCtx, "Bad context mismatch"); MarshalByRefObject srvObj = null; IMessageSink objChain = null; if (_tpOrObject != null && _firstCallDispatched == 0 && Interlocked.CompareExchange(ref _firstCallDispatched, 1, 0) == 0) { // use the instance of server object created to // set up the pipeline. srvObj = (MarshalByRefObject) _tpOrObject; objChain = _serverObjectChain; if (objChain == null) { objChain = _srvCtx.CreateServerObjectChain(srvObj); } } else { // For singleCall we create a fresh object & its chain // on each dispatch! srvObj = (MarshalByRefObject) Activator.CreateInstance((Type)_srvType, true); // make sure that object didn't Marshal itself. // (well known objects should live up to their promise // of exporting themselves through exactly one url) String tempUri = RemotingServices.GetObjectUri(srvObj); if (tempUri != null) { throw new RemotingException( String.Format( CultureInfo.CurrentCulture, Environment.GetResourceString( "Remoting_WellKnown_CtorCantMarshal"), this.URI)); } // Set the identity depending on whether we have the server // or proxy if(!RemotingServices.IsTransparentProxy(srvObj)) { #if _DEBUG Identity idObj = srvObj.__RaceSetServerIdentity(this); #else srvObj.__RaceSetServerIdentity(this); #endif #if _DEBUG BCLDebug.Assert(idObj == this, "Bad ID state!" ); BCLDebug.Assert(idObj == MarshalByRefObject.GetIdentity(srvObj), "Bad ID state!" ); #endif } else { RealProxy rp = null; rp = RemotingServices.GetRealProxy(srvObj); BCLDebug.Assert(null != rp, "null != rp"); // #if _DEBUG // Identity idObj = (ServerIdentity) rp.SetIdentity(this); // #else rp.IdentityObject = this; // #endif #if false #if _DEBUG // #endif #endif } // Create the object chain and return it objChain = _srvCtx.CreateServerObjectChain(srvObj); } // This is passed out to the caller so that for single-call // case we can call Dispose when the incoming call is done obj = srvObj; return objChain; } } internal Type ServerType { get { return _srvType; } set { _srvType = value; } } // ServerType internal bool MarshaledAsSpecificType { get { return _bMarshaledAsSpecificType; } set { _bMarshaledAsSpecificType = value; } } // MarshaledAsSpecificType [System.Security.SecurityCritical] // auto-generated internal IMessageSink RaceSetServerObjectChain( IMessageSink serverObjectChain) { if (_serverObjectChain == null) { bool fLocked = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref fLocked); if (_serverObjectChain == null) { _serverObjectChain = serverObjectChain; } } finally { if (fLocked) { Monitor.Exit(this); } } } return _serverObjectChain; } /*package*/ [System.Security.SecurityCritical] // auto-generated internal bool AddServerSideDynamicProperty( IDynamicProperty prop) { if (_dphSrv == null) { DynamicPropertyHolder dphSrv = new DynamicPropertyHolder(); bool fLocked = false; RuntimeHelpers.PrepareConstrainedRegions(); try { Monitor.Enter(this, ref fLocked); if (_dphSrv == null) { _dphSrv = dphSrv; } } finally { if (fLocked) { Monitor.Exit(this); } } } return _dphSrv.AddDynamicProperty(prop); } /*package*/ [System.Security.SecurityCritical] // auto-generated internal bool RemoveServerSideDynamicProperty(String name) { if (_dphSrv == null) { throw new ArgumentException(Environment.GetResourceString("Arg_PropNotFound") ); } return _dphSrv.RemoveDynamicProperty(name); } internal ArrayWithSize ServerSideDynamicSinks { [System.Security.SecurityCritical] // auto-generated get { if (_dphSrv == null) { return null; } else { return _dphSrv.DynamicSinks; } } } [System.Security.SecurityCritical] // auto-generated internal override void AssertValid() { base.AssertValid(); if((null != this.TPOrObject) && !RemotingServices.IsTransparentProxy(this.TPOrObject)) { BCLDebug.Assert(MarshalByRefObject.GetIdentity((MarshalByRefObject)this.TPOrObject) == this, "Server ID mismatch with Object"); } } } } // 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
- MissingMemberException.cs
- NotificationContext.cs
- QilFactory.cs
- ReadOnlyCollection.cs
- TrackBar.cs
- SqlFactory.cs
- ResourcesBuildProvider.cs
- UnsafeNativeMethods.cs
- FlowDocumentReaderAutomationPeer.cs
- ViewStateModeByIdAttribute.cs
- RsaSecurityToken.cs
- ContainerUtilities.cs
- ClientTargetCollection.cs
- SqlRowUpdatedEvent.cs
- FormViewDeletedEventArgs.cs
- WebPartConnectVerb.cs
- ComponentResourceKeyConverter.cs
- SerializationEventsCache.cs
- CssStyleCollection.cs
- UIElement3D.cs
- XmlNodeComparer.cs
- DateTimeValueSerializer.cs
- WaitHandleCannotBeOpenedException.cs
- RIPEMD160.cs
- DataRow.cs
- UrlRoutingModule.cs
- DataGridViewCellToolTipTextNeededEventArgs.cs
- LoginDesignerUtil.cs
- ApplicationTrust.cs
- SqlInternalConnectionSmi.cs
- ToolStripItemTextRenderEventArgs.cs
- ObjectItemLoadingSessionData.cs
- DnsPermission.cs
- ObjectQueryExecutionPlan.cs
- AtomEntry.cs
- CatalogZoneDesigner.cs
- PackWebResponse.cs
- InstanceHandleReference.cs
- WebSysDescriptionAttribute.cs
- ResolveResponseInfo.cs
- TextMetrics.cs
- TypedDataSourceCodeGenerator.cs
- hresults.cs
- Pen.cs
- ExtendedPropertyDescriptor.cs
- DrawingGroupDrawingContext.cs
- CTreeGenerator.cs
- prompt.cs
- CRYPTPROTECT_PROMPTSTRUCT.cs
- Rule.cs
- NonVisualControlAttribute.cs
- ApplicationInfo.cs
- HttpListenerRequest.cs
- elementinformation.cs
- TdsParserSessionPool.cs
- PointIndependentAnimationStorage.cs
- TextSchema.cs
- TemplateBindingExpression.cs
- ContentElementAutomationPeer.cs
- SoapCodeExporter.cs
- NumericExpr.cs
- IssuedTokensHeader.cs
- ProcessModelSection.cs
- LocalValueEnumerator.cs
- CachedCompositeFamily.cs
- GlyphRun.cs
- MouseWheelEventArgs.cs
- ColumnMap.cs
- DataGridViewCellMouseEventArgs.cs
- EmptyEnumerable.cs
- DiscriminatorMap.cs
- SqlWebEventProvider.cs
- CodeConstructor.cs
- EndPoint.cs
- Content.cs
- ToolBarButtonClickEvent.cs
- DataServiceRequest.cs
- PolygonHotSpot.cs
- FilteredAttributeCollection.cs
- TextEffect.cs
- OleDbInfoMessageEvent.cs
- StyleTypedPropertyAttribute.cs
- SessionStateModule.cs
- StatusBar.cs
- ToolBarButton.cs
- ForwardPositionQuery.cs
- PasswordTextContainer.cs
- FontResourceCache.cs
- TextRangeBase.cs
- XmlUrlResolver.cs
- serverconfig.cs
- ProjectionPruner.cs
- RuntimeArgumentHandle.cs
- TraceHandlerErrorFormatter.cs
- Options.cs
- UserValidatedEventArgs.cs
- GridLength.cs
- LateBoundBitmapDecoder.cs
- ScriptingWebServicesSectionGroup.cs
- ProcessInfo.cs