OLD | NEW |
1 //===-- SRPCStreamer.cpp - Stream bitcode over SRPC ----------------------===// | 1 //===-- SRPCStreamer.cpp - Stream bitcode over SRPC ----------------------===// |
2 // | 2 // |
3 // The LLVM Compiler Infrastructure | 3 // The LLVM Compiler Infrastructure |
4 // | 4 // |
5 // This file is distributed under the University of Illinois Open Source | 5 // This file is distributed under the University of Illinois Open Source |
6 // License. See LICENSE.TXT for details. | 6 // License. See LICENSE.TXT for details. |
7 // | 7 // |
8 //===----------------------------------------------------------------------===// | 8 //===----------------------------------------------------------------------===// |
9 #if defined(__native_client__) | 9 #if defined(__native_client__) |
10 #define DEBUG_TYPE "bitcode-stream" | 10 #define DEBUG_TYPE "bitcode-stream" |
(...skipping 101 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
112 std::string *ErrMsg) { | 112 std::string *ErrMsg) { |
113 int err = pthread_create(&CompileThread, NULL, Callback, arg); | 113 int err = pthread_create(&CompileThread, NULL, Callback, arg); |
114 if (err) { | 114 if (err) { |
115 if (ErrMsg) *ErrMsg = std::string(strerror(errno)); | 115 if (ErrMsg) *ErrMsg = std::string(strerror(errno)); |
116 return NULL; | 116 return NULL; |
117 } | 117 } |
118 return &Q; | 118 return &Q; |
119 } | 119 } |
120 | 120 |
121 size_t SRPCStreamer::gotChunk(unsigned char *bytes, size_t len) { | 121 size_t SRPCStreamer::gotChunk(unsigned char *bytes, size_t len) { |
122 if (Error) return 0; | 122 if (__sync_fetch_and_add(&Error, 0)) return 0; // Atomic read. |
123 return Q.PutBytes(bytes, len); | 123 return Q.PutBytes(bytes, len); |
124 } | 124 } |
125 | 125 |
126 int SRPCStreamer::streamEnd(std::string *ErrMsg) { | 126 int SRPCStreamer::streamEnd(std::string *ErrMsg) { |
127 Q.SetDone(); | 127 Q.SetDone(); |
128 int err = pthread_join(CompileThread, NULL); | 128 int err = pthread_join(CompileThread, NULL); |
129 if (err) { | 129 __sync_synchronize(); |
| 130 if (Error) { |
| 131 if (ErrMsg) |
| 132 *ErrMsg = std::string("PNaCl Translator Error: " + ErrorMessage); |
| 133 return 1; |
| 134 } else if (err) { |
130 if (ErrMsg) *ErrMsg = std::string(strerror(errno)); | 135 if (ErrMsg) *ErrMsg = std::string(strerror(errno)); |
131 return err; | 136 return err; |
132 } | 137 } |
133 if (Error && ErrMsg) *ErrMsg = std::string("compile failed."); | 138 return 0; |
134 return Error; | 139 } |
| 140 |
| 141 void SRPCStreamer::setFatalError(const std::string& message) { |
| 142 __sync_fetch_and_add(&Error, 1); |
| 143 ErrorMessage = message; |
| 144 __sync_synchronize(); |
| 145 pthread_exit(NULL); |
135 } | 146 } |
136 | 147 |
137 #endif // __native_client__ | 148 #endif // __native_client__ |
OLD | NEW |