Chromium Code Reviews| 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. |
|
jvoung (off chromium)
2013/09/09 23:47:53
Hmm hopefully an add of 0 doesn't get optimized ou
|
| return Q.PutBytes(bytes, len); |
| } |
| int SRPCStreamer::streamEnd(std::string *ErrMsg) { |
| Q.SetDone(); |
| int err = pthread_join(CompileThread, NULL); |
| - if (err) { |
| + __sync_synchronize(); |
|
jvoung (off chromium)
2013/09/09 23:47:53
Does pthread_join form a happens-before edge? Do
|
| + 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__ |