/ 4.0 / 4.0 / untmp / DEVDIV_TFS / Dev10 / Releases / RTMRel / ndp / fx / src / Net / System / Net / NetworkInformation / TeredoHelper.cs / 1305376 / TeredoHelper.cs
// This class wraps the native API NotifyStableUnicastIpAddressTable. The native function's behavior is:
// 1. If the address table is already stable, it returns ERROR_SUCCESS and a Mib table handle that we must free.
// The passed-in callback will never be called, and the cancelHandle is set to NULL.
// 2. If the address table is not stable, it returns ERROR_IO_PENDING. The table handle is set to NULL,
// and the cancelHandle is set to a valid handle. The callback will be called (on a native threadpool thread)
// EVERY TIME the address table becomes stable until CancelMibChangeNotify2 is called on the cancelHandle
// (via cancelHandle.Dispose()).
// CancelMibChangeNotify2 guarantees that, by the time it returns, all calls to the callback will be complete
// and that no new calls to the callback will be issued.
// The major concerns of the class are: 1) making sure none of the managed objects needed to handle a native
// callback are GC'd before the callback, and 2) making sure no native callbacks will try to call into an unloaded
internal class TeredoHelper
// Holds a list of all pending calls to NotifyStableUnicastIpAddressTable. Also used as a lock to protect its
// contents and impendingAppDomainUnload.
private static List pendingNotifications;
// Flag that gets set when an AppDomain unload is imminent. When this is set, no more calls to
// NotifyStableUnicastIpAddressTable are allowed.
private static bool impendingAppDomainUnload;
private readonly Action