/// <summary> /// Returns the entry in the cache which matches the specified config. /// </summary> /// <param name="configMetadata">The configuration metadata to match</param> /// <returns>A matching configuration if one exists, null otherwise.</returns> public BuildRequestConfiguration GetMatchingConfiguration(ConfigurationMetadata configMetadata) { ErrorUtilities.VerifyThrowArgumentNull(configMetadata, "configMetadata"); lock (_lockObject) { int configId; if (!_configurationIdsByMetadata.TryGetValue(configMetadata, out configId)) { return(null); } return(_configurations[configId]); } }
/// <summary> /// Gets a matching configuration. If no such configuration exists, one is created and optionally loaded. /// </summary> public BuildRequestConfiguration GetMatchingConfiguration(ConfigurationMetadata configMetadata, ConfigCreateCallback callback, bool loadProject) { lock (_lockObject) { BuildRequestConfiguration configuration = GetMatchingConfiguration(configMetadata); // If there is no matching configuration, let the caller create one. if (configuration == null) { configuration = callback(null, loadProject); AddConfiguration(configuration); } else if (loadProject) { // We already had a configuration, load the project // If it exists but it cached, retrieve it if (configuration.IsCached) { configuration.RetrieveFromCache(); } // If it is still not loaded (because no instance was ever created here), let the caller populate the instance. if (!configuration.IsLoaded) { callback(configuration, loadProject: true); } } // In either case, make sure the project is loaded if it was requested. if (loadProject) { ErrorUtilities.VerifyThrow(configuration.IsLoaded, "Request to create configuration did not honor request to also load project."); } return(configuration); } }