| 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__
|
|
|