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
- TreeView.cs
- SymbolEqualComparer.cs
- TraceSection.cs
- PlacementWorkspace.cs
- XPathBuilder.cs
- ListViewTableRow.cs
- FlowDocumentPage.cs
- SamlSubjectStatement.cs
- RichTextBoxConstants.cs
- MinimizableAttributeTypeConverter.cs
- UnsafeNativeMethods.cs
- RawAppCommandInputReport.cs
- WithParamAction.cs
- SeekStoryboard.cs
- Thumb.cs
- ConstraintManager.cs
- MarkupCompiler.cs
- GlyphShapingProperties.cs
- CodeAccessSecurityEngine.cs
- SchemaAttDef.cs
- ModuleBuilder.cs
- WindowClosedEventArgs.cs
- xdrvalidator.cs
- ToolStripOverflow.cs
- ListItemParagraph.cs
- DbTransaction.cs
- RegexRunner.cs
- InheritablePropertyChangeInfo.cs
- Win32PrintDialog.cs
- DetailsViewCommandEventArgs.cs
- InvalidCommandTreeException.cs
- DesignTimeParseData.cs
- LineServicesRun.cs
- VarRefManager.cs
- DesignRelationCollection.cs
- StateRuntime.cs
- TableSectionStyle.cs
- MaterialGroup.cs
- MediaContextNotificationWindow.cs
- BindingExpression.cs
- TextView.cs
- XmlCompatibilityReader.cs
- CustomAttribute.cs
- EventRoute.cs
- StrongName.cs
- DrawingAttributeSerializer.cs
- Activity.cs
- BindingCompleteEventArgs.cs
- Compensate.cs
- SvcFileManager.cs
- HttpListener.cs
- FastEncoderWindow.cs
- UrlRoutingHandler.cs
- DBSchemaRow.cs
- XmlILModule.cs
- AudioFormatConverter.cs
- DataGridCaption.cs
- GeneralTransform2DTo3DTo2D.cs
- DrawingContext.cs
- ImmutableObjectAttribute.cs
- ResourceKey.cs
- PanelDesigner.cs
- FeatureSupport.cs
- RedirectionProxy.cs
- BufferedWebEventProvider.cs
- EncoderReplacementFallback.cs
- QueryReaderSettings.cs
- XmlDownloadManager.cs
- QueryTaskGroupState.cs
- ExtendedTransformFactory.cs
- TCEAdapterGenerator.cs
- CroppedBitmap.cs
- GenericAuthenticationEventArgs.cs
- InvokeBinder.cs
- ChannelDispatcherBase.cs
- SetStoryboardSpeedRatio.cs
- EventRoute.cs
- DataGridHeaderBorder.cs
- DocumentApplication.cs
- NetTcpSecurityElement.cs
- Model3DGroup.cs
- RenderOptions.cs
- Duration.cs
- Repeater.cs
- CommandField.cs
- LongCountAggregationOperator.cs
- BasePattern.cs
- RemotingException.cs
- MatrixIndependentAnimationStorage.cs
- TransformGroup.cs
- CheckableControlBaseAdapter.cs
- Pen.cs
- ExpressionBuilderCollection.cs
- SQLSingle.cs
- Int32.cs
- SyndicationCategory.cs
- ImportCatalogPart.cs
- WebPartCloseVerb.cs
- UnsafeNativeMethodsMilCoreApi.cs
- CrossContextChannel.cs