Index: trunk/src/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.cc |
=================================================================== |
--- trunk/src/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.cc (revision 284790) |
+++ trunk/src/ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.cc (working copy) |
@@ -111,16 +111,27 @@ |
} |
// Called from main thread to send bytes to the translator. |
-void PnaclTranslateThread::PutBytes(const void* bytes, int32_t count) { |
+void PnaclTranslateThread::PutBytes(std::vector<char>* bytes, int count) { |
+ PLUGIN_PRINTF(("PutBytes (this=%p, bytes=%p, size=%" NACL_PRIuS |
+ ", count=%d)\n", |
+ this, bytes, bytes ? bytes->size() : 0, count)); |
+ size_t buffer_size = 0; |
CHECK(bytes != NULL); |
+ // Ensure that the buffer we send to the translation thread is the right size |
+ // (count can be < the buffer size). This can be done without the lock. |
+ buffer_size = bytes->size(); |
+ bytes->resize(count); |
+ |
NaClXMutexLock(&cond_mu_); |
- std::vector<char> v; |
- data_buffers_.push_back(v); |
- data_buffers_.back().insert(v.end(), |
- static_cast<const char*>(bytes), |
- static_cast<const char*>(bytes) + count); |
+ |
+ data_buffers_.push_back(std::vector<char>()); |
+ bytes->swap(data_buffers_.back()); // Avoid copying the buffer data. |
+ |
NaClXCondVarSignal(&buffer_cond_); |
NaClXMutexUnlock(&cond_mu_); |
+ |
+ // Ensure the buffer we send back to the coordinator is the expected size |
+ bytes->resize(buffer_size); |
} |
void PnaclTranslateThread::EndStream() { |