summaryrefslogtreecommitdiffstats
path: root/llvm/tools/lli/RemoteJITUtils.h
diff options
context:
space:
mode:
Diffstat (limited to 'llvm/tools/lli/RemoteJITUtils.h')
-rw-r--r--llvm/tools/lli/RemoteJITUtils.h42
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;
OpenPOWER on IntegriCloud