Code:
/ Dotnetfx_Vista_SP2 / Dotnetfx_Vista_SP2 / 8.0.50727.4016 / DEVDIV / depot / DevDiv / releases / whidbey / NetFxQFE / ndp / clr / src / BCL / System / Runtime / Remoting / TrackingServices.cs / 1 / TrackingServices.cs
// ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** File: TrackingServices.cs ** ** ** Purpose: Defines the services for tracking lifetime and other ** operations on objects. ** ** ===========================================================*/ namespace System.Runtime.Remoting.Services { using System.Security.Permissions; using System; using System.Threading; using System.Globalization; [System.Runtime.InteropServices.ComVisible(true)] public interface ITrackingHandler { // Notify a handler that an object has been marshaled [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)] void MarshaledObject(Object obj, ObjRef or); // Notify a handler that an object has been unmarshaled [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)] void UnmarshaledObject(Object obj, ObjRef or); // Notify a handler that an object has been disconnected [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)] void DisconnectedObject(Object obj); } [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)] [System.Runtime.InteropServices.ComVisible(true)] public class TrackingServices { // Private member variables private static ITrackingHandler[] _Handlers = new ITrackingHandler[0]; // Array of registered tracking handlers private static int _Size = 0; // Number of elements in the array private static Object s_TrackingServicesSyncObject = null; private static Object TrackingServicesSyncObject { get { if (s_TrackingServicesSyncObject == null) { Object o = new Object(); Interlocked.CompareExchange(ref s_TrackingServicesSyncObject, o, null); } return s_TrackingServicesSyncObject; } } public static void RegisterTrackingHandler(ITrackingHandler handler) { lock(TrackingServicesSyncObject) { // Validate arguments if(null == handler) { throw new ArgumentNullException("handler"); } // Check to make sure that the handler has not been registered if(-1 == Match(handler)) { // Allocate a new array if necessary if((null == _Handlers) || (_Size == _Handlers.Length)) { ITrackingHandler[] temp = new ITrackingHandler[_Size*2+4]; if(null != _Handlers) { Array.Copy(_Handlers, temp, _Size); } _Handlers = temp; } _Handlers[_Size++] = handler; } else { throw new RemotingException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_TrackingHandlerAlreadyRegistered"), "handler")); } } } public static void UnregisterTrackingHandler(ITrackingHandler handler) { lock(TrackingServicesSyncObject) { // Validate arguments if(null == handler) { throw new ArgumentNullException("handler"); } // Check to make sure that the channel has been registered int matchingIdx = Match(handler); if(-1 == matchingIdx) { throw new RemotingException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_HandlerNotRegistered"), handler)); } // Delete the entry by copying the remaining entries Array.Copy(_Handlers, matchingIdx+1, _Handlers, matchingIdx, _Size-matchingIdx-1); _Size--; } } public static ITrackingHandler[] RegisteredHandlers { get { lock(TrackingServicesSyncObject) { if(0 == _Size) { return new ITrackingHandler[0]; } else { // Copy the array of registered handlers into a new array // and return ITrackingHandler[] temp = new ITrackingHandler[_Size]; for(int i = 0; i < _Size; i++) { temp[i] = _Handlers[i]; } return temp; } } } } // Notify all the handlers that an object has been marshaled internal static void MarshaledObject(Object obj, ObjRef or) { try{ ITrackingHandler[] temp = _Handlers; for(int i = 0; i < _Size; i++) { temp[i].MarshaledObject(obj, or); } } catch {} } // Notify all the handlers that an object has been unmarshaled internal static void UnmarshaledObject(Object obj, ObjRef or) { try{ ITrackingHandler[] temp = _Handlers; for(int i = 0; i < _Size; i++) { temp[i].UnmarshaledObject(obj, or); } } catch {} } // Notify all the handlers that an object has been disconnected internal static void DisconnectedObject(Object obj) { try{ ITrackingHandler[] temp = _Handlers; for(int i = 0; i < _Size; i++) { temp[i].DisconnectedObject(obj); } } catch {} } private static int Match(ITrackingHandler handler) { int idx = -1; for(int i = 0; i < _Size; i++) { if(_Handlers[i] == handler) { idx = i; break; } } return idx; } } } // namespace // File provided for Reference Use Only by Microsoft Corporation (c) 2007. // ==++== // // Copyright (c) Microsoft Corporation. All rights reserved. // // ==--== /*============================================================ ** ** File: TrackingServices.cs ** ** ** Purpose: Defines the services for tracking lifetime and other ** operations on objects. ** ** ===========================================================*/ namespace System.Runtime.Remoting.Services { using System.Security.Permissions; using System; using System.Threading; using System.Globalization; [System.Runtime.InteropServices.ComVisible(true)] public interface ITrackingHandler { // Notify a handler that an object has been marshaled [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)] void MarshaledObject(Object obj, ObjRef or); // Notify a handler that an object has been unmarshaled [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)] void UnmarshaledObject(Object obj, ObjRef or); // Notify a handler that an object has been disconnected [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)] void DisconnectedObject(Object obj); } [SecurityPermissionAttribute(SecurityAction.LinkDemand, Flags=SecurityPermissionFlag.Infrastructure)] [System.Runtime.InteropServices.ComVisible(true)] public class TrackingServices { // Private member variables private static ITrackingHandler[] _Handlers = new ITrackingHandler[0]; // Array of registered tracking handlers private static int _Size = 0; // Number of elements in the array private static Object s_TrackingServicesSyncObject = null; private static Object TrackingServicesSyncObject { get { if (s_TrackingServicesSyncObject == null) { Object o = new Object(); Interlocked.CompareExchange(ref s_TrackingServicesSyncObject, o, null); } return s_TrackingServicesSyncObject; } } public static void RegisterTrackingHandler(ITrackingHandler handler) { lock(TrackingServicesSyncObject) { // Validate arguments if(null == handler) { throw new ArgumentNullException("handler"); } // Check to make sure that the handler has not been registered if(-1 == Match(handler)) { // Allocate a new array if necessary if((null == _Handlers) || (_Size == _Handlers.Length)) { ITrackingHandler[] temp = new ITrackingHandler[_Size*2+4]; if(null != _Handlers) { Array.Copy(_Handlers, temp, _Size); } _Handlers = temp; } _Handlers[_Size++] = handler; } else { throw new RemotingException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_TrackingHandlerAlreadyRegistered"), "handler")); } } } public static void UnregisterTrackingHandler(ITrackingHandler handler) { lock(TrackingServicesSyncObject) { // Validate arguments if(null == handler) { throw new ArgumentNullException("handler"); } // Check to make sure that the channel has been registered int matchingIdx = Match(handler); if(-1 == matchingIdx) { throw new RemotingException(String.Format(CultureInfo.CurrentCulture, Environment.GetResourceString("Remoting_HandlerNotRegistered"), handler)); } // Delete the entry by copying the remaining entries Array.Copy(_Handlers, matchingIdx+1, _Handlers, matchingIdx, _Size-matchingIdx-1); _Size--; } } public static ITrackingHandler[] RegisteredHandlers { get { lock(TrackingServicesSyncObject) { if(0 == _Size) { return new ITrackingHandler[0]; } else { // Copy the array of registered handlers into a new array // and return ITrackingHandler[] temp = new ITrackingHandler[_Size]; for(int i = 0; i < _Size; i++) { temp[i] = _Handlers[i]; } return temp; } } } } // Notify all the handlers that an object has been marshaled internal static void MarshaledObject(Object obj, ObjRef or) { try{ ITrackingHandler[] temp = _Handlers; for(int i = 0; i < _Size; i++) { temp[i].MarshaledObject(obj, or); } } catch {} } // Notify all the handlers that an object has been unmarshaled internal static void UnmarshaledObject(Object obj, ObjRef or) { try{ ITrackingHandler[] temp = _Handlers; for(int i = 0; i < _Size; i++) { temp[i].UnmarshaledObject(obj, or); } } catch {} } // Notify all the handlers that an object has been disconnected internal static void DisconnectedObject(Object obj) { try{ ITrackingHandler[] temp = _Handlers; for(int i = 0; i < _Size; i++) { temp[i].DisconnectedObject(obj); } } catch {} } private static int Match(ITrackingHandler handler) { int idx = -1; for(int i = 0; i < _Size; i++) { if(_Handlers[i] == handler) { idx = i; break; } } return idx; } } } // namespace // 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
- DataGridColumn.cs
- DbParameterCollectionHelper.cs
- ConvertersCollection.cs
- Polygon.cs
- TypedReference.cs
- DataGridViewColumnCollectionDialog.cs
- XamlToRtfParser.cs
- TableLayoutCellPaintEventArgs.cs
- MatrixTransform3D.cs
- CodeAttributeDeclarationCollection.cs
- TimerElapsedEvenArgs.cs
- Animatable.cs
- Triangle.cs
- WmpBitmapDecoder.cs
- WebPartEditorOkVerb.cs
- TemplateControlBuildProvider.cs
- RoleManagerModule.cs
- CorrelationKeyCalculator.cs
- StreamUpdate.cs
- TreeNodeCollection.cs
- ResourceDisplayNameAttribute.cs
- HttpProfileBase.cs
- MappingMetadataHelper.cs
- Group.cs
- FontSizeConverter.cs
- TargetControlTypeCache.cs
- QueryableDataSourceView.cs
- SafeFileMappingHandle.cs
- EntityContainerAssociationSet.cs
- WebContentFormatHelper.cs
- DbgCompiler.cs
- Control.cs
- Roles.cs
- UserControl.cs
- CommunicationObject.cs
- InstrumentationTracker.cs
- TextChangedEventArgs.cs
- TemplateEditingFrame.cs
- GridViewRowCollection.cs
- FileUtil.cs
- filewebrequest.cs
- DotExpr.cs
- GPPOINTF.cs
- FlowDocumentReaderAutomationPeer.cs
- TypedTableHandler.cs
- ExecutedRoutedEventArgs.cs
- CompModSwitches.cs
- PasswordPropertyTextAttribute.cs
- EventSourceCreationData.cs
- PropertyMappingExceptionEventArgs.cs
- WebPartDescriptionCollection.cs
- FeatureManager.cs
- UniqueCodeIdentifierScope.cs
- QilPatternFactory.cs
- XPathNodeIterator.cs
- UniformGrid.cs
- ConfigXmlText.cs
- NameValuePair.cs
- NativeMethods.cs
- XmlRawWriter.cs
- EntitySetBaseCollection.cs
- Byte.cs
- NonClientArea.cs
- SchemaNames.cs
- ReadOnlyDataSourceView.cs
- EventHandlers.cs
- CodeExpressionStatement.cs
- ZipIOCentralDirectoryDigitalSignature.cs
- ToggleProviderWrapper.cs
- ToolboxSnapDragDropEventArgs.cs
- X509ChainPolicy.cs
- BindValidationContext.cs
- MarkupObject.cs
- SystemInformation.cs
- BlurBitmapEffect.cs
- Span.cs
- DeclarativeCatalogPartDesigner.cs
- _HTTPDateParse.cs
- SecurityVersion.cs
- QuerySetOp.cs
- CommonRemoteMemoryBlock.cs
- NativeMethods.cs
- XmlSchema.cs
- RelativeSource.cs
- UserMapPath.cs
- LinqDataSourceContextEventArgs.cs
- CodeArrayCreateExpression.cs
- CodeGen.cs
- XPathDocumentIterator.cs
- DispatcherExceptionEventArgs.cs
- ManagementOptions.cs
- DocumentPageTextView.cs
- EventBindingService.cs
- SourceFileBuildProvider.cs
- FixedSOMTableCell.cs
- WrappedKeySecurityToken.cs
- XPathEmptyIterator.cs
- MonthCalendarDesigner.cs
- EventRecord.cs
- XsltLibrary.cs