| OLD | NEW |
| 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. | 1 // Copyright (c) 2012 The Chromium Authors. All rights reserved. |
| 2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
| 3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
| 4 | 4 |
| 5 #include "ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.h" | 5 #include "ppapi/native_client/src/trusted/plugin/pnacl_translate_thread.h" |
| 6 | 6 |
| 7 #include <iterator> | 7 #include <iterator> |
| 8 | 8 |
| 9 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" | 9 #include "native_client/src/trusted/desc/nacl_desc_wrapper.h" |
| 10 #include "ppapi/cpp/var.h" | 10 #include "ppapi/cpp/var.h" |
| (...skipping 93 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 104 DoTranslateThread, | 104 DoTranslateThread, |
| 105 this, | 105 this, |
| 106 kArbitraryStackSize)) { | 106 kArbitraryStackSize)) { |
| 107 TranslateFailed(PP_NACL_ERROR_PNACL_THREAD_CREATE, | 107 TranslateFailed(PP_NACL_ERROR_PNACL_THREAD_CREATE, |
| 108 "could not create thread."); | 108 "could not create thread."); |
| 109 translate_thread_.reset(NULL); | 109 translate_thread_.reset(NULL); |
| 110 } | 110 } |
| 111 } | 111 } |
| 112 | 112 |
| 113 // Called from main thread to send bytes to the translator. | 113 // Called from main thread to send bytes to the translator. |
| 114 void PnaclTranslateThread::PutBytes(std::vector<char>* bytes, | 114 void PnaclTranslateThread::PutBytes(std::vector<char>* bytes, int count) { |
| 115 int count) { | |
| 116 PLUGIN_PRINTF(("PutBytes (this=%p, bytes=%p, size=%" NACL_PRIuS | 115 PLUGIN_PRINTF(("PutBytes (this=%p, bytes=%p, size=%" NACL_PRIuS |
| 117 ", count=%d)\n", | 116 ", count=%d)\n", |
| 118 this, bytes, bytes ? bytes->size() : 0, count)); | 117 this, bytes, bytes ? bytes->size() : 0, count)); |
| 119 size_t buffer_size = 0; | 118 size_t buffer_size = 0; |
| 120 // If we are done (error or not), Signal the translation thread to stop. | |
| 121 if (count <= PP_OK) { | |
| 122 NaClXMutexLock(&cond_mu_); | |
| 123 done_ = true; | |
| 124 NaClXCondVarSignal(&buffer_cond_); | |
| 125 NaClXMutexUnlock(&cond_mu_); | |
| 126 return; | |
| 127 } | |
| 128 | |
| 129 CHECK(bytes != NULL); | 119 CHECK(bytes != NULL); |
| 130 // Ensure that the buffer we send to the translation thread is the right size | 120 // Ensure that the buffer we send to the translation thread is the right size |
| 131 // (count can be < the buffer size). This can be done without the lock. | 121 // (count can be < the buffer size). This can be done without the lock. |
| 132 buffer_size = bytes->size(); | 122 buffer_size = bytes->size(); |
| 133 bytes->resize(count); | 123 bytes->resize(count); |
| 134 | 124 |
| 135 NaClXMutexLock(&cond_mu_); | 125 NaClXMutexLock(&cond_mu_); |
| 136 | 126 |
| 137 data_buffers_.push_back(std::vector<char>()); | 127 data_buffers_.push_back(std::vector<char>()); |
| 138 bytes->swap(data_buffers_.back()); // Avoid copying the buffer data. | 128 bytes->swap(data_buffers_.back()); // Avoid copying the buffer data. |
| 139 | 129 |
| 140 NaClXCondVarSignal(&buffer_cond_); | 130 NaClXCondVarSignal(&buffer_cond_); |
| 141 NaClXMutexUnlock(&cond_mu_); | 131 NaClXMutexUnlock(&cond_mu_); |
| 142 | 132 |
| 143 // Ensure the buffer we send back to the coordinator is the expected size | 133 // Ensure the buffer we send back to the coordinator is the expected size |
| 144 bytes->resize(buffer_size); | 134 bytes->resize(buffer_size); |
| 145 } | 135 } |
| 146 | 136 |
| 137 void PnaclTranslateThread::EndStream() { |
| 138 NaClXMutexLock(&cond_mu_); |
| 139 done_ = true; |
| 140 NaClXCondVarSignal(&buffer_cond_); |
| 141 NaClXMutexUnlock(&cond_mu_); |
| 142 } |
| 143 |
| 147 void WINAPI PnaclTranslateThread::DoTranslateThread(void* arg) { | 144 void WINAPI PnaclTranslateThread::DoTranslateThread(void* arg) { |
| 148 PnaclTranslateThread* translator = | 145 PnaclTranslateThread* translator = |
| 149 reinterpret_cast<PnaclTranslateThread*>(arg); | 146 reinterpret_cast<PnaclTranslateThread*>(arg); |
| 150 translator->DoTranslate(); | 147 translator->DoTranslate(); |
| 151 } | 148 } |
| 152 | 149 |
| 153 void PnaclTranslateThread::DoTranslate() { | 150 void PnaclTranslateThread::DoTranslate() { |
| 154 ErrorInfo error_info; | 151 ErrorInfo error_info; |
| 155 SrpcParams params; | 152 SrpcParams params; |
| 156 std::vector<nacl::DescWrapper*> llc_out_files; | 153 std::vector<nacl::DescWrapper*> llc_out_files; |
| (...skipping 290 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
| 447 AbortSubprocesses(); | 444 AbortSubprocesses(); |
| 448 if (translate_thread_ != NULL) | 445 if (translate_thread_ != NULL) |
| 449 NaClThreadJoin(translate_thread_.get()); | 446 NaClThreadJoin(translate_thread_.get()); |
| 450 PLUGIN_PRINTF(("~PnaclTranslateThread joined\n")); | 447 PLUGIN_PRINTF(("~PnaclTranslateThread joined\n")); |
| 451 NaClCondVarDtor(&buffer_cond_); | 448 NaClCondVarDtor(&buffer_cond_); |
| 452 NaClMutexDtor(&cond_mu_); | 449 NaClMutexDtor(&cond_mu_); |
| 453 NaClMutexDtor(&subprocess_mu_); | 450 NaClMutexDtor(&subprocess_mu_); |
| 454 } | 451 } |
| 455 | 452 |
| 456 } // namespace plugin | 453 } // namespace plugin |
| OLD | NEW |