private ProfileStorage(ConcurrentProfileStorageCollection pushTo, ServerEndPoint server, ProfileStorage resentFor, RetransmissionReasonType?reason) { PushToWhenFinished = pushTo; OriginalProfiling = resentFor; Server = server; RetransmissionReason = reason; }
/// <summary> /// Registers the passed context with a collection that can be retried with subsequent calls to TryGetValue. /// /// Returns false if the passed context object is already registered. /// </summary> public bool TryCreate(object ctx) { var cell = ProfileContextCell.ToStoreUnder(ctx); // we can't pass this as a delegate, because TryAdd may invoke the factory multiple times, // which would lead to over allocation. var storage = ConcurrentProfileStorageCollection.GetOrCreate(); return(profiledCommands.TryAdd(cell, storage)); }
/// <summary> /// Returns a ConcurrentProfileStorageCollection to use. /// /// It *may* have allocated a new one, or it may return one that has previously been released. /// To return the collection, call EnumerateAndReturnForReuse() /// </summary> public static ConcurrentProfileStorageCollection GetOrCreate() { ConcurrentProfileStorageCollection found; for (int i = 0; i < PoolSize; i++) { if ((found = Interlocked.Exchange(ref Pool[i], null)) != null) { return(found); } } Interlocked.Increment(ref AllocationCount); found = new ConcurrentProfileStorageCollection(); return(found); }
/// <summary> /// Returns true and sets val to the tracking collection associated with the given context if the context /// was registered with TryCreate. /// /// Otherwise returns false and sets val to null. /// </summary> public bool TryGetValue(object ctx, out ConcurrentProfileStorageCollection val) { var cell = ProfileContextCell.ToLookupBy(ctx); return(profiledCommands.TryGetValue(cell, out val)); }
public static ProfileStorage NewWithContext(ConcurrentProfileStorageCollection pushTo, ServerEndPoint server) { return(new ProfileStorage(pushTo, server, null, null)); }