Code:
/ FX-1434 / FX-1434 / 1.0 / untmp / whidbey / REDBITS / 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
Link Menu
![Network programming in C#, Network Programming in VB.NET, Network Programming in .NET](/images/book.jpg)
This book is available now!
Buy at Amazon US or
Buy at Amazon UK
- SqlXml.cs
- SafeNativeMethodsOther.cs
- TryExpression.cs
- SHA384CryptoServiceProvider.cs
- OutputWindow.cs
- LocalBuilder.cs
- DiscardableAttribute.cs
- COMException.cs
- WindowsTab.cs
- IncrementalHitTester.cs
- MenuCommand.cs
- MergeLocalizationDirectives.cs
- ZoomPercentageConverter.cs
- EdmToObjectNamespaceMap.cs
- LayoutUtils.cs
- SpellerError.cs
- AbandonedMutexException.cs
- CriticalExceptions.cs
- FixedPageStructure.cs
- EncryptedData.cs
- ConfigurationFileMap.cs
- sqlcontext.cs
- SqlCaseSimplifier.cs
- MetabaseServerConfig.cs
- Win32KeyboardDevice.cs
- followingquery.cs
- DeleteWorkflowOwnerCommand.cs
- TreeView.cs
- EntityViewGenerator.cs
- WindowsFormsLinkLabel.cs
- TreeNodeStyle.cs
- PageStatePersister.cs
- WebPartVerbCollection.cs
- LinearGradientBrush.cs
- CounterCreationDataCollection.cs
- StateMachineTimers.cs
- SelectedDatesCollection.cs
- Peer.cs
- EncoderFallback.cs
- FixedTextView.cs
- WhitespaceRuleLookup.cs
- ConvertEvent.cs
- UnsafeNativeMethods.cs
- CreatingCookieEventArgs.cs
- XhtmlBasicControlAdapter.cs
- CodeCompileUnit.cs
- OuterGlowBitmapEffect.cs
- x509store.cs
- Drawing.cs
- PassportAuthenticationEventArgs.cs
- PeerTransportBindingElement.cs
- DockingAttribute.cs
- DataExpression.cs
- StreamUpgradeInitiator.cs
- DnsPermission.cs
- FixedSOMPageElement.cs
- StickyNoteAnnotations.cs
- PrivateFontCollection.cs
- XmlIterators.cs
- ImagingCache.cs
- JsonServiceDocumentSerializer.cs
- ClientScriptManagerWrapper.cs
- Point4D.cs
- EditBehavior.cs
- ControlCommandSet.cs
- MemberAccessException.cs
- PropertyGridEditorPart.cs
- AnonymousIdentificationModule.cs
- NonBatchDirectoryCompiler.cs
- Attributes.cs
- XmlSchemaAnnotated.cs
- FunctionImportElement.cs
- KnownBoxes.cs
- StringUtil.cs
- ExpandCollapsePattern.cs
- CopyCodeAction.cs
- WebPartDisplayModeEventArgs.cs
- ScriptIgnoreAttribute.cs
- PromptEventArgs.cs
- NestedContainer.cs
- DesignerDataTableBase.cs
- TextEmbeddedObject.cs
- securitycriticaldataformultiplegetandset.cs
- TrimSurroundingWhitespaceAttribute.cs
- TableCellAutomationPeer.cs
- SQLDouble.cs
- FrameworkElement.cs
- CodePageUtils.cs
- BitConverter.cs
- TextEditorParagraphs.cs
- UnsafeCollabNativeMethods.cs
- SerializationInfoEnumerator.cs
- PluralizationServiceUtil.cs
- OleDbPermission.cs
- MorphHelper.cs
- SafeBitVector32.cs
- TextBox.cs
- SerializerDescriptor.cs
- ReservationNotFoundException.cs
- AutoResizedEvent.cs