diff options
Diffstat (limited to 'tools/lli/RemoteJITUtils.h')
-rw-r--r-- | tools/lli/RemoteJITUtils.h | 45 |
1 files changed, 33 insertions, 12 deletions
diff --git a/tools/lli/RemoteJITUtils.h b/tools/lli/RemoteJITUtils.h index a3f3fa0fd3b41..15068d2faf6fd 100644 --- a/tools/lli/RemoteJITUtils.h +++ b/tools/lli/RemoteJITUtils.h @@ -16,6 +16,7 @@ #include "llvm/ExecutionEngine/Orc/RPCChannel.h" #include "llvm/ExecutionEngine/RTDyldMemoryManager.h" +#include <mutex> #if !defined(_MSC_VER) && !defined(__MINGW32__) #include <unistd.h> @@ -24,27 +25,47 @@ #endif /// RPC channel that reads from and writes from file descriptors. -class FDRPCChannel : public llvm::orc::remote::RPCChannel { +class FDRPCChannel final : public llvm::orc::remote::RPCChannel { public: FDRPCChannel(int InFD, int OutFD) : InFD(InFD), OutFD(OutFD) {} - std::error_code readBytes(char *Dst, unsigned Size) override { + llvm::Error readBytes(char *Dst, unsigned Size) override { assert(Dst && "Attempt to read into null."); - ssize_t ReadResult = ::read(InFD, Dst, Size); - if (ReadResult != (ssize_t)Size) - return std::error_code(errno, std::generic_category()); - return std::error_code(); + ssize_t Completed = 0; + while (Completed < static_cast<ssize_t>(Size)) { + ssize_t Read = ::read(InFD, Dst + Completed, Size - Completed); + if (Read <= 0) { + auto ErrNo = errno; + if (ErrNo == EAGAIN || ErrNo == EINTR) + continue; + else + return llvm::errorCodeToError( + std::error_code(errno, std::generic_category())); + } + Completed += Read; + } + return llvm::Error::success(); } - std::error_code appendBytes(const char *Src, unsigned Size) override { + llvm::Error appendBytes(const char *Src, unsigned Size) override { assert(Src && "Attempt to append from null."); - ssize_t WriteResult = ::write(OutFD, Src, Size); - if (WriteResult != (ssize_t)Size) - std::error_code(errno, std::generic_category()); - return std::error_code(); + ssize_t Completed = 0; + while (Completed < static_cast<ssize_t>(Size)) { + ssize_t Written = ::write(OutFD, Src + Completed, Size - Completed); + if (Written < 0) { + auto ErrNo = errno; + if (ErrNo == EAGAIN || ErrNo == EINTR) + continue; + else + return llvm::errorCodeToError( + std::error_code(errno, std::generic_category())); + } + Completed += Written; + } + return llvm::Error::success(); } - std::error_code send() override { return std::error_code(); } + llvm::Error send() override { return llvm::Error::success(); } private: int InFD, OutFD; |