Code:
/ Dotnetfx_Win7_3.5.1 / Dotnetfx_Win7_3.5.1 / 3.5.1 / DEVDIV / depot / DevDiv / releases / whidbey / NetFXspW7 / 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
- FixedSchema.cs
- CodeTypeConstructor.cs
- SchemaNamespaceManager.cs
- ScriptControl.cs
- MetadataPropertyAttribute.cs
- CleanUpVirtualizedItemEventArgs.cs
- QueueProcessor.cs
- ColumnMapProcessor.cs
- ToolStripDesignerAvailabilityAttribute.cs
- IpcServerChannel.cs
- StorageEndPropertyMapping.cs
- BridgeDataRecord.cs
- ProgressChangedEventArgs.cs
- GenericParameterDataContract.cs
- FormatterConverter.cs
- CryptoStream.cs
- QilGenerator.cs
- FileStream.cs
- FieldNameLookup.cs
- NavigationEventArgs.cs
- Int32.cs
- SamlConstants.cs
- BitmapMetadata.cs
- BaseHashHelper.cs
- DataGridBoolColumn.cs
- MimeImporter.cs
- CqlGenerator.cs
- OutputCacheEntry.cs
- RichTextBoxAutomationPeer.cs
- CurrentChangingEventArgs.cs
- EmbeddedMailObject.cs
- RecognizerStateChangedEventArgs.cs
- NameNode.cs
- MessageFormatterConverter.cs
- WindowsTitleBar.cs
- EnumerableRowCollection.cs
- CodePageEncoding.cs
- ConditionalAttribute.cs
- D3DImage.cs
- RefExpr.cs
- LowerCaseStringConverter.cs
- WebPartCatalogCloseVerb.cs
- HwndProxyElementProvider.cs
- StandardCommandToolStripMenuItem.cs
- QilTargetType.cs
- Timer.cs
- DataGridRelationshipRow.cs
- ParameterCollectionEditorForm.cs
- RoleProviderPrincipal.cs
- x509store.cs
- SettingsAttributeDictionary.cs
- ParserHooks.cs
- BamlLocalizerErrorNotifyEventArgs.cs
- TreeSet.cs
- SecurityState.cs
- HtmlEmptyTagControlBuilder.cs
- DATA_BLOB.cs
- BypassElementCollection.cs
- PeerTransportListenAddressValidatorAttribute.cs
- ClientRolePrincipal.cs
- WeakReferenceEnumerator.cs
- ValidateNames.cs
- GeneralTransform3D.cs
- MetadataProperty.cs
- JumpList.cs
- WebPartConnectionsDisconnectVerb.cs
- recordstatefactory.cs
- ValidatingPropertiesEventArgs.cs
- HttpListenerException.cs
- Ref.cs
- EditorPart.cs
- StringWriter.cs
- SQLDateTimeStorage.cs
- UICuesEvent.cs
- HttpCookieCollection.cs
- MenuStrip.cs
- ApplicationDirectoryMembershipCondition.cs
- ContextMarshalException.cs
- ThreadBehavior.cs
- ChildTable.cs
- IISMapPath.cs
- FlowchartDesigner.xaml.cs
- ProtocolElement.cs
- CompilerState.cs
- ZipIOLocalFileDataDescriptor.cs
- TextEditorSpelling.cs
- HttpRuntimeSection.cs
- Misc.cs
- Panel.cs
- ExtenderProviderService.cs
- TrackBarRenderer.cs
- CollectionEditor.cs
- CodeDOMUtility.cs
- WriterOutput.cs
- Base64Stream.cs
- PrintSystemException.cs
- TcpStreams.cs
- DesignOnlyAttribute.cs
- SQLBinary.cs
- XmlSchemaInferenceException.cs