diff options
Diffstat (limited to 'llvm/tools/lli/RemoteJITUtils.h')
-rw-r--r-- | llvm/tools/lli/RemoteJITUtils.h | 42 |
1 files changed, 31 insertions, 11 deletions
diff --git a/llvm/tools/lli/RemoteJITUtils.h b/llvm/tools/lli/RemoteJITUtils.h index 63915d13dde..ea6a04e2176 100644 --- a/llvm/tools/lli/RemoteJITUtils.h +++ b/llvm/tools/lli/RemoteJITUtils.h @@ -29,23 +29,43 @@ 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 < 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 < 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; |