/// <summary> /// Schedules an IPC pip. /// </summary> public IpcPip ScheduleIpcPip( IIpcMoniker moniker, PipId?servicePipId, ProcessBuilder ipcProcessBuilder, FileArtifact outputFile, bool isServiceFinalization, PipConstructionHelper helper = null) { var ipcClientInfo = new IpcClientInfo(StringId.Create(Context.StringTable, moniker.Id), new ClientConfig(0, 0)); PipData arguments = ipcProcessBuilder.ArgumentsBuilder.ToPipData(" ", PipDataFragmentEscaping.CRuntimeArgumentRules); ReadOnlyArray <FileArtifact> fileDependencies = ipcProcessBuilder.GetInputFilesSoFar(); if (!(helper ?? m_defaultConstructionHelper).TryAddIpc( ipcClientInfo, arguments, outputFile, servicePipDependencies: servicePipId != null ? ReadOnlyArray <PipId> .From(new[] { servicePipId.Value }) : ReadOnlyArray <PipId> .Empty, fileDependencies: fileDependencies, directoryDependencies: ReadOnlyArray <DirectoryArtifact> .Empty, skipMaterializationFor: ReadOnlyArray <FileOrDirectoryArtifact> .Empty, isServiceFinalization: isServiceFinalization, mustRunOnMaster: false, tags: new string[0], out IpcPip ipcPip)) { throw new BuildXLTestException("Failed to add ipc pip"); } return(ipcPip); }
/// <summary> /// Returns an existing connection string for the given moniker ID or /// finds an unused port number and renders it to a string. /// </summary> string IIpcProvider.RenderConnectionString(IIpcMoniker moniker) { return(m_moniker2connectionString .GetOrAdd( moniker.Id, valueFactory: (mId) => new Lazy <string>(() => Utils.GetUnusedPortNumber().ToString(CultureInfo.InvariantCulture))) .Value); }
/// <inheritdoc /> public IArgumentsDataBuilder AddIpcMonikerOption(string optionName, IIpcMoniker value) { Contract.Requires(!string.IsNullOrEmpty(optionName)); Contract.Assert(!m_finished); AddOption(optionName, value, (b, v) => b.AddIpcMoniker(v)); return(this); }
/// <summary> /// Adds IPC moniker. /// </summary> public ArgumentsBuilder AddIpcMonikerOption(string optionName, IIpcMoniker value) { Contract.Requires(!string.IsNullOrEmpty(optionName)); Contract.Requires(value != null); Contract.Assert(!m_finished); m_dataBuilder.AddIpcMonikerOption(optionName, value); return(this); }
bool IEquatable <IIpcMoniker> .Equals(IIpcMoniker other) => Equals(other);
/// <inheritdoc /> public string RenderConnectionString(IIpcMoniker moniker) => GetOrAddConnectionString(moniker.Id);
private bool TryScheduleIpcPip(Context context, ObjectLiteral obj, bool allowUndefinedTargetService, bool isServiceFinalization, out FileArtifact outputFile, out PipId pipId) { // IpcClientInfo IIpcMoniker moniker = Converter.ExtractRef <IIpcMoniker>(obj, m_ipcSendMoniker, allowUndefined: false); int? numRetries = Converter.ExtractNumber(obj, m_ipcSendMaxConnectRetries, allowUndefined: true); int? retryDelayMillis = Converter.ExtractNumber(obj, m_ipcSendConnectRetryDelayMillis, allowUndefined: true); var clientConfig = new ClientConfig(numRetries, retryDelayMillis); var ipcClientInfo = new IpcClientInfo(moniker.ToStringId(context.StringTable), clientConfig); // target service pip PipId?servicePipId = Converter.ExtractValue <PipId>(obj, m_ipcSendTargetServicePip, allowUndefined: allowUndefinedTargetService); // arguments PipData arguments; ReadOnlyArray <FileArtifact> fileDependencies; ReadOnlyArray <DirectoryArtifact> directoryDependencies; using (var ipcProcessBuilder = ProcessBuilder.Create(context.PathTable, context.FrontEndContext.GetPipDataBuilder())) { // process arguments ArrayLiteral argumentsArrayLiteral = Converter.ExtractArrayLiteral(obj, m_ipcSendMessageBody); TransformerExecuteArgumentsProcessor.ProcessArguments(context, ipcProcessBuilder, argumentsArrayLiteral); // input file dependencies var dependenciesArray = Converter.ExtractArrayLiteral(obj, m_ipcSendDependencies, allowUndefined: true); if (dependenciesArray != null) { for (int i = 0; i < dependenciesArray.Length; i++) { ProcessImplicitDependency(ipcProcessBuilder, dependenciesArray[i], convContext: new ConversionContext(pos: i, objectCtx: dependenciesArray)); } } arguments = ipcProcessBuilder.ArgumentsBuilder.ToPipData(" ", PipDataFragmentEscaping.CRuntimeArgumentRules); fileDependencies = ipcProcessBuilder.GetInputFilesSoFar(); directoryDependencies = ipcProcessBuilder.GetInputDirectoriesSoFar(); } // output AbsolutePath output = Converter.ExtractPath(obj, m_ipcSendOutputFile, allowUndefined: true); if (!output.IsValid) { output = context.GetPipConstructionHelper().GetUniqueObjectDirectory(m_ipcObjectFolderName).Path.Combine(context.PathTable, m_ipcOutputFileName); } // tags string[] tags = null; var tagsArray = Converter.ExtractArrayLiteral(obj, m_executeTags, allowUndefined: true); if (tagsArray != null && tagsArray.Count > 0) { tags = new string[tagsArray.Count]; for (int i = 0; i < tagsArray.Count; i++) { tags[i] = Converter.ExpectString(tagsArray[i], context: new ConversionContext(pos: i, objectCtx: tagsArray)); } } // skip materialization for files FileOrDirectoryArtifact[] skipMaterializationArtifacts = CollectionUtilities.EmptyArray <FileOrDirectoryArtifact>(); ArrayLiteral skipMaterializationLiteral = Converter.ExtractArrayLiteral(obj, m_ipcSendLazilyMaterializedDependencies, allowUndefined: true); if (skipMaterializationLiteral != null) { skipMaterializationArtifacts = new FileOrDirectoryArtifact[skipMaterializationLiteral.Length]; for (int i = 0; i < skipMaterializationLiteral.Length; i++) { Converter.ExpectFileOrStaticDirectory( skipMaterializationLiteral[i], out var fileArtifact, out var staticDirectory, context: new ConversionContext(pos: i, objectCtx: skipMaterializationLiteral)); Contract.Assert(fileArtifact.IsValid ^ staticDirectory != null); skipMaterializationArtifacts[i] = fileArtifact.IsValid ? FileOrDirectoryArtifact.Create(fileArtifact) : FileOrDirectoryArtifact.Create(staticDirectory.Root); } } // must run on master var mustRunOnMaster = Converter.ExtractOptionalBoolean(obj, m_ipcSendMustRunOnMaster) == true; outputFile = FileArtifact.CreateOutputFile(output); // create IPC pip and add it to the graph bool result = context.GetPipConstructionHelper().TryAddIpc( ipcClientInfo, arguments, outputFile, servicePipDependencies: servicePipId != null ? ReadOnlyArray <PipId> .From(new[] { servicePipId.Value }) : ReadOnlyArray <PipId> .Empty, fileDependencies: fileDependencies, directoryDependencies: directoryDependencies, skipMaterializationFor: ReadOnlyArray <FileOrDirectoryArtifact> .FromWithoutCopy(skipMaterializationArtifacts), isServiceFinalization: isServiceFinalization, mustRunOnMaster: mustRunOnMaster, tags: tags, out var ipcPip); pipId = ipcPip.PipId; return(result); }
public string RenderConnectionString(IIpcMoniker moniker) { NumRenderConnectionStringCalls++; return(string.Empty); }
/// <summary> /// Implicitly convert an IPC moniker to PipDataEntry. /// </summary> public static PipDataEntry CreateIpcMonikerEntry(IIpcMoniker data, StringTable stringTable) { return(new PipDataEntry(PipDataFragmentEscaping.Invalid, PipDataEntryType.IpcMoniker, StringId.Create(stringTable, data.Id).Value)); }
/// <summary> /// Given a <see cref="StringTable"/>, returns <see cref="IIpcMoniker.Id"/> as a <see cref="StringId"/>. /// </summary> public static StringId ToStringId(this IIpcMoniker moniker, StringTable table) => StringId.Create(table, moniker.Id);
/// <nodoc/> public PrimitiveValue(IIpcMoniker moniker) : this() { m_moniker = moniker; Type = PrimitiveValueType.IpcMoniker; }
/// <inheritdoc /> public string RenderConnectionString(IIpcMoniker moniker) => moniker.Id;
/// <summary> /// Returns an existing connection string for the given moniker ID or /// finds an unused port number and renders it to a string. /// </summary> string IIpcProvider.RenderConnectionString(IIpcMoniker moniker) { return(m_moniker2connectionString.GetOrAdd(moniker.Id, (mId) => Utils.GetUnusedPortNumber().ToString(CultureInfo.InvariantCulture))); }
private static Client CreateDummyBxlApiClient(IIpcProvider ipcProvider, IIpcMoniker moniker) { return(new Client(new MockClient(ipcProvider.GetClient(ipcProvider.RenderConnectionString(moniker), new ClientConfig())))); }
private void AddOption(string prefix, IIpcMoniker value) { AddOption(prefix, value, valueIsEmpty: value == null, writeValue: (b, v) => b.AddIpcMoniker(v)); }
/// <summary> /// Adds IPC moniker. /// </summary> public ArgumentsBuilder AddIpcMonikerOption(string optionName, IIpcMoniker value) { Contract.Requires(value != null); AddOption(optionName, value, (b, v) => b.AddIpcMoniker(value)); return(this); }
string IIpcProvider.RenderConnectionString(IIpcMoniker moniker) => RenderMonikerFn(moniker);