Index: tools/pnacl-llc/SRPCStreamer.cpp |
diff --git a/tools/pnacl-llc/SRPCStreamer.cpp b/tools/pnacl-llc/SRPCStreamer.cpp |
index e6546aef5f601eeb9c51cb8aba49c61bcb221486..ddec846d2c915a9d6a90874bb1595e3901c62435 100644 |
--- a/tools/pnacl-llc/SRPCStreamer.cpp |
+++ b/tools/pnacl-llc/SRPCStreamer.cpp |
@@ -119,19 +119,30 @@ llvm::DataStreamer *SRPCStreamer::init(void *(*Callback)(void *), void *arg, |
} |
size_t SRPCStreamer::gotChunk(unsigned char *bytes, size_t len) { |
- if (Error) return 0; |
+ if (__sync_fetch_and_add(&Error, 0)) return 0; // Atomic read. |
return Q.PutBytes(bytes, len); |
} |
int SRPCStreamer::streamEnd(std::string *ErrMsg) { |
Q.SetDone(); |
int err = pthread_join(CompileThread, NULL); |
- if (err) { |
+ __sync_synchronize(); |
+ if (Error) { |
+ if (ErrMsg) |
+ *ErrMsg = std::string("PNaCl Translator Error: " + ErrorMessage); |
+ return 1; |
+ } else if (err) { |
if (ErrMsg) *ErrMsg = std::string(strerror(errno)); |
return err; |
} |
- if (Error && ErrMsg) *ErrMsg = std::string("compile failed."); |
- return Error; |
+ return 0; |
+} |
+ |
+void SRPCStreamer::setFatalError(const std::string& message) { |
+ __sync_fetch_and_add(&Error, 1); |
+ ErrorMessage = message; |
+ __sync_synchronize(); |
+ pthread_exit(NULL); |
} |
#endif // __native_client__ |