[DynamicSecurityMethod] // Methods containing StackCrawlMark local var must be marked DynamicSecurityMethod #endif public static DeserializationToken StartDeserialization() { if (LocalAppContextSwitches.SerializationGuard) { #if CORECLR StackCrawlMark stackMark = StackCrawlMark.LookForMe; DeserializationTracker tracker = Thread.GetThreadDeserializationTracker(ref stackMark); #else DeserializationTracker tracker = GetThreadDeserializationTracker(); #endif if (!tracker.DeserializationInProgress) { lock (tracker) { if (!tracker.DeserializationInProgress) { AsyncDeserializationInProgress.Value = true; tracker.DeserializationInProgress = true; return(new DeserializationToken(tracker)); } } } } return(new DeserializationToken(null)); }
private static DeserializationTracker GetThreadDeserializationTracker() { if (t_deserializationTracker == null) { t_deserializationTracker = new DeserializationTracker(); } return(t_deserializationTracker); }
// Declares that the current thread and async context have begun deserialization. // In this state, if the SerializationGuard or other related AppContext switches are set, // actions likely to be dangerous during deserialization, such as starting a process will be blocked. // Returns a DeserializationToken that must be disposed to remove the deserialization state. public static DeserializationToken StartDeserialization() { if (LocalAppContextSwitches.SerializationGuard) { DeserializationTracker tracker = GetThreadDeserializationTracker(); if (!tracker.DeserializationInProgress) { lock (tracker) { if (!tracker.DeserializationInProgress) { AsyncDeserializationInProgress.Value = true; tracker.DeserializationInProgress = true; return(new DeserializationToken(tracker)); } } } } return(new DeserializationToken(null)); }
internal DeserializationToken(DeserializationTracker tracker) { _tracker = tracker; }