From 8a9e518371df03b3f382e0fe869da83751fdda0b Mon Sep 17 00:00:00 2001 From: jsmall-nvidia Date: Wed, 10 Nov 2021 17:33:22 -0500 Subject: Interprocess communication via pipes (#2009) * #include an absolute path didn't work - because paths were taken to always be relative. * Use 'Process' to communicate with an command line tool. * Remove slang-win-stream * Tidy up windows ProcessUtil. * First version of BufferedReadStream. * Windows working IPC for steams. * Test proxy count option. * Split Process/ProcessUtil. Process is platform dependant. ProcessUtil are functions that are platform independent. * First implementation of Unix Process interface. * Unix process compiles on cygwin. * Fix typo in unix process. * Separate unix pipe stream error of invalid access, from pipe availability. * Fix in standard line extraction. * Make fd non blocking. * Fix issues with Windows Process streams. * Added UnixPipe. * Some fixes around UnixPipeStream. * Make a unix stream closed explicit. * Hack to debug linux process/stream. * Revert to old linux pipe handling. * Pass executable path for unit tests. Split out CommandLine into own source. * Small improvements in process/command line. * Check process behavior with crash. * Make stderr and stdout unbuffered for crash testing. * Only turn disable buffering in crash test. * Disable crash test on CI. * Fix crash on clang/linux. * Enable crash test. Remove _appendBuffer as can use StreamUtil functionality. --- source/core/slang-process.h | 73 +++++++++++++++++++++++++++++++++++++++++++++ 1 file changed, 73 insertions(+) create mode 100644 source/core/slang-process.h (limited to 'source/core/slang-process.h') diff --git a/source/core/slang-process.h b/source/core/slang-process.h new file mode 100644 index 000000000..ddbe7cbf0 --- /dev/null +++ b/source/core/slang-process.h @@ -0,0 +1,73 @@ +// slang-process.h +#ifndef SLANG_PROCESS_H +#define SLANG_PROCESS_H + +#include "slang-string.h" +#include "slang-list.h" +#include "slang-stream.h" +#include "slang-io.h" + +#include "slang-string-escape-util.h" + +#include "slang-command-line.h" + +namespace Slang { + +class Process : public RefObject +{ +public: + enum class StreamType + { + ErrorOut, + StdOut, + StdIn, + CountOf, + }; + + typedef uint32_t Flags; + struct Flag + { + enum Enum : Flags + { + AttachDebugger = 0x01, + }; + }; + + /// Get the stream for the type + Stream* getStream(StreamType type) const { return m_streams[Index(type)]; } + int32_t getReturnValue() const { return m_returnValue; } + + /// True if the process has terminated + virtual bool isTerminated() = 0; + /// Blocks until the process has completed + virtual void waitForTermination() = 0; + + + /// The quoting style used for the command line on this target. Currently just uses Space, + /// but in future may take into account platform sec + static StringEscapeHandler* getEscapeHandler(); + + /// Get the suffix used on this platform + static UnownedStringSlice getExecutableSuffix(); + + /// Create a process using the executable/args defined from the commandLine + static SlangResult create(const CommandLine& commandLine, Process::Flags flags, RefPtr& outProcess); + + /// Sleep the current thread for time specified in milliseconds. 0 indicates to OS ok to yield this thread. + static void sleepCurrentThread(Index timeInMs); + + /// Get a standard stream + static SlangResult getStdStream(StreamType type, RefPtr& out); + + static uint64_t getClockFrequency(); + + static uint64_t getClockTick(); + +protected: + int32_t m_returnValue = 0; ///< Value returned if process terminated + RefPtr m_streams[Index(StreamType::CountOf)]; ///< Streams to communicate with the process +}; + +} + +#endif // SLANG_PROCESS_H -- cgit v1.2.3