/* **************************************************************************** * * Copyright (c) Microsoft Corporation. All rights reserved. * * This software is subject to the Microsoft Public License (Ms-PL). * A copy of the license can be found in the license.htm file included * in this distribution. * * You must not remove this notice, or any other, from this software. * * ***************************************************************************/ namespace System.Web.Mvc { using System; using System.Linq; using System.Threading; internal static class DescriptorUtil { public static TDescriptor[] LazilyFetchOrCreateDescriptors(ref TDescriptor[] cacheLocation, Func initializer, Func converter) { // did we already calculate this once? TDescriptor[] existingCache = Interlocked.CompareExchange(ref cacheLocation, null, null); if (existingCache != null) { return existingCache; } TReflection[] memberInfos = initializer(); TDescriptor[] descriptors = memberInfos.Select(converter).Where(descriptor => descriptor != null).ToArray(); TDescriptor[] updatedCache = Interlocked.CompareExchange(ref cacheLocation, descriptors, null); return updatedCache ?? descriptors; } } }